@ai-devkit/agent-manager 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/dist/AgentManager.d.ts +9 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +21 -2
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +151 -3
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
  8. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
  9. package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
  10. package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
  11. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
  12. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
  13. package/dist/__tests__/capacity/claude.test.js +485 -0
  14. package/dist/__tests__/capacity/claude.test.js.map +1 -0
  15. package/dist/__tests__/capacity/openai.test.js +670 -0
  16. package/dist/__tests__/capacity/openai.test.js.map +1 -0
  17. package/dist/__tests__/capacity/wham.test.js +144 -0
  18. package/dist/__tests__/capacity/wham.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  20. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  21. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  22. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  24. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  25. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
  26. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  27. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  28. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  30. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  31. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  32. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  33. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  34. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  35. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  36. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  38. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  41. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  42. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  43. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  44. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  45. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  46. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  47. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  48. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  50. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  51. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  52. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  54. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  56. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  59. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  60. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  61. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  62. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  64. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  65. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  66. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  67. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  68. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  69. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  70. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  71. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  72. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  73. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  74. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  78. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  79. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  80. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  81. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  82. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  83. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
  84. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  90. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  91. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  92. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  94. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  95. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  96. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  97. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  98. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  99. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  105. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  106. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  107. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  108. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  109. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  110. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  111. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  112. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  113. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  114. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  115. package/dist/__tests__/utils/agents.test.js +72 -2
  116. package/dist/__tests__/utils/agents.test.js.map +1 -1
  117. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  118. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  119. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  120. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  121. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  122. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  123. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  124. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  125. package/dist/__tests__/utils/process.test.js +436 -2
  126. package/dist/__tests__/utils/process.test.js.map +1 -1
  127. package/dist/adapters/AgentAdapter.d.ts +25 -6
  128. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  129. package/dist/adapters/AgentAdapter.js +12 -3
  130. package/dist/adapters/AgentAdapter.js.map +1 -1
  131. package/dist/capacity/claude.d.ts +17 -0
  132. package/dist/capacity/claude.d.ts.map +1 -0
  133. package/dist/capacity/claude.js +271 -0
  134. package/dist/capacity/claude.js.map +1 -0
  135. package/dist/capacity/codex.d.ts +1 -2
  136. package/dist/capacity/codex.d.ts.map +1 -1
  137. package/dist/capacity/codex.js +5 -47
  138. package/dist/capacity/codex.js.map +1 -1
  139. package/dist/capacity/index.d.ts +11 -0
  140. package/dist/capacity/index.d.ts.map +1 -1
  141. package/dist/capacity/index.js +17 -0
  142. package/dist/capacity/index.js.map +1 -1
  143. package/dist/capacity/openai.d.ts +47 -0
  144. package/dist/capacity/openai.d.ts.map +1 -0
  145. package/dist/capacity/openai.js +307 -0
  146. package/dist/capacity/openai.js.map +1 -0
  147. package/dist/capacity/wham.d.ts +16 -0
  148. package/dist/capacity/wham.d.ts.map +1 -0
  149. package/dist/capacity/wham.js +66 -0
  150. package/dist/capacity/wham.js.map +1 -0
  151. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  152. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  153. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  154. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  155. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  156. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  157. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  158. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  159. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  160. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  161. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  162. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  163. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  164. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  165. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  166. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  167. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  169. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  170. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  171. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  172. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  173. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  174. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  175. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  176. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  177. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  178. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  179. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  180. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  181. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  182. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  183. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  184. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  185. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  186. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  187. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  190. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  191. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  192. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  193. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  195. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  196. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  197. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  198. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  199. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  200. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  201. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  202. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  203. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  204. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  205. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  206. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  207. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  208. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  209. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  210. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  211. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  212. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  213. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  214. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  215. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  216. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  217. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  218. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  219. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  220. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  221. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  222. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  223. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  224. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  225. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  226. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  227. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  228. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  229. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  230. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  231. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  232. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  233. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  234. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  235. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  236. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  237. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  238. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  239. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  240. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  241. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  242. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  243. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  244. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  245. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  246. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  247. package/dist/harnesses/gemini/fileSignature.js +9 -0
  248. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  249. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  250. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  251. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  252. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  253. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  254. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  255. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  256. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  257. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  258. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  259. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  260. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  262. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  263. package/dist/harnesses/index.d.ts +7 -0
  264. package/dist/harnesses/index.d.ts.map +1 -0
  265. package/dist/harnesses/index.js +27 -0
  266. package/dist/harnesses/index.js.map +1 -0
  267. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  268. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  269. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  270. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  271. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  272. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  273. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  274. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  275. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  276. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  277. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  278. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  279. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  280. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  281. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  282. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  283. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  284. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  285. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  286. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  287. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  288. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  289. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  290. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  291. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  292. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  293. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  294. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  295. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  296. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  297. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  298. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  299. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  300. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  301. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  303. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  304. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  305. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  306. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  307. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  308. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  309. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  310. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  311. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  312. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  313. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  314. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  315. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  316. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  317. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  318. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  319. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  320. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  321. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  322. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  323. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  324. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  325. package/dist/harnesses/shared.d.ts +41 -0
  326. package/dist/harnesses/shared.d.ts.map +1 -0
  327. package/dist/harnesses/shared.js +71 -0
  328. package/dist/harnesses/shared.js.map +1 -0
  329. package/dist/index.d.ts +28 -25
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +19 -16
  332. package/dist/index.js.map +1 -1
  333. package/dist/readiness/AgentReadiness.d.ts +1 -1
  334. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  335. package/dist/readiness/AgentReadiness.js.map +1 -1
  336. package/dist/runtime/ManagedAgentRuntime.js +3 -1
  337. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  338. package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
  339. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  340. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  341. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  342. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  343. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  344. package/dist/utils/agents.d.ts +3 -2
  345. package/dist/utils/agents.d.ts.map +1 -1
  346. package/dist/utils/agents.js +61 -15
  347. package/dist/utils/agents.js.map +1 -1
  348. package/dist/utils/index.d.ts +2 -1
  349. package/dist/utils/index.d.ts.map +1 -1
  350. package/dist/utils/index.js +1 -1
  351. package/dist/utils/index.js.map +1 -1
  352. package/dist/utils/jsonlTail.d.ts +73 -0
  353. package/dist/utils/jsonlTail.d.ts.map +1 -0
  354. package/dist/utils/jsonlTail.js +238 -0
  355. package/dist/utils/jsonlTail.js.map +1 -0
  356. package/dist/utils/matching.d.ts +2 -0
  357. package/dist/utils/matching.d.ts.map +1 -1
  358. package/dist/utils/matching.js +3 -2
  359. package/dist/utils/matching.js.map +1 -1
  360. package/dist/utils/matchingConstants.d.ts +15 -0
  361. package/dist/utils/matchingConstants.d.ts.map +1 -0
  362. package/dist/utils/matchingConstants.js +14 -0
  363. package/dist/utils/matchingConstants.js.map +1 -0
  364. package/dist/utils/process.d.ts +38 -2
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +131 -43
  367. package/dist/utils/process.js.map +1 -1
  368. package/package.json +2 -1
  369. package/scripts/benchmark-cold-start.mjs +350 -0
  370. package/src/AgentManager.ts +26 -5
  371. package/src/__tests__/AgentManager.test.ts +141 -3
  372. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  373. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  374. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  375. package/src/__tests__/capacity/claude.test.ts +467 -0
  376. package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
  377. package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
  378. package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
  379. package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
  380. package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
  381. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
  382. package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
  383. package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
  384. package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
  385. package/src/__tests__/capacity/openai.test.ts +560 -0
  386. package/src/__tests__/capacity/wham.test.ts +104 -0
  387. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  388. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  389. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  390. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
  391. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  392. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  393. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  394. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  395. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  396. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  397. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  398. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  399. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  400. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  401. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  402. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  403. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  404. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  405. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  406. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  407. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  408. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  409. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  410. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  411. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  412. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  413. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  414. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  415. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  416. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  417. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  418. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  419. package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
  420. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  421. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  422. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  423. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  424. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  425. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  426. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  427. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  428. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  429. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  430. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  431. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  432. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  433. package/src/__tests__/utils/agents.test.ts +83 -2
  434. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  435. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  436. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  437. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  438. package/src/__tests__/utils/process.test.ts +254 -0
  439. package/src/adapters/AgentAdapter.ts +37 -12
  440. package/src/capacity/claude.ts +313 -0
  441. package/src/capacity/codex.ts +25 -134
  442. package/src/capacity/index.ts +33 -4
  443. package/src/capacity/openai.ts +355 -0
  444. package/src/capacity/wham.ts +84 -0
  445. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  446. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  447. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  448. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  449. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  450. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  451. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  452. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  453. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  454. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  455. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  456. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  457. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  458. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  459. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  460. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  461. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  462. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  463. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  464. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  465. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  466. package/src/harnesses/gemini/fileSignature.ts +10 -0
  467. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  468. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  469. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  470. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  471. package/src/harnesses/index.ts +28 -0
  472. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  473. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  474. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  475. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  476. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  477. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  478. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  479. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  480. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  481. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  482. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  483. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  484. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  485. package/src/harnesses/shared.ts +119 -0
  486. package/src/index.ts +34 -23
  487. package/src/readiness/AgentReadiness.ts +4 -1
  488. package/src/runtime/ManagedAgentRuntime.ts +2 -0
  489. package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
  490. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  491. package/src/utils/agents.ts +62 -20
  492. package/src/utils/index.ts +2 -0
  493. package/src/utils/jsonlTail.ts +349 -0
  494. package/src/utils/matching.ts +3 -3
  495. package/src/utils/matchingConstants.ts +15 -0
  496. package/src/utils/process.ts +189 -45
  497. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  498. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  499. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  500. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  501. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  502. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  503. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  504. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  505. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  506. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  507. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  508. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  509. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  510. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  511. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  512. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  513. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  514. package/dist/adapters/index.d.ts +0 -10
  515. package/dist/adapters/index.d.ts.map +0 -1
  516. package/dist/adapters/index.js +0 -10
  517. package/dist/adapters/index.js.map +0 -1
  518. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  519. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  520. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  521. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  522. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  523. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  524. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  525. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  526. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  527. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  528. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  529. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  530. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  531. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  532. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  533. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  534. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  535. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  536. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  537. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  538. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  539. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  541. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  542. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  543. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  544. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  545. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  546. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  547. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  548. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  549. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  550. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  551. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  552. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  553. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  554. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  555. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  556. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  557. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  558. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  559. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  560. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  561. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  562. package/dist/providers/grok/GrokSessionParser.js +0 -122
  563. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  564. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  565. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  566. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  567. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  568. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  569. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  570. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  571. package/dist/providers/pi/PiAdapter.js.map +0 -1
  572. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  573. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  574. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  575. package/dist/providers/pi/PiSessionLocator.js +0 -86
  576. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  577. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  578. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  579. package/dist/providers/pi/PiSessionParser.js +0 -191
  580. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  581. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  582. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  583. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  584. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  585. package/src/adapters/index.ts +0 -15
  586. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  587. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  588. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  589. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  590. package/src/providers/grok/GrokSessionParser.ts +0 -166
  591. package/src/providers/pi/PiSessionLocator.ts +0 -110
  592. package/src/providers/pi/PiSessionParser.ts +0 -284
  593. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  594. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  595. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  596. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  597. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  598. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  600. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  601. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  602. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  603. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  604. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  605. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  606. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  607. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  608. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  609. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  610. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  611. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  612. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  613. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  614. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  615. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  616. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  617. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  618. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  619. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  620. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  621. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  622. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  623. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  624. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  625. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  626. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  627. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  628. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  629. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  630. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  631. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  632. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  633. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  634. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  635. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  636. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  637. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  638. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  639. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  640. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  641. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  642. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  643. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  644. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  645. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  646. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  647. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  648. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  649. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  650. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  651. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1,88 @@
1
+ import type { ConversationMessage, ConversationOptions, SessionSummary } from "../../adapters/AgentAdapter.js";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { type JsonlSummaryBounds } from "../../utils/IncrementalJsonlSummary.js";
4
+ export interface PiSession {
5
+ sessionId: string;
6
+ projectPath: string;
7
+ summary: string;
8
+ sessionStart: Date;
9
+ lastActive: Date;
10
+ lastRole?: ConversationMessage["role"];
11
+ }
12
+ /**
13
+ * Session identity read from the start of a file, without parsing the rest.
14
+ * Fields are undefined when not found in the head.
15
+ */
16
+ export interface PiSessionHead {
17
+ sessionId?: string;
18
+ projectPath?: string;
19
+ /** Bytes read from the file. */
20
+ bytesRead: number;
21
+ /** True when the whole file fit in the head read. */
22
+ complete: boolean;
23
+ }
24
+ /** Upper bound for `readSessionHead`; Pi writes its session header as the first line. */
25
+ export declare const PI_SESSION_HEAD_MAX_BYTES: number;
26
+ export interface PiSessionParserOptions {
27
+ /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */
28
+ summaryBounds?: JsonlSummaryBounds | false;
29
+ }
30
+ export declare class PiSessionParser {
31
+ /** Incremental reader backing `getConversation({ tail })`. */
32
+ private readonly tailReader;
33
+ private readonly sessionCache;
34
+ constructor(options?: PiSessionParserOptions);
35
+ readSession(filePath: string, fallbackCwd?: string): PiSession | null;
36
+ /**
37
+ * Same result as `readSession`, but backed by a per-instance incremental
38
+ * cache so repeated refreshes only parse bytes appended since the last call.
39
+ * Call `pruneSessionCache()` once per refresh to evict files no longer read.
40
+ *
41
+ * The first read of a large transcript is a bounded head + tail scan (see
42
+ * `summaryReducer.skip`); fields whose entries lie only in the skipped
43
+ * middle fall back to their defaults instead of forcing a full parse.
44
+ */
45
+ readSessionIncremental(filePath: string, fallbackCwd?: string): PiSession | null;
46
+ /** Evict cached summaries for files not read since the previous prune. */
47
+ pruneSessionCache(): void;
48
+ /**
49
+ * Read the session id and project path from the first complete lines of a
50
+ * file, stopping once both are found or after `maxBytes`. Null if unreadable.
51
+ */
52
+ readSessionHead(filePath: string, maxBytes?: number): PiSessionHead | null;
53
+ determineStatus(session: PiSession): AgentStatus;
54
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
55
+ fileToSessionSummary(filePath: string): SessionSummary | null;
56
+ sessionIdFromFile(filePath: string): string;
57
+ /**
58
+ * Fold one JSONL entry into the O(1) session summary. Mirrors the previous
59
+ * whole-file scan: id, cwd and start come from the first entry that has
60
+ * them; last active, last user message and last role track the latest one.
61
+ *
62
+ * `skip` (bounded cold start) keeps the head's first-* fields (id, cwd,
63
+ * start, first user message) and clears the latest ones, so those come from
64
+ * the tail only. Tail entries never fill a first-* field: Pi message entries
65
+ * carry their own `id`, which must not become the session id. A first-*
66
+ * value beyond the head falls back like a missing one (filename id,
67
+ * `fallbackCwd`, file birthtime, no first user message); a latest value
68
+ * before the tail window stays unset (file mtime for last active).
69
+ */
70
+ private readonly summaryReducer;
71
+ private toSession;
72
+ private applyHeadLine;
73
+ private readJsonl;
74
+ private parseJsonlLine;
75
+ private entriesToMessages;
76
+ private entryToMessage;
77
+ private entryRole;
78
+ private entryContent;
79
+ private contentToString;
80
+ private messageRecord;
81
+ private asRecord;
82
+ private roleLikeType;
83
+ private entryTimestamp;
84
+ private entrySessionId;
85
+ private entryCwd;
86
+ private firstString;
87
+ }
88
+ //# sourceMappingURL=PiSessionParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiSessionParser.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/PiSessionParser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,wCAAwC,CAAC;AAKhD,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,QAAQ,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACxC;AAsBD;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAmBD,yFAAyF;AACzF,eAAO,MAAM,yBAAyB,QAAY,CAAC;AAGnD,MAAM,WAAW,sBAAsB;IACrC,yFAAyF;IACzF,aAAa,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CAC5C;AAED,qBAAa,eAAe;IAC1B,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0C;gBAE3D,OAAO,GAAE,sBAA2B;IAMhD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,SAAS,GAAG,IAAI;IAMjE;;;;;;;;OAQG;IACH,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,SAAK,GAAG,SAAS,GAAG,IAAI;IAK5E,0EAA0E;IAC1E,iBAAiB,IAAI,IAAI;IAIzB;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAA4B,GAAG,aAAa,GAAG,IAAI;IAgD7F,eAAe,CAAC,OAAO,EAAE,SAAS,GAAG,WAAW;IAMhD,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAmB9F,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAkB7D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAM3C;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAqC7B;IAEF,OAAO,CAAC,SAAS;IA8BjB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,WAAW;CAMpB"}
@@ -0,0 +1,318 @@
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
4
+ import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
5
+ import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
6
+ import { safeReadFile, safeStat } from "../../utils/session.js";
7
+ import { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
8
+ /** Upper bound for `readSessionHead`; Pi writes its session header as the first line. */ export const PI_SESSION_HEAD_MAX_BYTES = 64 * 1024;
9
+ const HEAD_CHUNK_BYTES = 4 * 1024;
10
+ export class PiSessionParser {
11
+ /** Incremental reader backing `getConversation({ tail })`. */ tailReader = new JsonlTailReader();
12
+ sessionCache;
13
+ constructor(options = {}){
14
+ this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {
15
+ bounds: options.summaryBounds
16
+ });
17
+ }
18
+ readSession(filePath, fallbackCwd = "") {
19
+ const content = safeReadFile(filePath);
20
+ if (content === undefined) return null;
21
+ return this.toSession(filePath, fallbackCwd, reduceJsonlContent(this.summaryReducer, content));
22
+ }
23
+ /**
24
+ * Same result as `readSession`, but backed by a per-instance incremental
25
+ * cache so repeated refreshes only parse bytes appended since the last call.
26
+ * Call `pruneSessionCache()` once per refresh to evict files no longer read.
27
+ *
28
+ * The first read of a large transcript is a bounded head + tail scan (see
29
+ * `summaryReducer.skip`); fields whose entries lie only in the skipped
30
+ * middle fall back to their defaults instead of forcing a full parse.
31
+ */ readSessionIncremental(filePath, fallbackCwd = "") {
32
+ const result = this.sessionCache.read(filePath);
33
+ return result ? this.toSession(filePath, fallbackCwd, result.state) : null;
34
+ }
35
+ /** Evict cached summaries for files not read since the previous prune. */ pruneSessionCache() {
36
+ this.sessionCache.prune();
37
+ }
38
+ /**
39
+ * Read the session id and project path from the first complete lines of a
40
+ * file, stopping once both are found or after `maxBytes`. Null if unreadable.
41
+ */ readSessionHead(filePath, maxBytes = PI_SESSION_HEAD_MAX_BYTES) {
42
+ let fd;
43
+ try {
44
+ fd = fs.openSync(filePath, "r");
45
+ } catch {
46
+ return null;
47
+ }
48
+ try {
49
+ const head = {
50
+ bytesRead: 0,
51
+ complete: false
52
+ };
53
+ const buffer = Buffer.alloc(maxBytes);
54
+ let lineStart = 0;
55
+ while(head.bytesRead < maxBytes){
56
+ const bytesRead = fs.readSync(fd, buffer, head.bytesRead, Math.min(HEAD_CHUNK_BYTES, maxBytes - head.bytesRead), head.bytesRead);
57
+ if (bytesRead === 0) {
58
+ head.complete = true;
59
+ break;
60
+ }
61
+ head.bytesRead += bytesRead;
62
+ let newline = buffer.indexOf(0x0a, lineStart);
63
+ while(newline !== -1 && newline < head.bytesRead){
64
+ this.applyHeadLine(head, buffer.toString("utf8", lineStart, newline));
65
+ lineStart = newline + 1;
66
+ if (head.sessionId && head.projectPath) return head;
67
+ newline = buffer.indexOf(0x0a, lineStart);
68
+ }
69
+ }
70
+ // The unterminated last line is only trusted when it ends the file
71
+ if (head.complete && lineStart < head.bytesRead) {
72
+ this.applyHeadLine(head, buffer.toString("utf8", lineStart, head.bytesRead));
73
+ }
74
+ return head;
75
+ } catch {
76
+ return null;
77
+ } finally{
78
+ fs.closeSync(fd);
79
+ }
80
+ }
81
+ determineStatus(session) {
82
+ if (isIdle(session.lastActive)) return AgentStatus.IDLE;
83
+ if (session.lastRole === "assistant") return AgentStatus.WAITING;
84
+ return AgentStatus.RUNNING;
85
+ }
86
+ getConversation(sessionFilePath, options) {
87
+ const includeSystem = options?.verbose ?? false;
88
+ const tail = normalizeTail(options?.tail);
89
+ if (tail !== undefined) {
90
+ return this.tailReader.read(sessionFilePath, tail, {
91
+ parseLine: (line)=>{
92
+ const entry = this.parseJsonlLine(line);
93
+ return entry ? this.entryToMessage(entry, includeSystem) : null;
94
+ }
95
+ }, String(includeSystem));
96
+ }
97
+ return this.entriesToMessages(this.readJsonl(sessionFilePath), includeSystem);
98
+ }
99
+ fileToSessionSummary(filePath) {
100
+ const content = safeReadFile(filePath);
101
+ if (content === undefined) return null;
102
+ const state = reduceJsonlContent(this.summaryReducer, content);
103
+ const session = this.toSession(filePath, "", state);
104
+ if (!session) return null;
105
+ return {
106
+ type: "pi",
107
+ sessionId: session.sessionId,
108
+ cwd: session.projectPath,
109
+ firstUserMessage: state.firstUserMessage ?? "",
110
+ lastActive: session.lastActive,
111
+ startedAt: session.sessionStart,
112
+ sessionFilePath: filePath
113
+ };
114
+ }
115
+ sessionIdFromFile(filePath) {
116
+ const base = path.basename(filePath, ".jsonl");
117
+ const underscore = base.lastIndexOf("_");
118
+ return underscore >= 0 ? base.slice(underscore + 1) : base;
119
+ }
120
+ /**
121
+ * Fold one JSONL entry into the O(1) session summary. Mirrors the previous
122
+ * whole-file scan: id, cwd and start come from the first entry that has
123
+ * them; last active, last user message and last role track the latest one.
124
+ *
125
+ * `skip` (bounded cold start) keeps the head's first-* fields (id, cwd,
126
+ * start, first user message) and clears the latest ones, so those come from
127
+ * the tail only. Tail entries never fill a first-* field: Pi message entries
128
+ * carry their own `id`, which must not become the session id. A first-*
129
+ * value beyond the head falls back like a missing one (filename id,
130
+ * `fallbackCwd`, file birthtime, no first user message); a latest value
131
+ * before the tail window stays unset (file mtime for last active).
132
+ */ summaryReducer = {
133
+ initial: ()=>({
134
+ entryCount: 0
135
+ }),
136
+ reduce: (state, value)=>{
137
+ const entry = this.asRecord(value);
138
+ if (!entry) return state;
139
+ const next = {
140
+ ...state,
141
+ entryCount: state.entryCount + 1
142
+ };
143
+ const inHead = !state.pastHead;
144
+ if (inHead) {
145
+ next.sessionId ??= this.entrySessionId(entry);
146
+ next.projectPath ??= this.entryCwd(entry);
147
+ }
148
+ const timestamp = parseTimestamp(this.entryTimestamp(entry));
149
+ if (timestamp) {
150
+ if (inHead) next.firstTimestampMs ??= timestamp.getTime();
151
+ next.lastTimestampMs = timestamp.getTime();
152
+ }
153
+ const message = this.entryToMessage(entry, true);
154
+ if (message) {
155
+ next.lastRole = message.role;
156
+ if (message.role === "user") {
157
+ next.lastUserMessage = message.content;
158
+ if (inHead) next.firstUserMessage ??= message.content;
159
+ }
160
+ }
161
+ return next;
162
+ },
163
+ skip: (state)=>({
164
+ entryCount: state.entryCount,
165
+ pastHead: true,
166
+ sessionId: state.sessionId,
167
+ projectPath: state.projectPath,
168
+ firstTimestampMs: state.firstTimestampMs,
169
+ firstUserMessage: state.firstUserMessage
170
+ })
171
+ };
172
+ toSession(filePath, fallbackCwd, state) {
173
+ if (state.entryCount === 0) return null;
174
+ const needsStat = state.firstTimestampMs === undefined || state.lastTimestampMs === undefined;
175
+ const stat = needsStat ? safeStat(filePath) : undefined;
176
+ const sessionStart = state.firstTimestampMs !== undefined ? new Date(state.firstTimestampMs) : stat?.birthtime ?? stat?.mtime ?? new Date();
177
+ const lastActive = state.lastTimestampMs !== undefined ? new Date(state.lastTimestampMs) : stat?.mtime ?? sessionStart;
178
+ return {
179
+ sessionId: state.sessionId || this.sessionIdFromFile(filePath),
180
+ projectPath: state.projectPath || fallbackCwd,
181
+ summary: state.lastUserMessage ? truncate(state.lastUserMessage, SUMMARY_MAX_LENGTH) : "Pi session active",
182
+ sessionStart,
183
+ lastActive,
184
+ lastRole: state.lastRole
185
+ };
186
+ }
187
+ applyHeadLine(head, line) {
188
+ const trimmed = line.trim();
189
+ if (!trimmed) return;
190
+ let entry;
191
+ try {
192
+ entry = this.asRecord(JSON.parse(trimmed));
193
+ } catch {
194
+ return;
195
+ }
196
+ if (!entry) return;
197
+ head.sessionId ??= this.entrySessionId(entry);
198
+ head.projectPath ??= this.entryCwd(entry);
199
+ }
200
+ readJsonl(filePath) {
201
+ const content = safeReadFile(filePath);
202
+ if (content === undefined) return [];
203
+ const entries = [];
204
+ for (const line of content.split(/\r?\n/)){
205
+ const entry = this.parseJsonlLine(line);
206
+ if (entry) entries.push(entry);
207
+ }
208
+ return entries;
209
+ }
210
+ parseJsonlLine(line) {
211
+ const trimmed = line.trim();
212
+ if (!trimmed) return null;
213
+ try {
214
+ const parsed = JSON.parse(trimmed);
215
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
216
+ return parsed;
217
+ }
218
+ } catch {
219
+ return null;
220
+ }
221
+ return null;
222
+ }
223
+ entriesToMessages(entries, includeSystem) {
224
+ return entries.map((entry)=>this.entryToMessage(entry, includeSystem)).filter((msg)=>msg !== null);
225
+ }
226
+ entryToMessage(entry, includeSystem) {
227
+ const role = this.entryRole(entry);
228
+ if (!role) return null;
229
+ if (role === "system" && !includeSystem) return null;
230
+ const content = this.entryContent(entry).trim();
231
+ if (!content) return null;
232
+ return {
233
+ role,
234
+ content,
235
+ timestamp: this.entryTimestamp(entry)
236
+ };
237
+ }
238
+ entryRole(entry) {
239
+ const message = this.messageRecord(entry);
240
+ const raw = this.firstString(entry.role, message?.role, this.roleLikeType(entry.type), entry.payload?.role, entry.payload?.type, entry.data?.role, entry.data?.type);
241
+ if (!raw) return null;
242
+ const normalized = raw.toLowerCase();
243
+ if (normalized === "user" || normalized === "human") return "user";
244
+ if (normalized === "assistant" || normalized === "ai" || normalized === "pi") return "assistant";
245
+ if (normalized === "system") return "system";
246
+ return null;
247
+ }
248
+ entryContent(entry) {
249
+ const message = this.messageRecord(entry);
250
+ const candidates = [
251
+ entry.content,
252
+ entry.text,
253
+ message?.content,
254
+ message?.text,
255
+ message?.message,
256
+ entry.message,
257
+ entry.payload?.content,
258
+ entry.payload?.text,
259
+ entry.payload?.message,
260
+ entry.data?.content,
261
+ entry.data?.text,
262
+ entry.data?.message
263
+ ];
264
+ for (const candidate of candidates){
265
+ const text = this.contentToString(candidate);
266
+ if (text) return text;
267
+ }
268
+ return "";
269
+ }
270
+ contentToString(value) {
271
+ if (typeof value === "string") return value;
272
+ if (Array.isArray(value)) {
273
+ return value.map((item)=>this.contentToString(item)).filter(Boolean).join("");
274
+ }
275
+ if (!value || typeof value !== "object") return "";
276
+ const record = value;
277
+ return this.contentToString(record.content ?? record.text ?? record.value);
278
+ }
279
+ messageRecord(entry) {
280
+ return this.asRecord(entry.message);
281
+ }
282
+ asRecord(value) {
283
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
284
+ return value;
285
+ }
286
+ roleLikeType(value) {
287
+ if (typeof value !== "string") return undefined;
288
+ const normalized = value.toLowerCase();
289
+ if ([
290
+ "user",
291
+ "human",
292
+ "assistant",
293
+ "ai",
294
+ "pi",
295
+ "system"
296
+ ].includes(normalized)) {
297
+ return value;
298
+ }
299
+ return undefined;
300
+ }
301
+ entryTimestamp(entry) {
302
+ return this.firstString(entry.timestamp, entry.payload?.timestamp, entry.data?.timestamp, entry.createdAt, entry.created_at);
303
+ }
304
+ entrySessionId(entry) {
305
+ return this.firstString(entry.sessionId, entry.session_id, entry.id, entry.payload?.sessionId, entry.payload?.session_id, entry.payload?.id, entry.data?.sessionId, entry.data?.session_id, entry.data?.id);
306
+ }
307
+ entryCwd(entry) {
308
+ return this.firstString(entry.cwd, entry.projectPath, entry.project_path, entry.payload?.cwd, entry.payload?.projectPath, entry.payload?.project_path, entry.data?.cwd, entry.data?.projectPath, entry.data?.project_path);
309
+ }
310
+ firstString(...values) {
311
+ for (const value of values){
312
+ if (typeof value === "string" && value) return value;
313
+ }
314
+ return undefined;
315
+ }
316
+ }
317
+
318
+ //# sourceMappingURL=PiSessionParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/pi/PiSessionParser.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type {\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n} from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\n\nexport interface PiSession {\n sessionId: string;\n projectPath: string;\n summary: string;\n sessionStart: Date;\n lastActive: Date;\n lastRole?: ConversationMessage[\"role\"];\n}\n\ninterface PiLine {\n timestamp?: string;\n role?: string;\n type?: string;\n content?: unknown;\n text?: unknown;\n message?: unknown;\n sessionId?: string;\n session_id?: string;\n id?: string;\n cwd?: string;\n projectPath?: string;\n project_path?: string;\n payload?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ntype PiRecord = Record<string, unknown>;\n\n/**\n * Session identity read from the start of a file, without parsing the rest.\n * Fields are undefined when not found in the head.\n */\nexport interface PiSessionHead {\n sessionId?: string;\n projectPath?: string;\n /** Bytes read from the file. */\n bytesRead: number;\n /** True when the whole file fit in the head read. */\n complete: boolean;\n}\n\n/**\n * O(1) running summary folded from session entries; `toSession` turns it into\n * a `PiSession`. Timestamps are epoch ms so cached state stays immutable.\n */\ninterface PiSummaryState {\n entryCount: number;\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n sessionId?: string;\n projectPath?: string;\n firstTimestampMs?: number;\n lastTimestampMs?: number;\n firstUserMessage?: string;\n lastUserMessage?: string;\n lastRole?: ConversationMessage[\"role\"];\n}\n\n/** Upper bound for `readSessionHead`; Pi writes its session header as the first line. */\nexport const PI_SESSION_HEAD_MAX_BYTES = 64 * 1024;\nconst HEAD_CHUNK_BYTES = 4 * 1024;\n\nexport interface PiSessionParserOptions {\n /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class PiSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly sessionCache: IncrementalJsonlSummary<PiSummaryState>;\n\n constructor(options: PiSessionParserOptions = {}) {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n readSession(filePath: string, fallbackCwd = \"\"): PiSession | null {\n const content = safeReadFile(filePath);\n if (content === undefined) return null;\n return this.toSession(filePath, fallbackCwd, reduceJsonlContent(this.summaryReducer, content));\n }\n\n /**\n * Same result as `readSession`, but backed by a per-instance incremental\n * cache so repeated refreshes only parse bytes appended since the last call.\n * Call `pruneSessionCache()` once per refresh to evict files no longer read.\n *\n * The first read of a large transcript is a bounded head + tail scan (see\n * `summaryReducer.skip`); fields whose entries lie only in the skipped\n * middle fall back to their defaults instead of forcing a full parse.\n */\n readSessionIncremental(filePath: string, fallbackCwd = \"\"): PiSession | null {\n const result = this.sessionCache.read(filePath);\n return result ? this.toSession(filePath, fallbackCwd, result.state) : null;\n }\n\n /** Evict cached summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n /**\n * Read the session id and project path from the first complete lines of a\n * file, stopping once both are found or after `maxBytes`. Null if unreadable.\n */\n readSessionHead(filePath: string, maxBytes = PI_SESSION_HEAD_MAX_BYTES): PiSessionHead | null {\n let fd: number;\n try {\n fd = fs.openSync(filePath, \"r\");\n } catch {\n return null;\n }\n\n try {\n const head: PiSessionHead = { bytesRead: 0, complete: false };\n const buffer = Buffer.alloc(maxBytes);\n let lineStart = 0;\n\n while (head.bytesRead < maxBytes) {\n const bytesRead = fs.readSync(\n fd,\n buffer,\n head.bytesRead,\n Math.min(HEAD_CHUNK_BYTES, maxBytes - head.bytesRead),\n head.bytesRead,\n );\n if (bytesRead === 0) {\n head.complete = true;\n break;\n }\n head.bytesRead += bytesRead;\n\n let newline = buffer.indexOf(0x0a, lineStart);\n while (newline !== -1 && newline < head.bytesRead) {\n this.applyHeadLine(head, buffer.toString(\"utf8\", lineStart, newline));\n lineStart = newline + 1;\n if (head.sessionId && head.projectPath) return head;\n newline = buffer.indexOf(0x0a, lineStart);\n }\n }\n\n // The unterminated last line is only trusted when it ends the file\n if (head.complete && lineStart < head.bytesRead) {\n this.applyHeadLine(head, buffer.toString(\"utf8\", lineStart, head.bytesRead));\n }\n return head;\n } catch {\n return null;\n } finally {\n fs.closeSync(fd);\n }\n }\n\n determineStatus(session: PiSession): AgentStatus {\n if (isIdle(session.lastActive)) return AgentStatus.IDLE;\n if (session.lastRole === \"assistant\") return AgentStatus.WAITING;\n return AgentStatus.RUNNING;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n const includeSystem = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n sessionFilePath,\n tail,\n {\n parseLine: (line) => {\n const entry = this.parseJsonlLine(line);\n return entry ? this.entryToMessage(entry, includeSystem) : null;\n },\n },\n String(includeSystem),\n );\n }\n return this.entriesToMessages(this.readJsonl(sessionFilePath), includeSystem);\n }\n\n fileToSessionSummary(filePath: string): SessionSummary | null {\n const content = safeReadFile(filePath);\n if (content === undefined) return null;\n\n const state = reduceJsonlContent(this.summaryReducer, content);\n const session = this.toSession(filePath, \"\", state);\n if (!session) return null;\n return {\n type: \"pi\",\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: state.firstUserMessage ?? \"\",\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: filePath,\n };\n }\n\n sessionIdFromFile(filePath: string): string {\n const base = path.basename(filePath, \".jsonl\");\n const underscore = base.lastIndexOf(\"_\");\n return underscore >= 0 ? base.slice(underscore + 1) : base;\n }\n\n /**\n * Fold one JSONL entry into the O(1) session summary. Mirrors the previous\n * whole-file scan: id, cwd and start come from the first entry that has\n * them; last active, last user message and last role track the latest one.\n *\n * `skip` (bounded cold start) keeps the head's first-* fields (id, cwd,\n * start, first user message) and clears the latest ones, so those come from\n * the tail only. Tail entries never fill a first-* field: Pi message entries\n * carry their own `id`, which must not become the session id. A first-*\n * value beyond the head falls back like a missing one (filename id,\n * `fallbackCwd`, file birthtime, no first user message); a latest value\n * before the tail window stays unset (file mtime for last active).\n */\n private readonly summaryReducer: JsonlSummaryReducer<PiSummaryState> = {\n initial: () => ({ entryCount: 0 }),\n reduce: (state, value) => {\n const entry = this.asRecord(value) as PiLine | null;\n if (!entry) return state;\n\n const next: PiSummaryState = { ...state, entryCount: state.entryCount + 1 };\n const inHead = !state.pastHead;\n if (inHead) {\n next.sessionId ??= this.entrySessionId(entry);\n next.projectPath ??= this.entryCwd(entry);\n }\n\n const timestamp = parseTimestamp(this.entryTimestamp(entry));\n if (timestamp) {\n if (inHead) next.firstTimestampMs ??= timestamp.getTime();\n next.lastTimestampMs = timestamp.getTime();\n }\n\n const message = this.entryToMessage(entry, true);\n if (message) {\n next.lastRole = message.role;\n if (message.role === \"user\") {\n next.lastUserMessage = message.content;\n if (inHead) next.firstUserMessage ??= message.content;\n }\n }\n return next;\n },\n skip: (state) => ({\n entryCount: state.entryCount,\n pastHead: true,\n sessionId: state.sessionId,\n projectPath: state.projectPath,\n firstTimestampMs: state.firstTimestampMs,\n firstUserMessage: state.firstUserMessage,\n }),\n };\n\n private toSession(\n filePath: string,\n fallbackCwd: string,\n state: PiSummaryState,\n ): PiSession | null {\n if (state.entryCount === 0) return null;\n\n const needsStat = state.firstTimestampMs === undefined || state.lastTimestampMs === undefined;\n const stat = needsStat ? safeStat(filePath) : undefined;\n const sessionStart =\n state.firstTimestampMs !== undefined\n ? new Date(state.firstTimestampMs)\n : (stat?.birthtime ?? stat?.mtime ?? new Date());\n const lastActive =\n state.lastTimestampMs !== undefined\n ? new Date(state.lastTimestampMs)\n : (stat?.mtime ?? sessionStart);\n\n return {\n sessionId: state.sessionId || this.sessionIdFromFile(filePath),\n projectPath: state.projectPath || fallbackCwd,\n summary: state.lastUserMessage\n ? truncate(state.lastUserMessage, SUMMARY_MAX_LENGTH)\n : \"Pi session active\",\n sessionStart,\n lastActive,\n lastRole: state.lastRole,\n };\n }\n\n private applyHeadLine(head: PiSessionHead, line: string): void {\n const trimmed = line.trim();\n if (!trimmed) return;\n let entry: PiLine | null;\n try {\n entry = this.asRecord(JSON.parse(trimmed)) as PiLine | null;\n } catch {\n return;\n }\n if (!entry) return;\n head.sessionId ??= this.entrySessionId(entry);\n head.projectPath ??= this.entryCwd(entry);\n }\n\n private readJsonl(filePath: string): PiLine[] {\n const content = safeReadFile(filePath);\n if (content === undefined) return [];\n\n const entries: PiLine[] = [];\n for (const line of content.split(/\\r?\\n/)) {\n const entry = this.parseJsonlLine(line);\n if (entry) entries.push(entry);\n }\n return entries;\n }\n\n private parseJsonlLine(line: string): PiLine | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as PiLine;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n private entriesToMessages(entries: PiLine[], includeSystem: boolean): ConversationMessage[] {\n return entries\n .map((entry) => this.entryToMessage(entry, includeSystem))\n .filter((msg): msg is ConversationMessage => msg !== null);\n }\n\n private entryToMessage(entry: PiLine, includeSystem: boolean): ConversationMessage | null {\n const role = this.entryRole(entry);\n if (!role) return null;\n if (role === \"system\" && !includeSystem) return null;\n\n const content = this.entryContent(entry).trim();\n if (!content) return null;\n\n return {\n role,\n content,\n timestamp: this.entryTimestamp(entry),\n };\n }\n\n private entryRole(entry: PiLine): ConversationMessage[\"role\"] | null {\n const message = this.messageRecord(entry);\n const raw = this.firstString(\n entry.role,\n message?.role,\n this.roleLikeType(entry.type),\n entry.payload?.role,\n entry.payload?.type,\n entry.data?.role,\n entry.data?.type,\n );\n if (!raw) return null;\n const normalized = raw.toLowerCase();\n if (normalized === \"user\" || normalized === \"human\") return \"user\";\n if (normalized === \"assistant\" || normalized === \"ai\" || normalized === \"pi\")\n return \"assistant\";\n if (normalized === \"system\") return \"system\";\n return null;\n }\n\n private entryContent(entry: PiLine): string {\n const message = this.messageRecord(entry);\n const candidates = [\n entry.content,\n entry.text,\n message?.content,\n message?.text,\n message?.message,\n entry.message,\n entry.payload?.content,\n entry.payload?.text,\n entry.payload?.message,\n entry.data?.content,\n entry.data?.text,\n entry.data?.message,\n ];\n\n for (const candidate of candidates) {\n const text = this.contentToString(candidate);\n if (text) return text;\n }\n return \"\";\n }\n\n private contentToString(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n return value\n .map((item) => this.contentToString(item))\n .filter(Boolean)\n .join(\"\");\n }\n if (!value || typeof value !== \"object\") return \"\";\n\n const record = value as Record<string, unknown>;\n return this.contentToString(record.content ?? record.text ?? record.value);\n }\n\n private messageRecord(entry: PiLine): PiRecord | null {\n return this.asRecord(entry.message);\n }\n\n private asRecord(value: unknown): PiRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as PiRecord;\n }\n\n private roleLikeType(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.toLowerCase();\n if ([\"user\", \"human\", \"assistant\", \"ai\", \"pi\", \"system\"].includes(normalized)) {\n return value;\n }\n return undefined;\n }\n\n private entryTimestamp(entry: PiLine): string | undefined {\n return this.firstString(\n entry.timestamp,\n entry.payload?.timestamp,\n entry.data?.timestamp,\n entry.createdAt,\n entry.created_at,\n );\n }\n\n private entrySessionId(entry: PiLine): string | undefined {\n return this.firstString(\n entry.sessionId,\n entry.session_id,\n entry.id,\n entry.payload?.sessionId,\n entry.payload?.session_id,\n entry.payload?.id,\n entry.data?.sessionId,\n entry.data?.session_id,\n entry.data?.id,\n );\n }\n\n private entryCwd(entry: PiLine): string | undefined {\n return this.firstString(\n entry.cwd,\n entry.projectPath,\n entry.project_path,\n entry.payload?.cwd,\n entry.payload?.projectPath,\n entry.payload?.project_path,\n entry.data?.cwd,\n entry.data?.projectPath,\n entry.data?.project_path,\n );\n }\n\n private firstString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value) return value;\n }\n return undefined;\n }\n}\n"],"names":["fs","path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","safeReadFile","safeStat","isIdle","parseTimestamp","SUMMARY_MAX_LENGTH","truncate","PI_SESSION_HEAD_MAX_BYTES","HEAD_CHUNK_BYTES","PiSessionParser","tailReader","sessionCache","options","summaryReducer","bounds","summaryBounds","readSession","filePath","fallbackCwd","content","undefined","toSession","readSessionIncremental","result","read","state","pruneSessionCache","prune","readSessionHead","maxBytes","fd","openSync","head","bytesRead","complete","buffer","Buffer","alloc","lineStart","readSync","Math","min","newline","indexOf","applyHeadLine","toString","sessionId","projectPath","closeSync","determineStatus","session","lastActive","IDLE","lastRole","WAITING","RUNNING","getConversation","sessionFilePath","includeSystem","verbose","tail","parseLine","line","entry","parseJsonlLine","entryToMessage","String","entriesToMessages","readJsonl","fileToSessionSummary","type","cwd","firstUserMessage","startedAt","sessionStart","sessionIdFromFile","base","basename","underscore","lastIndexOf","slice","initial","entryCount","reduce","value","asRecord","next","inHead","pastHead","entrySessionId","entryCwd","timestamp","entryTimestamp","firstTimestampMs","getTime","lastTimestampMs","message","role","lastUserMessage","skip","needsStat","stat","Date","birthtime","mtime","summary","trimmed","trim","JSON","parse","entries","split","push","parsed","Array","isArray","map","filter","msg","entryRole","entryContent","messageRecord","raw","firstString","roleLikeType","payload","data","normalized","toLowerCase","candidates","text","candidate","contentToString","item","Boolean","join","record","includes","createdAt","created_at","session_id","id","project_path","values"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PiSessionTracker.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/PiSessionTracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,uBAA4B;IAOjD,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,oBAAoB;IAoBrD,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,oBAAoB;CAK7B"}
1
+ {"version":3,"file":"PiSessionTracker.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/PiSessionTracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,uBAA4B;IAMjD,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,oBAAoB;IAoBrD,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,oBAAoB;CAK7B"}
@@ -1,12 +1,12 @@
1
1
  import * as fs from "fs";
2
2
  import * as path from "path";
3
3
  import { safeReadFile } from "../../utils/session.js";
4
+ import { homeDir } from "../shared.js";
4
5
  export class PiSessionTracker {
5
6
  sessionsDir;
6
7
  trackerPath;
7
8
  constructor(options = {}){
8
- const homeDir = process.env.HOME || process.env.USERPROFILE || "";
9
- const agentDir = path.join(homeDir, ".pi", "agent");
9
+ const agentDir = path.join(homeDir(), ".pi", "agent");
10
10
  this.sessionsDir = options.sessionsDir ?? path.join(agentDir, "sessions");
11
11
  this.trackerPath = options.trackerPath ?? path.join(agentDir, "sessions.json");
12
12
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/pi/PiSessionTracker.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { safeReadFile } from \"../../utils/session.js\";\nimport { homeDir } from \"../shared.js\";\n\nexport interface PiTrackerMatch {\n process: ProcessInfo;\n filePath: string;\n}\n\nexport interface PiTrackerMatchResult {\n matches: PiTrackerMatch[];\n fallback: ProcessInfo[];\n}\n\nexport interface PiSessionTrackerOptions {\n sessionsDir?: string;\n trackerPath?: string;\n}\n\nexport class PiSessionTracker {\n private readonly sessionsDir: string;\n private readonly trackerPath: string;\n\n constructor(options: PiSessionTrackerOptions = {}) {\n const agentDir = path.join(homeDir(), \".pi\", \"agent\");\n this.sessionsDir = options.sessionsDir ?? path.join(agentDir, \"sessions\");\n this.trackerPath = options.trackerPath ?? path.join(agentDir, \"sessions.json\");\n }\n\n match(processes: ProcessInfo[]): PiTrackerMatchResult {\n const tracker = this.readTracker();\n if (tracker.size === 0) return { matches: [], fallback: processes };\n\n const matches: PiTrackerMatch[] = [];\n const fallback: ProcessInfo[] = [];\n\n for (const processInfo of processes) {\n const filePath = tracker.get(processInfo.pid);\n if (!filePath || !this.isTrustedSessionPath(filePath) || !fs.existsSync(filePath)) {\n fallback.push(processInfo);\n continue;\n }\n\n matches.push({ process: processInfo, filePath });\n }\n\n return { matches, fallback };\n }\n\n private readTracker(): Map<number, string> {\n const content = safeReadFile(this.trackerPath);\n if (content === undefined) return new Map();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return new Map();\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return new Map();\n\n const map = new Map<number, string>();\n for (const [key, value] of Object.entries(parsed)) {\n const keyPid = this.toPid(key);\n if (keyPid !== null && typeof value === \"string\" && value) {\n map.set(keyPid, value);\n }\n }\n return map;\n }\n\n private toPid(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isInteger(value) && value > 0) return value;\n if (typeof value !== \"string\" || !/^\\d+$/.test(value)) return null;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;\n }\n\n private isTrustedSessionPath(filePath: string): boolean {\n const resolvedRoot = path.resolve(this.sessionsDir);\n const resolvedPath = path.resolve(filePath);\n return resolvedPath === resolvedRoot || resolvedPath.startsWith(`${resolvedRoot}${path.sep}`);\n }\n}\n"],"names":["fs","path","safeReadFile","homeDir","PiSessionTracker","sessionsDir","trackerPath","options","agentDir","join","match","processes","tracker","readTracker","size","matches","fallback","processInfo","filePath","get","pid","isTrustedSessionPath","existsSync","push","process","content","undefined","Map","parsed","JSON","parse","Array","isArray","map","key","value","Object","entries","keyPid","toPid","set","Number","isInteger","test","isSafeInteger","resolvedRoot","resolve","resolvedPath","startsWith","sep"],"mappings":"AAAA,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,OAAO,QAAQ,eAAe;AAiBvC,OAAO,MAAMC;IACMC,YAAoB;IACpBC,YAAoB;IAErC,YAAYC,UAAmC,CAAC,CAAC,CAAE;QACjD,MAAMC,WAAWP,KAAKQ,IAAI,CAACN,WAAW,OAAO;QAC7C,IAAI,CAACE,WAAW,GAAGE,QAAQF,WAAW,IAAIJ,KAAKQ,IAAI,CAACD,UAAU;QAC9D,IAAI,CAACF,WAAW,GAAGC,QAAQD,WAAW,IAAIL,KAAKQ,IAAI,CAACD,UAAU;IAChE;IAEAE,MAAMC,SAAwB,EAAwB;QACpD,MAAMC,UAAU,IAAI,CAACC,WAAW;QAChC,IAAID,QAAQE,IAAI,KAAK,GAAG,OAAO;YAAEC,SAAS,EAAE;YAAEC,UAAUL;QAAU;QAElE,MAAMI,UAA4B,EAAE;QACpC,MAAMC,WAA0B,EAAE;QAElC,KAAK,MAAMC,eAAeN,UAAW;YACnC,MAAMO,WAAWN,QAAQO,GAAG,CAACF,YAAYG,GAAG;YAC5C,IAAI,CAACF,YAAY,CAAC,IAAI,CAACG,oBAAoB,CAACH,aAAa,CAAClB,GAAGsB,UAAU,CAACJ,WAAW;gBACjFF,SAASO,IAAI,CAACN;gBACd;YACF;YAEAF,QAAQQ,IAAI,CAAC;gBAAEC,SAASP;gBAAaC;YAAS;QAChD;QAEA,OAAO;YAAEH;YAASC;QAAS;IAC7B;IAEQH,cAAmC;QACzC,MAAMY,UAAUvB,aAAa,IAAI,CAACI,WAAW;QAC7C,IAAImB,YAAYC,WAAW,OAAO,IAAIC;QAEtC,IAAIC;QACJ,IAAI;YACFA,SAASC,KAAKC,KAAK,CAACL;QACtB,EAAE,OAAM;YACN,OAAO,IAAIE;QACb;QAEA,IAAI,CAACC,UAAU,OAAOA,WAAW,YAAYG,MAAMC,OAAO,CAACJ,SAAS,OAAO,IAAID;QAE/E,MAAMM,MAAM,IAAIN;QAChB,KAAK,MAAM,CAACO,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACT,QAAS;YACjD,MAAMU,SAAS,IAAI,CAACC,KAAK,CAACL;YAC1B,IAAII,WAAW,QAAQ,OAAOH,UAAU,YAAYA,OAAO;gBACzDF,IAAIO,GAAG,CAACF,QAAQH;YAClB;QACF;QACA,OAAOF;IACT;IAEQM,MAAMJ,KAAc,EAAiB;QAC3C,IAAI,OAAOA,UAAU,YAAYM,OAAOC,SAAS,CAACP,UAAUA,QAAQ,GAAG,OAAOA;QAC9E,IAAI,OAAOA,UAAU,YAAY,CAAC,QAAQQ,IAAI,CAACR,QAAQ,OAAO;QAC9D,MAAMP,SAASa,OAAON;QACtB,OAAOM,OAAOG,aAAa,CAAChB,WAAWA,SAAS,IAAIA,SAAS;IAC/D;IAEQP,qBAAqBH,QAAgB,EAAW;QACtD,MAAM2B,eAAe5C,KAAK6C,OAAO,CAAC,IAAI,CAACzC,WAAW;QAClD,MAAM0C,eAAe9C,KAAK6C,OAAO,CAAC5B;QAClC,OAAO6B,iBAAiBF,gBAAgBE,aAAaC,UAAU,CAAC,GAAGH,eAAe5C,KAAKgD,GAAG,EAAE;IAC9F;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"PiCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIlE,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,iBAAsB;IAarC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnE"}
1
+ {"version":3,"file":"PiCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/pi/durable/PiCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIlE,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,iBAAsB;IAarC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/pi/durable/PiCliProbe.ts"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { sanitizeText } from \"../../../durable/utils.js\";\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\nconst execFileAsync = promisify(execFile);\nconst REQUIRED = [\"--mode\", \"json\", \"--session-id\", \"--session\"];\n\nexport interface PiCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class PiCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: PiCliProbeOptions = {}) {\n this.executable = options.executable ?? \"pi\";\n this.exec =\n options.exec ??\n (async (file, args) => {\n const result = await execFileAsync(file, args, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const version = await this.exec(this.executable, [\"--version\"]);\n const help = await this.exec(this.executable, [\"--help\"]);\n const missing = REQUIRED.filter((capability) => !help.stdout.includes(capability));\n if (missing.length > 0) {\n throw new PiPrintError(\n `Pi CLI does not support required print-mode capabilities: ${missing.join(\", \")}.`,\n \"PI_CLI_UNSUPPORTED\",\n );\n }\n return {\n executable: this.executable,\n version: sanitizeText(version.stdout, 256) || \"unknown\",\n };\n } catch (error) {\n if (error instanceof PiPrintError) throw error;\n throw new PiPrintError(\n `Pi CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n \"PI_CLI_UNAVAILABLE\",\n );\n }\n }\n}\n"],"names":["execFile","promisify","PiPrintError","sanitizeText","execFileAsync","REQUIRED","PiCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","version","help","missing","filter","capability","includes","length","join","error","message"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,YAAY,QAAQ,mCAAmC;AAChE,SAASC,YAAY,QAAQ,4BAA4B;AAIzD,MAAMC,gBAAgBH,UAAUD;AAChC,MAAMK,WAAW;IAAC;IAAU;IAAQ;IAAgB;CAAY;AAOhE,OAAO,MAAMC;IACMC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAA6B,CAAC,CAAC,CAAE;QAC3C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GACPC,QAAQD,IAAI,IACX,CAAA,OAAOE,MAAMC;YACZ,MAAMC,SAAS,MAAMR,cAAcM,MAAMC,MAAM;gBAC7CE,UAAU;gBACVC,WAAW,OAAO;YACpB;YACA,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QACxD,CAAA;IACJ;IAEA,MAAMC,WAA6D;QACjE,IAAI;YACF,MAAMC,UAAU,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YAC9D,MAAMY,OAAO,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAS;YACxD,MAAMa,UAAUf,SAASgB,MAAM,CAAC,CAACC,aAAe,CAACH,KAAKJ,MAAM,CAACQ,QAAQ,CAACD;YACtE,IAAIF,QAAQI,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAItB,aACR,CAAC,0DAA0D,EAAEkB,QAAQK,IAAI,CAAC,MAAM,CAAC,CAAC,EAClF;YAEJ;YACA,OAAO;gBACLlB,YAAY,IAAI,CAACA,UAAU;gBAC3BW,SAASf,aAAae,QAAQH,MAAM,EAAE,QAAQ;YAChD;QACF,EAAE,OAAOW,OAAO;YACd,IAAIA,iBAAiBxB,cAAc,MAAMwB;YACzC,MAAM,IAAIxB,aACR,CAAC,0BAA0B,EAAEC,aAAa,AAACuB,MAAgBC,OAAO,EAAE,MAAM,EAC1E;QAEJ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../../src/harnesses/pi/durable/PiCliProbe.ts"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { sanitizeText } from \"../../../durable/utils.js\";\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\nconst execFileAsync = promisify(execFile);\nconst REQUIRED = [\"--mode\", \"json\", \"--session-id\", \"--session\"];\n\nexport interface PiCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class PiCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: PiCliProbeOptions = {}) {\n this.executable = options.executable ?? \"pi\";\n this.exec =\n options.exec ??\n (async (file, args) => {\n const result = await execFileAsync(file, args, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const version = await this.exec(this.executable, [\"--version\"]);\n const help = await this.exec(this.executable, [\"--help\"]);\n const missing = REQUIRED.filter((capability) => !help.stdout.includes(capability));\n if (missing.length > 0) {\n throw new PiPrintError(\n `Pi CLI does not support required print-mode capabilities: ${missing.join(\", \")}.`,\n \"PI_CLI_UNSUPPORTED\",\n );\n }\n return {\n executable: this.executable,\n version: sanitizeText(version.stdout, 256) || \"unknown\",\n };\n } catch (error) {\n if (error instanceof PiPrintError) throw error;\n throw new PiPrintError(\n `Pi CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n \"PI_CLI_UNAVAILABLE\",\n );\n }\n }\n}\n"],"names":["execFile","promisify","PiPrintError","sanitizeText","execFileAsync","REQUIRED","PiCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","version","help","missing","filter","capability","includes","length","join","error","message"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,YAAY,QAAQ,mCAAmC;AAChE,SAASC,YAAY,QAAQ,4BAA4B;AAIzD,MAAMC,gBAAgBH,UAAUD;AAChC,MAAMK,WAAW;IAAC;IAAU;IAAQ;IAAgB;CAAY;AAOhE,OAAO,MAAMC;IACMC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAA6B,CAAC,CAAC,CAAE;QAC3C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GACPC,QAAQD,IAAI,IACX,CAAA,OAAOE,MAAMC;YACZ,MAAMC,SAAS,MAAMR,cAAcM,MAAMC,MAAM;gBAC7CE,UAAU;gBACVC,WAAW,OAAO;YACpB;YACA,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QACxD,CAAA;IACJ;IAEA,MAAMC,WAA6D;QACjE,IAAI;YACF,MAAMC,UAAU,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YAC9D,MAAMY,OAAO,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAS;YACxD,MAAMa,UAAUf,SAASgB,MAAM,CAAC,CAACC,aAAe,CAACH,KAAKJ,MAAM,CAACQ,QAAQ,CAACD;YACtE,IAAIF,QAAQI,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAItB,aACR,CAAC,0DAA0D,EAAEkB,QAAQK,IAAI,CAAC,MAAM,CAAC,CAAC,EAClF;YAEJ;YACA,OAAO;gBACLlB,YAAY,IAAI,CAACA,UAAU;gBAC3BW,SAASf,aAAae,QAAQH,MAAM,EAAE,QAAQ;YAChD;QACF,EAAE,OAAOW,OAAO;YACd,IAAIA,iBAAiBxB,cAAc,MAAMwB;YACzC,MAAM,IAAIxB,aACR,CAAC,0BAA0B,EAAEC,aAAa,AAACuB,MAAgBC,OAAO,EAAE,MAAM,EAC1E;QAEJ;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"PiPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACnD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5F;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,UAAU,UAAU;IAClB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,0BAA+B;IAO9C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAK/E,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuB1E"}
1
+ {"version":3,"file":"PiPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/pi/durable/PiPrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACnD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5F;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,UAAU,UAAU;IAClB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,0BAA+B;IAO9C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAK/E,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuB1E"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { PiCliProbe } from \"./PiCliProbe.js\";\nimport { PiPrintRunner, type PiPrintRunResult } from \"./PiPrintRunner.js\";\nimport {\n DurableAgentRepository,\n type CreateDurableAgentInput,\n} from \"../../../durable/DurableAgentRepository.js\";\nimport { runDurableAgent, type DurableRunRepository } from \"../../../durable/run.js\";\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n}\n\ninterface ProbeLike {\n validate(): Promise<{ executable: string; version: string }>;\n}\ninterface RunnerLike {\n run(request: Parameters<PiPrintRunner[\"run\"]>[0]): Promise<PiPrintRunResult>;\n}\n\nexport interface PiPrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface PiPrintSendResult extends PiPrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class PiPrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: PiPrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new PiCliProbe();\n this.runner = options.runner ?? new PiPrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: Omit<CreateDurableAgentInput, \"provider\">): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create({ ...input, provider: \"pi\" });\n }\n\n async send(reference: string, prompt: string): Promise<PiPrintSendResult> {\n const completed = await runDurableAgent({\n reference,\n provider: \"pi\",\n repository: this.repository,\n ambiguousError: () => new PiPrintError(\"Multiple print agents match.\", \"PI_UNSUPPORTED\"),\n providerError: () => new PiPrintError(\"Print agent provider is not Pi.\", \"PI_UNSUPPORTED\"),\n execute: (agent, token) =>\n this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n }),\n isSessionMismatch: (error) =>\n error instanceof PiPrintError && error.code === \"PI_SESSION_MISMATCH\",\n });\n return {\n ...completed.result,\n agentId: completed.agent.id,\n agentName: completed.agent.name,\n };\n }\n}\n"],"names":["PiPrintError","PiCliProbe","PiPrintRunner","DurableAgentRepository","runDurableAgent","PiPrintAgentService","repository","probe","runner","executable","options","create","input","validate","provider","send","reference","prompt","completed","ambiguousError","providerError","execute","agent","token","run","onSpawn","identity","recordProviderProcess","id","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAA+B,qBAAqB;AAC1E,SACEC,sBAAsB,QAEjB,6CAA6C;AACpD,SAASC,eAAe,QAAmC,0BAA0B;AA2BrF,OAAO,MAAMC;IACFC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAAsC,CAAC,CAAC,CAAE;QACpD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACtC;IAEA,MAAME,OAAOC,KAAgD,EAAyB;QACpF,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAAC;YAAE,GAAGC,KAAK;YAAEE,UAAU;QAAK;IAC3D;IAEA,MAAMC,KAAKC,SAAiB,EAAEC,MAAc,EAA8B;QACxE,MAAMC,YAAY,MAAMd,gBAAgB;YACtCY;YACAF,UAAU;YACVR,YAAY,IAAI,CAACA,UAAU;YAC3Ba,gBAAgB,IAAM,IAAInB,aAAa,gCAAgC;YACvEoB,eAAe,IAAM,IAAIpB,aAAa,mCAAmC;YACzEqB,SAAS,CAACC,OAAOC,QACf,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACdF;oBACAL;oBACAR,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,SAAS,CAACC,WAAa,IAAI,CAACpB,UAAU,CAACqB,qBAAqB,CAACL,MAAMM,EAAE,EAAEL,OAAOG;gBAChF;YACFG,mBAAmB,CAACC,QAClBA,iBAAiB9B,gBAAgB8B,MAAMC,IAAI,KAAK;QACpD;QACA,OAAO;YACL,GAAGb,UAAUc,MAAM;YACnBC,SAASf,UAAUI,KAAK,CAACM,EAAE;YAC3BM,WAAWhB,UAAUI,KAAK,CAACa,IAAI;QACjC;IACF;AACF"}
1
+ {"version":3,"sources":["../../../../src/harnesses/pi/durable/PiPrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { PiCliProbe } from \"./PiCliProbe.js\";\nimport { PiPrintRunner, type PiPrintRunResult } from \"./PiPrintRunner.js\";\nimport {\n DurableAgentRepository,\n type CreateDurableAgentInput,\n} from \"../../../durable/DurableAgentRepository.js\";\nimport { runDurableAgent, type DurableRunRepository } from \"../../../durable/run.js\";\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n}\n\ninterface ProbeLike {\n validate(): Promise<{ executable: string; version: string }>;\n}\ninterface RunnerLike {\n run(request: Parameters<PiPrintRunner[\"run\"]>[0]): Promise<PiPrintRunResult>;\n}\n\nexport interface PiPrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface PiPrintSendResult extends PiPrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class PiPrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: PiPrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new PiCliProbe();\n this.runner = options.runner ?? new PiPrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: Omit<CreateDurableAgentInput, \"provider\">): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create({ ...input, provider: \"pi\" });\n }\n\n async send(reference: string, prompt: string): Promise<PiPrintSendResult> {\n const completed = await runDurableAgent({\n reference,\n provider: \"pi\",\n repository: this.repository,\n ambiguousError: () => new PiPrintError(\"Multiple print agents match.\", \"PI_UNSUPPORTED\"),\n providerError: () => new PiPrintError(\"Print agent provider is not Pi.\", \"PI_UNSUPPORTED\"),\n execute: (agent, token) =>\n this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n }),\n isSessionMismatch: (error) =>\n error instanceof PiPrintError && error.code === \"PI_SESSION_MISMATCH\",\n });\n return {\n ...completed.result,\n agentId: completed.agent.id,\n agentName: completed.agent.name,\n };\n }\n}\n"],"names":["PiPrintError","PiCliProbe","PiPrintRunner","DurableAgentRepository","runDurableAgent","PiPrintAgentService","repository","probe","runner","executable","options","create","input","validate","provider","send","reference","prompt","completed","ambiguousError","providerError","execute","agent","token","run","onSpawn","identity","recordProviderProcess","id","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAA+B,qBAAqB;AAC1E,SACEC,sBAAsB,QAEjB,6CAA6C;AACpD,SAASC,eAAe,QAAmC,0BAA0B;AA2BrF,OAAO,MAAMC;IACFC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAAsC,CAAC,CAAC,CAAE;QACpD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACtC;IAEA,MAAME,OAAOC,KAAgD,EAAyB;QACpF,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAAC;YAAE,GAAGC,KAAK;YAAEE,UAAU;QAAK;IAC3D;IAEA,MAAMC,KAAKC,SAAiB,EAAEC,MAAc,EAA8B;QACxE,MAAMC,YAAY,MAAMd,gBAAgB;YACtCY;YACAF,UAAU;YACVR,YAAY,IAAI,CAACA,UAAU;YAC3Ba,gBAAgB,IAAM,IAAInB,aAAa,gCAAgC;YACvEoB,eAAe,IAAM,IAAIpB,aAAa,mCAAmC;YACzEqB,SAAS,CAACC,OAAOC,QACf,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACdF;oBACAL;oBACAR,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,SAAS,CAACC,WAAa,IAAI,CAACpB,UAAU,CAACqB,qBAAqB,CAACL,MAAMM,EAAE,EAAEL,OAAOG;gBAChF;YACFG,mBAAmB,CAACC,QAClBA,iBAAiB9B,gBAAgB8B,MAAMC,IAAI,KAAK;QACpD;QACA,OAAO;YACL,GAAGb,UAAUc,MAAM;YACnBC,SAASf,UAAUI,KAAK,CAACM,EAAE;YAC3BM,WAAWhB,UAAUI,KAAK,CAACa,IAAI;QACjC;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"PiPrintProtocol.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintProtocol.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAIvF;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,iBAAiB,EAAE,MAAM,GACxB,MAAM,CASR;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAgBjF"}
1
+ {"version":3,"file":"PiPrintProtocol.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/pi/durable/PiPrintProtocol.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAIvF;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,iBAAiB,EAAE,MAAM,GACxB,MAAM,CASR;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAgBjF"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintProtocol.ts"],"sourcesContent":["import { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { isUuid } from \"../../../durable/utils.js\";\n\nexport function buildPiPrintArgs(providerSessionId: string, firstRun: boolean): string[] {\n return firstRun\n ? [\"--mode\", \"json\", \"--session-id\", providerSessionId]\n : [\"--mode\", \"json\", \"--session\", providerSessionId];\n}\n\nexport function readPiSessionId(\n event: Record<string, unknown>,\n currentSessionId: string | null,\n expectedSessionId: string,\n): string {\n if (currentSessionId !== null || typeof event.id !== \"string\" || !isUuid(event.id)) {\n throw new PiPrintError(\"Pi emitted an invalid session identity.\", \"PI_PROTOCOL\");\n }\n const sessionId = event.id;\n if (expectedSessionId !== sessionId) {\n throw new PiPrintError(\"Pi returned a different session identity.\", \"PI_SESSION_MISMATCH\");\n }\n return sessionId;\n}\n\nexport function readPiAssistantText(event: Record<string, unknown>): string | null {\n if (event.type !== \"message_end\") return null;\n const message = event.message;\n if (!message || typeof message !== \"object\" || Array.isArray(message)) return null;\n const record = message as Record<string, unknown>;\n if (record.role !== \"assistant\") return null;\n if (typeof record.content === \"string\") return record.content.trim() ? record.content : null;\n if (!Array.isArray(record.content)) return null;\n const text = record.content\n .flatMap((part) => {\n if (!part || typeof part !== \"object\" || Array.isArray(part)) return [];\n const block = part as Record<string, unknown>;\n return block.type === \"text\" && typeof block.text === \"string\" ? [block.text] : [];\n })\n .join(\"\");\n return text.trim() ? text : null;\n}\n"],"names":["PiPrintError","isUuid","buildPiPrintArgs","providerSessionId","firstRun","readPiSessionId","event","currentSessionId","expectedSessionId","id","sessionId","readPiAssistantText","type","message","Array","isArray","record","role","content","trim","text","flatMap","part","block","join"],"mappings":"AAAA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,OAAO,SAASC,iBAAiBC,iBAAyB,EAAEC,QAAiB;IAC3E,OAAOA,WACH;QAAC;QAAU;QAAQ;QAAgBD;KAAkB,GACrD;QAAC;QAAU;QAAQ;QAAaA;KAAkB;AACxD;AAEA,OAAO,SAASE,gBACdC,KAA8B,EAC9BC,gBAA+B,EAC/BC,iBAAyB;IAEzB,IAAID,qBAAqB,QAAQ,OAAOD,MAAMG,EAAE,KAAK,YAAY,CAACR,OAAOK,MAAMG,EAAE,GAAG;QAClF,MAAM,IAAIT,aAAa,2CAA2C;IACpE;IACA,MAAMU,YAAYJ,MAAMG,EAAE;IAC1B,IAAID,sBAAsBE,WAAW;QACnC,MAAM,IAAIV,aAAa,6CAA6C;IACtE;IACA,OAAOU;AACT;AAEA,OAAO,SAASC,oBAAoBL,KAA8B;IAChE,IAAIA,MAAMM,IAAI,KAAK,eAAe,OAAO;IACzC,MAAMC,UAAUP,MAAMO,OAAO;IAC7B,IAAI,CAACA,WAAW,OAAOA,YAAY,YAAYC,MAAMC,OAAO,CAACF,UAAU,OAAO;IAC9E,MAAMG,SAASH;IACf,IAAIG,OAAOC,IAAI,KAAK,aAAa,OAAO;IACxC,IAAI,OAAOD,OAAOE,OAAO,KAAK,UAAU,OAAOF,OAAOE,OAAO,CAACC,IAAI,KAAKH,OAAOE,OAAO,GAAG;IACxF,IAAI,CAACJ,MAAMC,OAAO,CAACC,OAAOE,OAAO,GAAG,OAAO;IAC3C,MAAME,OAAOJ,OAAOE,OAAO,CACxBG,OAAO,CAAC,CAACC;QACR,IAAI,CAACA,QAAQ,OAAOA,SAAS,YAAYR,MAAMC,OAAO,CAACO,OAAO,OAAO,EAAE;QACvE,MAAMC,QAAQD;QACd,OAAOC,MAAMX,IAAI,KAAK,UAAU,OAAOW,MAAMH,IAAI,KAAK,WAAW;YAACG,MAAMH,IAAI;SAAC,GAAG,EAAE;IACpF,GACCI,IAAI,CAAC;IACR,OAAOJ,KAAKD,IAAI,KAAKC,OAAO;AAC9B"}
1
+ {"version":3,"sources":["../../../../src/harnesses/pi/durable/PiPrintProtocol.ts"],"sourcesContent":["import { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { isUuid } from \"../../../durable/utils.js\";\n\nexport function buildPiPrintArgs(providerSessionId: string, firstRun: boolean): string[] {\n return firstRun\n ? [\"--mode\", \"json\", \"--session-id\", providerSessionId]\n : [\"--mode\", \"json\", \"--session\", providerSessionId];\n}\n\nexport function readPiSessionId(\n event: Record<string, unknown>,\n currentSessionId: string | null,\n expectedSessionId: string,\n): string {\n if (currentSessionId !== null || typeof event.id !== \"string\" || !isUuid(event.id)) {\n throw new PiPrintError(\"Pi emitted an invalid session identity.\", \"PI_PROTOCOL\");\n }\n const sessionId = event.id;\n if (expectedSessionId !== sessionId) {\n throw new PiPrintError(\"Pi returned a different session identity.\", \"PI_SESSION_MISMATCH\");\n }\n return sessionId;\n}\n\nexport function readPiAssistantText(event: Record<string, unknown>): string | null {\n if (event.type !== \"message_end\") return null;\n const message = event.message;\n if (!message || typeof message !== \"object\" || Array.isArray(message)) return null;\n const record = message as Record<string, unknown>;\n if (record.role !== \"assistant\") return null;\n if (typeof record.content === \"string\") return record.content.trim() ? record.content : null;\n if (!Array.isArray(record.content)) return null;\n const text = record.content\n .flatMap((part) => {\n if (!part || typeof part !== \"object\" || Array.isArray(part)) return [];\n const block = part as Record<string, unknown>;\n return block.type === \"text\" && typeof block.text === \"string\" ? [block.text] : [];\n })\n .join(\"\");\n return text.trim() ? text : null;\n}\n"],"names":["PiPrintError","isUuid","buildPiPrintArgs","providerSessionId","firstRun","readPiSessionId","event","currentSessionId","expectedSessionId","id","sessionId","readPiAssistantText","type","message","Array","isArray","record","role","content","trim","text","flatMap","part","block","join"],"mappings":"AAAA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,OAAO,SAASC,iBAAiBC,iBAAyB,EAAEC,QAAiB;IAC3E,OAAOA,WACH;QAAC;QAAU;QAAQ;QAAgBD;KAAkB,GACrD;QAAC;QAAU;QAAQ;QAAaA;KAAkB;AACxD;AAEA,OAAO,SAASE,gBACdC,KAA8B,EAC9BC,gBAA+B,EAC/BC,iBAAyB;IAEzB,IAAID,qBAAqB,QAAQ,OAAOD,MAAMG,EAAE,KAAK,YAAY,CAACR,OAAOK,MAAMG,EAAE,GAAG;QAClF,MAAM,IAAIT,aAAa,2CAA2C;IACpE;IACA,MAAMU,YAAYJ,MAAMG,EAAE;IAC1B,IAAID,sBAAsBE,WAAW;QACnC,MAAM,IAAIV,aAAa,6CAA6C;IACtE;IACA,OAAOU;AACT;AAEA,OAAO,SAASC,oBAAoBL,KAA8B;IAChE,IAAIA,MAAMM,IAAI,KAAK,eAAe,OAAO;IACzC,MAAMC,UAAUP,MAAMO,OAAO;IAC7B,IAAI,CAACA,WAAW,OAAOA,YAAY,YAAYC,MAAMC,OAAO,CAACF,UAAU,OAAO;IAC9E,MAAMG,SAASH;IACf,IAAIG,OAAOC,IAAI,KAAK,aAAa,OAAO;IACxC,IAAI,OAAOD,OAAOE,OAAO,KAAK,UAAU,OAAOF,OAAOE,OAAO,CAACC,IAAI,KAAKH,OAAOE,OAAO,GAAG;IACxF,IAAI,CAACJ,MAAMC,OAAO,CAACC,OAAOE,OAAO,GAAG,OAAO;IAC3C,MAAME,OAAOJ,OAAOE,OAAO,CACxBG,OAAO,CAAC,CAACC;QACR,IAAI,CAACA,QAAQ,OAAOA,SAAS,YAAYR,MAAMC,OAAO,CAACO,OAAO,OAAO,EAAE;QACvE,MAAMC,QAAQD;QACd,OAAOC,MAAMX,IAAI,KAAK,UAAU,OAAOW,MAAMH,IAAI,KAAK,WAAW;YAACG,MAAMH,IAAI;SAAC,GAAG,EAAE;IACpF,GACCI,IAAI,CAAC;IACR,OAAOJ,KAAKD,IAAI,KAAKC,OAAO;AAC9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"PiPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK3F,KAAK,KAAK,GAAG,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACpE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,oBAAyB;IAMxC,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA6CjE"}
1
+ {"version":3,"file":"PiPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/pi/durable/PiPrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK3F,KAAK,KAAK,GAAG,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACpE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,oBAAyB;IAMxC,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA6CjE"}