@ai-devkit/agent-manager 0.36.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +9 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -2
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +151 -3
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +12 -14
- package/dist/__tests__/capacity/openai.test.js.map +1 -1
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.js +103 -22
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.js +137 -82
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/agents.test.js +66 -2
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
- package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
- package/dist/__tests__/utils/jsonlTail.test.js +360 -0
- package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
- package/dist/__tests__/utils/matchingConstants.test.js +35 -0
- package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
- package/dist/__tests__/utils/process.test.js +436 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +25 -6
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +12 -3
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/openai.d.ts +0 -1
- package/dist/capacity/openai.d.ts.map +1 -1
- package/dist/capacity/openai.js +0 -5
- package/dist/capacity/openai.js.map +1 -1
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
- package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
- package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
- package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
- package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
- package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
- package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
- package/dist/harnesses/gemini/fileSignature.js +9 -0
- package/dist/harnesses/gemini/fileSignature.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
- package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.js +185 -0
- package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
- package/dist/harnesses/index.d.ts +7 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +27 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.js +125 -0
- package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
- package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
- package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.js +212 -0
- package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.js +318 -0
- package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/harnesses/shared.d.ts +41 -0
- package/dist/harnesses/shared.d.ts.map +1 -0
- package/dist/harnesses/shared.js +71 -0
- package/dist/harnesses/shared.js.map +1 -0
- package/dist/index.d.ts +26 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -17
- package/dist/index.js.map +1 -1
- package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.js +209 -0
- package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
- package/dist/utils/agents.d.ts +3 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +50 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jsonlTail.d.ts +73 -0
- package/dist/utils/jsonlTail.d.ts.map +1 -0
- package/dist/utils/jsonlTail.js +238 -0
- package/dist/utils/jsonlTail.js.map +1 -0
- package/dist/utils/matching.d.ts +2 -0
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +3 -2
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/matchingConstants.d.ts +15 -0
- package/dist/utils/matchingConstants.d.ts.map +1 -0
- package/dist/utils/matchingConstants.js +14 -0
- package/dist/utils/matchingConstants.js.map +1 -0
- package/dist/utils/process.d.ts +38 -2
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +131 -43
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -1
- package/scripts/benchmark-cold-start.mjs +350 -0
- package/src/AgentManager.ts +26 -5
- package/src/__tests__/AgentManager.test.ts +141 -3
- package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
- package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
- package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
- package/src/__tests__/capacity/openai.test.ts +5 -15
- package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
- package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
- package/src/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.ts +97 -25
- package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
- package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
- package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
- package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
- package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
- package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
- package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.ts +127 -109
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
- package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/agents.test.ts +76 -2
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -14
- package/src/capacity/openai.ts +0 -6
- package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
- package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
- package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
- package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
- package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
- package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
- package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
- package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
- package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
- package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
- package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
- package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
- package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
- package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
- package/src/harnesses/grok/GrokSessionParser.ts +251 -0
- package/src/harnesses/index.ts +28 -0
- package/src/harnesses/kiro/KiroAdapter.ts +143 -0
- package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
- package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
- package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
- package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
- package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
- package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
- package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
- package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
- package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +26 -24
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +60 -28
- package/src/utils/index.ts +2 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
- package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
- package/dist/adapters/AntigravityCliAdapter.js +0 -273
- package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
- package/dist/adapters/KiroAdapter.d.ts +0 -46
- package/dist/adapters/KiroAdapter.d.ts.map +0 -1
- package/dist/adapters/KiroAdapter.js +0 -344
- package/dist/adapters/KiroAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -12
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -12
- package/dist/adapters/index.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.js +0 -207
- package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
- package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
- package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
- package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.js +0 -181
- package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
- package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.js +0 -166
- package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
- package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
- package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionParser.js +0 -122
- package/dist/providers/grok/GrokSessionParser.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js.map +0 -1
- package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
- package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionLocator.js +0 -86
- package/dist/providers/pi/PiSessionLocator.js.map +0 -1
- package/dist/providers/pi/PiSessionParser.d.ts +0 -36
- package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionParser.js +0 -191
- package/dist/providers/pi/PiSessionParser.js.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/adapters/AntigravityCliAdapter.ts +0 -356
- package/src/adapters/KiroAdapter.ts +0 -456
- package/src/adapters/index.ts +0 -17
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/utils/IncrementalJsonlSummary.test.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport {\n DEFAULT_HEAD_BYTES,\n DEFAULT_TAIL_BYTES,\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\n\nvi.mock(\"fs\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"fs\");\n return { ...actual, readSync: vi.fn(actual.readSync), readFileSync: vi.fn(actual.readFileSync) };\n});\n\nconst mockedReadSync = vi.mocked(fs.readSync);\nconst mockedReadFileSync = vi.mocked(fs.readFileSync);\n\n/** Records every parsed entry (malformed lines as \"<bad>\") plus a running count. */\ninterface RecordingState {\n count: number;\n entries: unknown[];\n}\n\nconst recordingReducer: JsonlSummaryReducer<RecordingState> = {\n initial: () => ({ count: 0, entries: [] }),\n reduce: (state, entry) => ({\n count: state.count + 1,\n entries: [...state.entries, entry === undefined ? \"<bad>\" : entry],\n }),\n};\n\nfunction bytesRead(): number {\n let total = 0;\n for (const result of mockedReadSync.mock.results) {\n if (result.type === \"return\") total += result.value as number;\n }\n for (const result of mockedReadFileSync.mock.results) {\n if (result.type === \"return\") total += Buffer.byteLength(result.value as string | Buffer);\n }\n return total;\n}\n\nfunction line(value: unknown): string {\n return `${JSON.stringify(value)}\\n`;\n}\n\ndescribe(\"reduceJsonlContent\", () => {\n it(\"folds non-blank lines, passing undefined for malformed JSON\", () => {\n const state = reduceJsonlContent(recordingReducer, '\\n \\n{\"a\":1}\\nnot json\\n\\n{\"b\":2}');\n expect(state.entries).toEqual([{ a: 1 }, \"<bad>\", { b: 2 }]);\n });\n\n it(\"returns the initial state for empty content\", () => {\n expect(reduceJsonlContent(recordingReducer, \"\")).toEqual({ count: 0, entries: [] });\n });\n});\n\ndescribe(\"IncrementalJsonlSummary\", () => {\n let tmpDir: string;\n let filePath: string;\n let cache: IncrementalJsonlSummary<RecordingState>;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"incremental-jsonl-\"));\n filePath = path.join(tmpDir, \"session.jsonl\");\n cache = new IncrementalJsonlSummary(recordingReducer);\n mockedReadSync.mockClear();\n mockedReadFileSync.mockClear();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"returns null for a missing file\", () => {\n expect(cache.read(path.join(tmpDir, \"missing.jsonl\"))).toBeNull();\n expect(cache.size).toBe(0);\n });\n\n it(\"summarizes a file and reports its size and mtime\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }) + line({ b: 2 }));\n const stat = fs.statSync(filePath);\n\n const result = cache.read(filePath);\n\n expect(result?.state.entries).toEqual([{ a: 1 }, { b: 2 }]);\n expect(result?.size).toBe(stat.size);\n expect(result?.mtime).toEqual(stat.mtime);\n });\n\n it(\"reads 0 bytes when the file is unchanged\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }) + line({ b: 2 }));\n const first = cache.read(filePath);\n mockedReadSync.mockClear();\n mockedReadFileSync.mockClear();\n\n const second = cache.read(filePath);\n\n expect(bytesRead()).toBe(0);\n expect(second?.state).toEqual(first?.state);\n });\n\n it(\"reads only the appended bytes when the file grows\", () => {\n fs.writeFileSync(filePath, line({ a: \"x\".repeat(200_000) }));\n cache.read(filePath);\n mockedReadSync.mockClear();\n\n const appended = line({ b: 2 }) + line({ c: 3 });\n fs.appendFileSync(filePath, appended);\n const result = cache.read(filePath);\n\n expect(bytesRead()).toBe(Buffer.byteLength(appended));\n expect(result?.state.entries.slice(1)).toEqual([{ b: 2 }, { c: 3 }]);\n expect(result?.state.count).toBe(3);\n });\n\n it(\"handles lines spanning read chunks and multi-byte characters\", () => {\n const small = new IncrementalJsonlSummary(recordingReducer, { chunkSize: 7 });\n const entries = [{ text: \"héllo wörld 👋\" }, { text: \"日本語のテキスト\" }, { n: 3 }];\n fs.writeFileSync(filePath, entries.map(line).join(\"\"));\n\n expect(small.read(filePath)?.state.entries).toEqual(entries);\n });\n\n it(\"does not reduce an unterminated line until it is complete, without duplicating it\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }) + '{\"b\":');\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }]);\n\n fs.appendFileSync(filePath, \"2\");\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }]);\n\n fs.appendFileSync(filePath, \"}\\n\");\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }]);\n\n fs.appendFileSync(filePath, line({ c: 3 }));\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }, { c: 3 }]);\n });\n\n it(\"includes a valid unterminated last line in the result but re-reads it once terminated\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }) + '{\"b\":2}');\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }]);\n\n fs.appendFileSync(filePath, \"\\n\" + line({ c: 3 }));\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }, { c: 3 }]);\n });\n\n it(\"matches a one-shot fold for every split point of an appended file\", () => {\n const content = [\n line({ a: 1 }),\n \"\\n\",\n \"garbage\\n\",\n line({ b: \"ünïcode\" }),\n line({ c: [1, 2, 3] }),\n '{\"d\":4}',\n ].join(\"\");\n const buffer = Buffer.from(content);\n const expected = reduceJsonlContent(recordingReducer, content);\n\n for (let split = 0; split <= buffer.length; split++) {\n const splitCache = new IncrementalJsonlSummary(recordingReducer, { chunkSize: 5 });\n fs.writeFileSync(filePath, buffer.subarray(0, split));\n splitCache.read(filePath);\n fs.appendFileSync(filePath, buffer.subarray(split));\n expect(splitCache.read(filePath)?.state).toEqual(expected);\n }\n });\n\n it(\"rebuilds when the file shrinks\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }) + line({ b: 2 }));\n cache.read(filePath);\n\n fs.writeFileSync(filePath, line({ z: 9 }));\n\n expect(cache.read(filePath)?.state.entries).toEqual([{ z: 9 }]);\n });\n\n it(\"rebuilds when the file is replaced by a different inode\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }));\n cache.read(filePath);\n\n const replacement = path.join(tmpDir, \"replacement.jsonl\");\n fs.writeFileSync(replacement, line({ a: 1 }) + line({ rotated: true }));\n fs.renameSync(replacement, filePath);\n\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { rotated: true }]);\n });\n\n it(\"rebuilds when the size is unchanged but the mtime moved\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }));\n cache.read(filePath);\n\n fs.writeFileSync(filePath, line({ b: 2 }));\n const future = new Date(Date.now() + 10_000);\n fs.utimesSync(filePath, future, future);\n\n expect(cache.read(filePath)?.state.entries).toEqual([{ b: 2 }]);\n });\n\n it(\"drops the entry when a cached file disappears\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }));\n cache.read(filePath);\n fs.rmSync(filePath);\n\n expect(cache.read(filePath)).toBeNull();\n expect(cache.size).toBe(0);\n });\n\n it(\"evicts entries not read since the previous prune\", () => {\n const other = path.join(tmpDir, \"other.jsonl\");\n fs.writeFileSync(filePath, line({ a: 1 }));\n fs.writeFileSync(other, line({ b: 2 }));\n\n cache.read(filePath);\n cache.read(other);\n cache.prune();\n expect(cache.size).toBe(2);\n\n cache.read(filePath);\n cache.prune();\n expect(cache.size).toBe(1);\n\n cache.prune();\n expect(cache.size).toBe(0);\n });\n\n it(\"keeps only reducer state and stat metadata per entry\", () => {\n fs.writeFileSync(filePath, line({ a: \"x\".repeat(10_000) }) + '{\"partial\":');\n cache.read(filePath);\n\n const entry = (cache as any).entries.get(filePath);\n expect(Object.keys(entry).sort()).toEqual(\n [\n \"committed\",\n \"dev\",\n \"discarding\",\n \"ino\",\n \"mtime\",\n \"mtimeMs\",\n \"offset\",\n \"seen\",\n \"size\",\n \"skippedBytes\",\n \"state\",\n ].sort(),\n );\n });\n});\n\ndescribe(\"IncrementalJsonlSummary bounded cold start\", () => {\n let tmpDir: string;\n let filePath: string;\n\n /** Records entries plus how many times the middle of the file was skipped. */\n interface GapState extends RecordingState {\n gaps: number;\n }\n const gapReducer: JsonlSummaryReducer<GapState> = {\n initial: () => ({ count: 0, entries: [], gaps: 0 }),\n reduce: (state, entry) => ({\n ...state,\n count: state.count + 1,\n entries: [...state.entries, entry === undefined ? \"<bad>\" : entry],\n }),\n skip: (state) => ({ ...state, gaps: state.gaps + 1 }),\n };\n\n const bounds = { headBytes: 64, tailBytes: 128 };\n const pad = (n: number) => line({ pad: \"p\".repeat(n) });\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"bounded-jsonl-\"));\n filePath = path.join(tmpDir, \"session.jsonl\");\n mockedReadSync.mockClear();\n mockedReadFileSync.mockClear();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"parses the whole file when it fits within head + tail\", () => {\n const content = line({ a: 1 }) + pad(100) + line({ z: 9 });\n expect(Buffer.byteLength(content)).toBeLessThanOrEqual(192);\n fs.writeFileSync(filePath, content);\n\n const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);\n\n expect(result?.state).toEqual(reduceJsonlContent(gapReducer, content));\n expect(result?.skippedBytes).toBe(0);\n });\n\n it(\"folds head lines, then skip(), then tail lines, reading at most head + tail + 1 bytes\", () => {\n const tail = line({ y: 8 }) + line({ z: 9 });\n const content = line({ a: 1 }) + pad(40) + pad(1000) + pad(40) + tail;\n fs.writeFileSync(filePath, content);\n\n const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);\n\n // +1: the byte before the tail window tells whether it starts on a line boundary\n expect(bytesRead()).toBeLessThanOrEqual(bounds.headBytes + bounds.tailBytes + 1);\n expect(result?.state.gaps).toBe(1);\n expect(result?.state.entries[0]).toEqual({ a: 1 });\n expect(result?.state.entries.slice(-2)).toEqual([{ y: 8 }, { z: 9 }]);\n expect(result?.state.entries).not.toContainEqual({ pad: \"p\".repeat(1000) });\n expect(result?.size).toBe(Buffer.byteLength(content));\n expect(result?.skippedBytes).toBe(Buffer.byteLength(content) - 64 - 128);\n });\n\n it(\"drops lines that straddle the head cap or the tail window start\", () => {\n const content = line({ a: 1 }) + pad(500) + line({ z: 9 });\n fs.writeFileSync(filePath, content);\n\n const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);\n\n expect(result?.state.entries).toEqual([{ a: 1 }, { z: 9 }]);\n });\n\n it(\"folds the first tail line when the tail window starts exactly on a line boundary\", () => {\n const tail = line({ y: 8 }) + line({ z: 9 });\n fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + tail);\n\n const result = new IncrementalJsonlSummary(gapReducer, {\n bounds: { headBytes: 64, tailBytes: Buffer.byteLength(tail) },\n }).read(filePath);\n\n expect(result?.skippedBytes).toBeGreaterThan(0);\n expect(result?.state.entries).toEqual([{ a: 1 }, { y: 8 }, { z: 9 }]);\n });\n\n it(\"still drops the partial line when the tail window starts one byte into it\", () => {\n const tail = line({ y: 8 }) + line({ z: 9 });\n fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + tail);\n\n const result = new IncrementalJsonlSummary(gapReducer, {\n bounds: { headBytes: 64, tailBytes: Buffer.byteLength(tail) - 1 },\n }).read(filePath);\n\n expect(result?.state.entries).toEqual([{ a: 1 }, { z: 9 }]);\n });\n\n it(\"folds nothing from a tail window that holds no line start\", () => {\n const content = line({ a: 1 }) + line({ big: \"b\".repeat(1000) });\n fs.writeFileSync(filePath, content);\n\n const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);\n\n expect(result?.state.entries).toEqual([{ a: 1 }]);\n expect(result?.state.gaps).toBe(1);\n });\n\n it(\"seeds the cache at end of file, so later appends read only the new bytes\", () => {\n const cache = new IncrementalJsonlSummary(gapReducer, { bounds });\n fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + line({ z: 9 }));\n cache.read(filePath);\n mockedReadSync.mockClear();\n\n const appended = line({ n: 10 });\n fs.appendFileSync(filePath, appended);\n const result = cache.read(filePath);\n\n expect(bytesRead()).toBe(Buffer.byteLength(appended));\n expect(result?.state.entries.slice(-2)).toEqual([{ z: 9 }, { n: 10 }]);\n expect(result?.state.gaps).toBe(1);\n expect(result?.skippedBytes).toBeGreaterThan(0);\n });\n\n it(\"resynchronises on the next newline when the tail window ended inside a line\", () => {\n const cache = new IncrementalJsonlSummary(gapReducer, { bounds });\n fs.writeFileSync(filePath, line({ a: 1 }) + '{\"big\":\"' + \"b\".repeat(1000));\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }]);\n\n fs.appendFileSync(filePath, '\"}\\n' + line({ n: 10 }));\n\n expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { n: 10 }]);\n });\n\n it(\"uses the bounded scan again when rebuilding a replaced file\", () => {\n const cache = new IncrementalJsonlSummary(gapReducer, { bounds });\n fs.writeFileSync(filePath, line({ a: 1 }));\n cache.read(filePath);\n\n const replacement = path.join(tmpDir, \"replacement.jsonl\");\n fs.writeFileSync(replacement, line({ b: 2 }) + pad(1000) + line({ z: 9 }));\n fs.renameSync(replacement, filePath);\n mockedReadSync.mockClear();\n\n const result = cache.read(filePath);\n // +1: the byte before the tail window tells whether it starts on a line boundary\n expect(bytesRead()).toBeLessThanOrEqual(bounds.headBytes + bounds.tailBytes + 1);\n expect(result?.state.entries).toEqual([{ b: 2 }, { z: 9 }]);\n });\n\n it(\"folds tail lines straight onto the head state when the reducer has no skip()\", () => {\n fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + line({ z: 9 }));\n const result = new IncrementalJsonlSummary(recordingReducer, { bounds }).read(filePath);\n expect(result?.state).toEqual({ count: 2, entries: [{ a: 1 }, { z: 9 }] });\n });\n\n it(\"parses from byte 0 when bounds are disabled\", () => {\n const content = line({ a: 1 }) + pad(1000) + line({ z: 9 });\n fs.writeFileSync(filePath, content);\n const result = new IncrementalJsonlSummary(gapReducer, { bounds: false }).read(filePath);\n expect(result?.state).toEqual(reduceJsonlContent(gapReducer, content));\n expect(result?.skippedBytes).toBe(0);\n });\n\n it(\"defaults to a 1 MiB head and 4 MiB tail\", () => {\n expect(DEFAULT_HEAD_BYTES).toBe(1024 * 1024);\n expect(DEFAULT_TAIL_BYTES).toBe(4 * 1024 * 1024);\n });\n});\n"],"names":["fs","os","path","DEFAULT_HEAD_BYTES","DEFAULT_TAIL_BYTES","IncrementalJsonlSummary","reduceJsonlContent","vi","mock","importOriginal","actual","readSync","fn","readFileSync","mockedReadSync","mocked","mockedReadFileSync","recordingReducer","initial","count","entries","reduce","state","entry","undefined","bytesRead","total","result","results","type","value","Buffer","byteLength","line","JSON","stringify","describe","it","expect","toEqual","a","b","tmpDir","filePath","cache","beforeEach","mkdtempSync","join","tmpdir","mockClear","afterEach","rmSync","recursive","force","read","toBeNull","size","toBe","writeFileSync","stat","statSync","mtime","first","second","repeat","appended","c","appendFileSync","slice","small","chunkSize","text","n","map","content","buffer","from","expected","split","length","splitCache","subarray","z","replacement","rotated","renameSync","future","Date","now","utimesSync","other","prune","get","Object","keys","sort","gapReducer","gaps","skip","bounds","headBytes","tailBytes","pad","toBeLessThanOrEqual","skippedBytes","tail","y","not","toContainEqual","toBeGreaterThan","big"],"mappings":"AAAA,YAAYA,QAAQ,KAAK;AACzB,YAAYC,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,uBAAuB,EACvBC,kBAAkB,QAEb,yCAAyC;AAEhDC,GAAGC,IAAI,CAAC,MAAM,OAAOC;IACnB,MAAMC,SAAU,MAAMD;IACtB,OAAO;QAAE,GAAGC,MAAM;QAAEC,UAAUJ,GAAGK,EAAE,CAACF,OAAOC,QAAQ;QAAGE,cAAcN,GAAGK,EAAE,CAACF,OAAOG,YAAY;IAAE;AACjG;AAEA,MAAMC,iBAAiBP,GAAGQ,MAAM,CAACf,GAAGW,QAAQ;AAC5C,MAAMK,qBAAqBT,GAAGQ,MAAM,CAACf,GAAGa,YAAY;AAQpD,MAAMI,mBAAwD;IAC5DC,SAAS,IAAO,CAAA;YAAEC,OAAO;YAAGC,SAAS,EAAE;QAAC,CAAA;IACxCC,QAAQ,CAACC,OAAOC,QAAW,CAAA;YACzBJ,OAAOG,MAAMH,KAAK,GAAG;YACrBC,SAAS;mBAAIE,MAAMF,OAAO;gBAAEG,UAAUC,YAAY,UAAUD;aAAM;QACpE,CAAA;AACF;AAEA,SAASE;IACP,IAAIC,QAAQ;IACZ,KAAK,MAAMC,UAAUb,eAAeN,IAAI,CAACoB,OAAO,CAAE;QAChD,IAAID,OAAOE,IAAI,KAAK,UAAUH,SAASC,OAAOG,KAAK;IACrD;IACA,KAAK,MAAMH,UAAUX,mBAAmBR,IAAI,CAACoB,OAAO,CAAE;QACpD,IAAID,OAAOE,IAAI,KAAK,UAAUH,SAASK,OAAOC,UAAU,CAACL,OAAOG,KAAK;IACvE;IACA,OAAOJ;AACT;AAEA,SAASO,KAAKH,KAAc;IAC1B,OAAO,GAAGI,KAAKC,SAAS,CAACL,OAAO,EAAE,CAAC;AACrC;AAEAM,SAAS,sBAAsB;IAC7BC,GAAG,+DAA+D;QAChE,MAAMf,QAAQhB,mBAAmBW,kBAAkB;QACnDqB,OAAOhB,MAAMF,OAAO,EAAEmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;YAAS;gBAAEC,GAAG;YAAE;SAAE;IAC7D;IAEAJ,GAAG,+CAA+C;QAChDC,OAAOhC,mBAAmBW,kBAAkB,KAAKsB,OAAO,CAAC;YAAEpB,OAAO;YAAGC,SAAS,EAAE;QAAC;IACnF;AACF;AAEAgB,SAAS,2BAA2B;IAClC,IAAIM;IACJ,IAAIC;IACJ,IAAIC;IAEJC,WAAW;QACTH,SAAS1C,GAAG8C,WAAW,CAAC5C,KAAK6C,IAAI,CAAC9C,GAAG+C,MAAM,IAAI;QAC/CL,WAAWzC,KAAK6C,IAAI,CAACL,QAAQ;QAC7BE,QAAQ,IAAIvC,wBAAwBY;QACpCH,eAAemC,SAAS;QACxBjC,mBAAmBiC,SAAS;IAC9B;IAEAC,UAAU;QACRlD,GAAGmD,MAAM,CAACT,QAAQ;YAAEU,WAAW;YAAMC,OAAO;QAAK;IACnD;IAEAhB,GAAG,mCAAmC;QACpCC,OAAOM,MAAMU,IAAI,CAACpD,KAAK6C,IAAI,CAACL,QAAQ,mBAAmBa,QAAQ;QAC/DjB,OAAOM,MAAMY,IAAI,EAAEC,IAAI,CAAC;IAC1B;IAEApB,GAAG,oDAAoD;QACrDrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAKP,KAAK;YAAEQ,GAAG;QAAE;QACxD,MAAMkB,OAAO3D,GAAG4D,QAAQ,CAACjB;QAEzB,MAAMhB,SAASiB,MAAMU,IAAI,CAACX;QAE1BL,OAAOX,QAAQL,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEC,GAAG;YAAE;SAAE;QAC1DH,OAAOX,QAAQ6B,MAAMC,IAAI,CAACE,KAAKH,IAAI;QACnClB,OAAOX,QAAQkC,OAAOtB,OAAO,CAACoB,KAAKE,KAAK;IAC1C;IAEAxB,GAAG,4CAA4C;QAC7CrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAKP,KAAK;YAAEQ,GAAG;QAAE;QACxD,MAAMqB,QAAQlB,MAAMU,IAAI,CAACX;QACzB7B,eAAemC,SAAS;QACxBjC,mBAAmBiC,SAAS;QAE5B,MAAMc,SAASnB,MAAMU,IAAI,CAACX;QAE1BL,OAAOb,aAAagC,IAAI,CAAC;QACzBnB,OAAOyB,QAAQzC,OAAOiB,OAAO,CAACuB,OAAOxC;IACvC;IAEAe,GAAG,qDAAqD;QACtDrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG,IAAIwB,MAAM,CAAC;QAAS;QACzDpB,MAAMU,IAAI,CAACX;QACX7B,eAAemC,SAAS;QAExB,MAAMgB,WAAWhC,KAAK;YAAEQ,GAAG;QAAE,KAAKR,KAAK;YAAEiC,GAAG;QAAE;QAC9ClE,GAAGmE,cAAc,CAACxB,UAAUsB;QAC5B,MAAMtC,SAASiB,MAAMU,IAAI,CAACX;QAE1BL,OAAOb,aAAagC,IAAI,CAAC1B,OAAOC,UAAU,CAACiC;QAC3C3B,OAAOX,QAAQL,MAAMF,QAAQgD,MAAM,IAAI7B,OAAO,CAAC;YAAC;gBAAEE,GAAG;YAAE;YAAG;gBAAEyB,GAAG;YAAE;SAAE;QACnE5B,OAAOX,QAAQL,MAAMH,OAAOsC,IAAI,CAAC;IACnC;IAEApB,GAAG,gEAAgE;QACjE,MAAMgC,QAAQ,IAAIhE,wBAAwBY,kBAAkB;YAAEqD,WAAW;QAAE;QAC3E,MAAMlD,UAAU;YAAC;gBAAEmD,MAAM;YAAiB;YAAG;gBAAEA,MAAM;YAAW;YAAG;gBAAEC,GAAG;YAAE;SAAE;QAC5ExE,GAAG0D,aAAa,CAACf,UAAUvB,QAAQqD,GAAG,CAACxC,MAAMc,IAAI,CAAC;QAElDT,OAAO+B,MAAMf,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAACnB;IACtD;IAEAiB,GAAG,qFAAqF;QACtFrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK;QAC5CF,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;SAAE;QAE9DxC,GAAGmE,cAAc,CAACxB,UAAU;QAC5BL,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;SAAE;QAE9DxC,GAAGmE,cAAc,CAACxB,UAAU;QAC5BL,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEC,GAAG;YAAE;SAAE;QAExEzC,GAAGmE,cAAc,CAACxB,UAAUV,KAAK;YAAEiC,GAAG;QAAE;QACxC5B,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEC,GAAG;YAAE;YAAG;gBAAEyB,GAAG;YAAE;SAAE;IACpF;IAEA7B,GAAG,yFAAyF;QAC1FrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK;QAC5CF,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEC,GAAG;YAAE;SAAE;QAExEzC,GAAGmE,cAAc,CAACxB,UAAU,OAAOV,KAAK;YAAEiC,GAAG;QAAE;QAC/C5B,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEC,GAAG;YAAE;YAAG;gBAAEyB,GAAG;YAAE;SAAE;IACpF;IAEA7B,GAAG,qEAAqE;QACtE,MAAMqC,UAAU;YACdzC,KAAK;gBAAEO,GAAG;YAAE;YACZ;YACA;YACAP,KAAK;gBAAEQ,GAAG;YAAU;YACpBR,KAAK;gBAAEiC,GAAG;oBAAC;oBAAG;oBAAG;iBAAE;YAAC;YACpB;SACD,CAACnB,IAAI,CAAC;QACP,MAAM4B,SAAS5C,OAAO6C,IAAI,CAACF;QAC3B,MAAMG,WAAWvE,mBAAmBW,kBAAkByD;QAEtD,IAAK,IAAII,QAAQ,GAAGA,SAASH,OAAOI,MAAM,EAAED,QAAS;YACnD,MAAME,aAAa,IAAI3E,wBAAwBY,kBAAkB;gBAAEqD,WAAW;YAAE;YAChFtE,GAAG0D,aAAa,CAACf,UAAUgC,OAAOM,QAAQ,CAAC,GAAGH;YAC9CE,WAAW1B,IAAI,CAACX;YAChB3C,GAAGmE,cAAc,CAACxB,UAAUgC,OAAOM,QAAQ,CAACH;YAC5CxC,OAAO0C,WAAW1B,IAAI,CAACX,WAAWrB,OAAOiB,OAAO,CAACsC;QACnD;IACF;IAEAxC,GAAG,kCAAkC;QACnCrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAKP,KAAK;YAAEQ,GAAG;QAAE;QACxDG,MAAMU,IAAI,CAACX;QAEX3C,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEiD,GAAG;QAAE;QAEvC5C,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAE2C,GAAG;YAAE;SAAE;IAChE;IAEA7C,GAAG,2DAA2D;QAC5DrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE;QACvCI,MAAMU,IAAI,CAACX;QAEX,MAAMwC,cAAcjF,KAAK6C,IAAI,CAACL,QAAQ;QACtC1C,GAAG0D,aAAa,CAACyB,aAAalD,KAAK;YAAEO,GAAG;QAAE,KAAKP,KAAK;YAAEmD,SAAS;QAAK;QACpEpF,GAAGqF,UAAU,CAACF,aAAaxC;QAE3BL,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAE4C,SAAS;YAAK;SAAE;IACnF;IAEA/C,GAAG,2DAA2D;QAC5DrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE;QACvCI,MAAMU,IAAI,CAACX;QAEX3C,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEQ,GAAG;QAAE;QACvC,MAAM6C,SAAS,IAAIC,KAAKA,KAAKC,GAAG,KAAK;QACrCxF,GAAGyF,UAAU,CAAC9C,UAAU2C,QAAQA;QAEhChD,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEE,GAAG;YAAE;SAAE;IAChE;IAEAJ,GAAG,iDAAiD;QAClDrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE;QACvCI,MAAMU,IAAI,CAACX;QACX3C,GAAGmD,MAAM,CAACR;QAEVL,OAAOM,MAAMU,IAAI,CAACX,WAAWY,QAAQ;QACrCjB,OAAOM,MAAMY,IAAI,EAAEC,IAAI,CAAC;IAC1B;IAEApB,GAAG,oDAAoD;QACrD,MAAMqD,QAAQxF,KAAK6C,IAAI,CAACL,QAAQ;QAChC1C,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE;QACvCxC,GAAG0D,aAAa,CAACgC,OAAOzD,KAAK;YAAEQ,GAAG;QAAE;QAEpCG,MAAMU,IAAI,CAACX;QACXC,MAAMU,IAAI,CAACoC;QACX9C,MAAM+C,KAAK;QACXrD,OAAOM,MAAMY,IAAI,EAAEC,IAAI,CAAC;QAExBb,MAAMU,IAAI,CAACX;QACXC,MAAM+C,KAAK;QACXrD,OAAOM,MAAMY,IAAI,EAAEC,IAAI,CAAC;QAExBb,MAAM+C,KAAK;QACXrD,OAAOM,MAAMY,IAAI,EAAEC,IAAI,CAAC;IAC1B;IAEApB,GAAG,wDAAwD;QACzDrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG,IAAIwB,MAAM,CAAC;QAAQ,KAAK;QAC7DpB,MAAMU,IAAI,CAACX;QAEX,MAAMpB,QAAQ,AAACqB,MAAcxB,OAAO,CAACwE,GAAG,CAACjD;QACzCL,OAAOuD,OAAOC,IAAI,CAACvE,OAAOwE,IAAI,IAAIxD,OAAO,CACvC;YACE;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;YACA;SACD,CAACwD,IAAI;IAEV;AACF;AAEA3D,SAAS,8CAA8C;IACrD,IAAIM;IACJ,IAAIC;IAMJ,MAAMqD,aAA4C;QAChD9E,SAAS,IAAO,CAAA;gBAAEC,OAAO;gBAAGC,SAAS,EAAE;gBAAE6E,MAAM;YAAE,CAAA;QACjD5E,QAAQ,CAACC,OAAOC,QAAW,CAAA;gBACzB,GAAGD,KAAK;gBACRH,OAAOG,MAAMH,KAAK,GAAG;gBACrBC,SAAS;uBAAIE,MAAMF,OAAO;oBAAEG,UAAUC,YAAY,UAAUD;iBAAM;YACpE,CAAA;QACA2E,MAAM,CAAC5E,QAAW,CAAA;gBAAE,GAAGA,KAAK;gBAAE2E,MAAM3E,MAAM2E,IAAI,GAAG;YAAE,CAAA;IACrD;IAEA,MAAME,SAAS;QAAEC,WAAW;QAAIC,WAAW;IAAI;IAC/C,MAAMC,MAAM,CAAC9B,IAAcvC,KAAK;YAAEqE,KAAK,IAAItC,MAAM,CAACQ;QAAG;IAErD3B,WAAW;QACTH,SAAS1C,GAAG8C,WAAW,CAAC5C,KAAK6C,IAAI,CAAC9C,GAAG+C,MAAM,IAAI;QAC/CL,WAAWzC,KAAK6C,IAAI,CAACL,QAAQ;QAC7B5B,eAAemC,SAAS;QACxBjC,mBAAmBiC,SAAS;IAC9B;IAEAC,UAAU;QACRlD,GAAGmD,MAAM,CAACT,QAAQ;YAAEU,WAAW;YAAMC,OAAO;QAAK;IACnD;IAEAhB,GAAG,yDAAyD;QAC1D,MAAMqC,UAAUzC,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,OAAOrE,KAAK;YAAEiD,GAAG;QAAE;QACxD5C,OAAOP,OAAOC,UAAU,CAAC0C,UAAU6B,mBAAmB,CAAC;QACvDvG,GAAG0D,aAAa,CAACf,UAAU+B;QAE3B,MAAM/C,SAAS,IAAItB,wBAAwB2F,YAAY;YAAEG;QAAO,GAAG7C,IAAI,CAACX;QAExEL,OAAOX,QAAQL,OAAOiB,OAAO,CAACjC,mBAAmB0F,YAAYtB;QAC7DpC,OAAOX,QAAQ6E,cAAc/C,IAAI,CAAC;IACpC;IAEApB,GAAG,yFAAyF;QAC1F,MAAMoE,OAAOxE,KAAK;YAAEyE,GAAG;QAAE,KAAKzE,KAAK;YAAEiD,GAAG;QAAE;QAC1C,MAAMR,UAAUzC,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,MAAMA,IAAI,QAAQA,IAAI,MAAMG;QACjEzG,GAAG0D,aAAa,CAACf,UAAU+B;QAE3B,MAAM/C,SAAS,IAAItB,wBAAwB2F,YAAY;YAAEG;QAAO,GAAG7C,IAAI,CAACX;QAExE,iFAAiF;QACjFL,OAAOb,aAAa8E,mBAAmB,CAACJ,OAAOC,SAAS,GAAGD,OAAOE,SAAS,GAAG;QAC9E/D,OAAOX,QAAQL,MAAM2E,MAAMxC,IAAI,CAAC;QAChCnB,OAAOX,QAAQL,MAAMF,OAAO,CAAC,EAAE,EAAEmB,OAAO,CAAC;YAAEC,GAAG;QAAE;QAChDF,OAAOX,QAAQL,MAAMF,QAAQgD,MAAM,CAAC,IAAI7B,OAAO,CAAC;YAAC;gBAAEmE,GAAG;YAAE;YAAG;gBAAExB,GAAG;YAAE;SAAE;QACpE5C,OAAOX,QAAQL,MAAMF,SAASuF,GAAG,CAACC,cAAc,CAAC;YAAEN,KAAK,IAAItC,MAAM,CAAC;QAAM;QACzE1B,OAAOX,QAAQ6B,MAAMC,IAAI,CAAC1B,OAAOC,UAAU,CAAC0C;QAC5CpC,OAAOX,QAAQ6E,cAAc/C,IAAI,CAAC1B,OAAOC,UAAU,CAAC0C,WAAW,KAAK;IACtE;IAEArC,GAAG,mEAAmE;QACpE,MAAMqC,UAAUzC,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,OAAOrE,KAAK;YAAEiD,GAAG;QAAE;QACxDlF,GAAG0D,aAAa,CAACf,UAAU+B;QAE3B,MAAM/C,SAAS,IAAItB,wBAAwB2F,YAAY;YAAEG;QAAO,GAAG7C,IAAI,CAACX;QAExEL,OAAOX,QAAQL,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAE0C,GAAG;YAAE;SAAE;IAC5D;IAEA7C,GAAG,oFAAoF;QACrF,MAAMoE,OAAOxE,KAAK;YAAEyE,GAAG;QAAE,KAAKzE,KAAK;YAAEiD,GAAG;QAAE;QAC1ClF,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,QAAQG;QAExD,MAAM9E,SAAS,IAAItB,wBAAwB2F,YAAY;YACrDG,QAAQ;gBAAEC,WAAW;gBAAIC,WAAWtE,OAAOC,UAAU,CAACyE;YAAM;QAC9D,GAAGnD,IAAI,CAACX;QAERL,OAAOX,QAAQ6E,cAAcK,eAAe,CAAC;QAC7CvE,OAAOX,QAAQL,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEkE,GAAG;YAAE;YAAG;gBAAExB,GAAG;YAAE;SAAE;IACtE;IAEA7C,GAAG,6EAA6E;QAC9E,MAAMoE,OAAOxE,KAAK;YAAEyE,GAAG;QAAE,KAAKzE,KAAK;YAAEiD,GAAG;QAAE;QAC1ClF,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,QAAQG;QAExD,MAAM9E,SAAS,IAAItB,wBAAwB2F,YAAY;YACrDG,QAAQ;gBAAEC,WAAW;gBAAIC,WAAWtE,OAAOC,UAAU,CAACyE,QAAQ;YAAE;QAClE,GAAGnD,IAAI,CAACX;QAERL,OAAOX,QAAQL,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAE0C,GAAG;YAAE;SAAE;IAC5D;IAEA7C,GAAG,6DAA6D;QAC9D,MAAMqC,UAAUzC,KAAK;YAAEO,GAAG;QAAE,KAAKP,KAAK;YAAE6E,KAAK,IAAI9C,MAAM,CAAC;QAAM;QAC9DhE,GAAG0D,aAAa,CAACf,UAAU+B;QAE3B,MAAM/C,SAAS,IAAItB,wBAAwB2F,YAAY;YAAEG;QAAO,GAAG7C,IAAI,CAACX;QAExEL,OAAOX,QAAQL,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;SAAE;QAChDF,OAAOX,QAAQL,MAAM2E,MAAMxC,IAAI,CAAC;IAClC;IAEApB,GAAG,4EAA4E;QAC7E,MAAMO,QAAQ,IAAIvC,wBAAwB2F,YAAY;YAAEG;QAAO;QAC/DnG,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,QAAQrE,KAAK;YAAEiD,GAAG;QAAE;QACpEtC,MAAMU,IAAI,CAACX;QACX7B,eAAemC,SAAS;QAExB,MAAMgB,WAAWhC,KAAK;YAAEuC,GAAG;QAAG;QAC9BxE,GAAGmE,cAAc,CAACxB,UAAUsB;QAC5B,MAAMtC,SAASiB,MAAMU,IAAI,CAACX;QAE1BL,OAAOb,aAAagC,IAAI,CAAC1B,OAAOC,UAAU,CAACiC;QAC3C3B,OAAOX,QAAQL,MAAMF,QAAQgD,MAAM,CAAC,IAAI7B,OAAO,CAAC;YAAC;gBAAE2C,GAAG;YAAE;YAAG;gBAAEV,GAAG;YAAG;SAAE;QACrElC,OAAOX,QAAQL,MAAM2E,MAAMxC,IAAI,CAAC;QAChCnB,OAAOX,QAAQ6E,cAAcK,eAAe,CAAC;IAC/C;IAEAxE,GAAG,+EAA+E;QAChF,MAAMO,QAAQ,IAAIvC,wBAAwB2F,YAAY;YAAEG;QAAO;QAC/DnG,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK,aAAa,IAAIwB,MAAM,CAAC;QACpE1B,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;SAAE;QAE9DxC,GAAGmE,cAAc,CAACxB,UAAU,SAASV,KAAK;YAAEuC,GAAG;QAAG;QAElDlC,OAAOM,MAAMU,IAAI,CAACX,WAAWrB,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEC,GAAG;YAAE;YAAG;gBAAEgC,GAAG;YAAG;SAAE;IAC3E;IAEAnC,GAAG,+DAA+D;QAChE,MAAMO,QAAQ,IAAIvC,wBAAwB2F,YAAY;YAAEG;QAAO;QAC/DnG,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE;QACvCI,MAAMU,IAAI,CAACX;QAEX,MAAMwC,cAAcjF,KAAK6C,IAAI,CAACL,QAAQ;QACtC1C,GAAG0D,aAAa,CAACyB,aAAalD,KAAK;YAAEQ,GAAG;QAAE,KAAK6D,IAAI,QAAQrE,KAAK;YAAEiD,GAAG;QAAE;QACvElF,GAAGqF,UAAU,CAACF,aAAaxC;QAC3B7B,eAAemC,SAAS;QAExB,MAAMtB,SAASiB,MAAMU,IAAI,CAACX;QAC1B,iFAAiF;QACjFL,OAAOb,aAAa8E,mBAAmB,CAACJ,OAAOC,SAAS,GAAGD,OAAOE,SAAS,GAAG;QAC9E/D,OAAOX,QAAQL,MAAMF,SAASmB,OAAO,CAAC;YAAC;gBAAEE,GAAG;YAAE;YAAG;gBAAEyC,GAAG;YAAE;SAAE;IAC5D;IAEA7C,GAAG,gFAAgF;QACjFrC,GAAG0D,aAAa,CAACf,UAAUV,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,QAAQrE,KAAK;YAAEiD,GAAG;QAAE;QACpE,MAAMvD,SAAS,IAAItB,wBAAwBY,kBAAkB;YAAEkF;QAAO,GAAG7C,IAAI,CAACX;QAC9EL,OAAOX,QAAQL,OAAOiB,OAAO,CAAC;YAAEpB,OAAO;YAAGC,SAAS;gBAAC;oBAAEoB,GAAG;gBAAE;gBAAG;oBAAE0C,GAAG;gBAAE;aAAE;QAAC;IAC1E;IAEA7C,GAAG,+CAA+C;QAChD,MAAMqC,UAAUzC,KAAK;YAAEO,GAAG;QAAE,KAAK8D,IAAI,QAAQrE,KAAK;YAAEiD,GAAG;QAAE;QACzDlF,GAAG0D,aAAa,CAACf,UAAU+B;QAC3B,MAAM/C,SAAS,IAAItB,wBAAwB2F,YAAY;YAAEG,QAAQ;QAAM,GAAG7C,IAAI,CAACX;QAC/EL,OAAOX,QAAQL,OAAOiB,OAAO,CAACjC,mBAAmB0F,YAAYtB;QAC7DpC,OAAOX,QAAQ6E,cAAc/C,IAAI,CAAC;IACpC;IAEApB,GAAG,2CAA2C;QAC5CC,OAAOnC,oBAAoBsD,IAAI,CAAC,OAAO;QACvCnB,OAAOlC,oBAAoBqD,IAAI,CAAC,IAAI,OAAO;IAC7C;AACF"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
5
|
+
import { AGENTS } from "../../utils/agents.js";
|
|
3
6
|
describe("AGENTS", ()=>{
|
|
4
7
|
it("includes Copilot as a startable agent", ()=>{
|
|
5
8
|
expect(AGENTS.copilot.command).toBe("copilot");
|
|
@@ -24,6 +27,67 @@ describe("AGENTS", ()=>{
|
|
|
24
27
|
expect(AGENTS.kiro.matches("/usr/local/bin/kiro --model x")).toBe(true);
|
|
25
28
|
expect(AGENTS.kiro.matches("node /repo/feature-kiro-adapter/script.js")).toBe(false);
|
|
26
29
|
});
|
|
30
|
+
it("matches Gemini as argv[0] or as a script argument", ()=>{
|
|
31
|
+
expect(AGENTS.gemini_cli.matches("gemini --yolo")).toBe(true);
|
|
32
|
+
expect(AGENTS.gemini_cli.matches("node --no-warnings /usr/local/bin/gemini")).toBe(true);
|
|
33
|
+
expect(AGENTS.gemini_cli.matches("node /repo/gemini-tools/script.js")).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe("AGENTS matchers with executables under paths containing spaces", ()=>{
|
|
37
|
+
let root;
|
|
38
|
+
function install(relativePath) {
|
|
39
|
+
const fullPath = path.join(root, relativePath);
|
|
40
|
+
fs.mkdirSync(path.dirname(fullPath), {
|
|
41
|
+
recursive: true
|
|
42
|
+
});
|
|
43
|
+
fs.writeFileSync(fullPath, "");
|
|
44
|
+
return fullPath;
|
|
45
|
+
}
|
|
46
|
+
beforeEach(()=>{
|
|
47
|
+
root = fs.mkdtempSync(path.join(os.tmpdir(), "agents-spaces-"));
|
|
48
|
+
});
|
|
49
|
+
afterEach(()=>{
|
|
50
|
+
fs.rmSync(root, {
|
|
51
|
+
recursive: true,
|
|
52
|
+
force: true
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
it("recognises argv[0] under a spaced directory (matchArgv0)", ()=>{
|
|
56
|
+
const codex = install("Applications/Some App.app/Contents/Resources/codex");
|
|
57
|
+
const claude = install("Users/dev/My Tools/bin/claude");
|
|
58
|
+
expect(AGENTS.codex.matches(`${codex} --sandbox workspace-write`)).toBe(true);
|
|
59
|
+
expect(AGENTS.codex.matches(codex)).toBe(true);
|
|
60
|
+
expect(AGENTS.claude.matches(`${claude} --continue`)).toBe(true);
|
|
61
|
+
expect(AGENTS.claude.matches(`${codex} exec --cd /repo`)).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
it("recognises argv[0] under a spaced directory by name (matchArgv0Name)", ()=>{
|
|
64
|
+
const copilot = install("opt/Home Brew/Caskroom/copilot-cli/1.0.60/copilot");
|
|
65
|
+
expect(AGENTS.copilot.matches(`${copilot} --allow-all-tools`)).toBe(true);
|
|
66
|
+
});
|
|
67
|
+
it("does not treat arguments containing spaces as the executable", ()=>{
|
|
68
|
+
const vim = install("usr/bin/vim");
|
|
69
|
+
const codex = install("Applications/Some App.app/Contents/Resources/codex");
|
|
70
|
+
expect(AGENTS.claude.matches(`${vim} My Notes/claude`)).toBe(false);
|
|
71
|
+
expect(AGENTS.claude.matches(`${codex} exec review the Other Dir/claude`)).toBe(false);
|
|
72
|
+
expect(AGENTS.copilot.matches(`${vim} Some Dir/copilot-cli/notes.md`)).toBe(false);
|
|
73
|
+
expect(AGENTS.claude.matches("/usr/bin/vim My Notes/claude")).toBe(false);
|
|
74
|
+
});
|
|
75
|
+
it("recognises a spaced argv[0] in the any-token matchers", ()=>{
|
|
76
|
+
const pi = install("Users/dev/Node Tools/bin/pi");
|
|
77
|
+
const kiro = install("Applications/Kiro CLI.app/Contents/MacOS/kiro-cli");
|
|
78
|
+
const node = install("Applications/Dev Tools/node/bin/node");
|
|
79
|
+
expect(AGENTS.pi.matches(`${pi} --model x`)).toBe(true);
|
|
80
|
+
expect(AGENTS.kiro.matches(`${kiro} chat`)).toBe(true);
|
|
81
|
+
expect(AGENTS.gemini_cli.matches(`${node} /Users/dev/.npm/bin/gemini --yolo`)).toBe(true);
|
|
82
|
+
expect(AGENTS.pi.matches(`${node} /opt/pi-tools/script.js`)).toBe(false);
|
|
83
|
+
});
|
|
84
|
+
it("does not match words inside a spaced argv[0] directory in the any-token matchers", ()=>{
|
|
85
|
+
const node = install("opt/Dev pi gemini/bin/node");
|
|
86
|
+
expect(AGENTS.pi.matches(`${node} /repo/script.js`)).toBe(false);
|
|
87
|
+
expect(AGENTS.gemini_cli.matches(`${node} /repo/script.js`)).toBe(false);
|
|
88
|
+
expect(AGENTS.gemini_cli.matches(`${node} /repo/bin/gemini`)).toBe(true);
|
|
89
|
+
expect(AGENTS.pi.matches(`${node} --title pi`)).toBe(true);
|
|
90
|
+
});
|
|
27
91
|
});
|
|
28
92
|
|
|
29
93
|
//# sourceMappingURL=agents.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/utils/agents.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { AGENTS } from \"
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/utils/agents.test.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { afterEach, beforeEach, describe, expect, it } from \"vitest\";\nimport { AGENTS } from \"../../utils/agents.js\";\n\ndescribe(\"AGENTS\", () => {\n it(\"includes Copilot as a startable agent\", () => {\n expect(AGENTS.copilot.command).toBe(\"copilot\");\n expect(AGENTS.copilot.matches(\"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\")).toBe(true);\n expect(AGENTS.copilot.matches(\"node /repo/feature-cli-copilot-cli/script.js\")).toBe(false);\n });\n\n it(\"includes Pi as a startable agent\", () => {\n expect(AGENTS.pi.command).toBe(\"pi\");\n expect(AGENTS.pi.matches(\"pi\")).toBe(true);\n expect(AGENTS.pi.matches(\"/usr/local/bin/pi --model x\")).toBe(true);\n expect(AGENTS.pi.matches(\"node /repo/feature-pi-adapter/script.js\")).toBe(false);\n });\n\n it(\"includes Grok as a startable agent\", () => {\n expect(AGENTS.grok_cli.command).toBe(\"grok\");\n expect(AGENTS.grok_cli.matches(\"grok\")).toBe(true);\n expect(AGENTS.grok_cli.matches(\"/Users/dev/.grok/bin/grok --always-approve\")).toBe(true);\n expect(AGENTS.grok_cli.matches(\"node /repo/feature-grok-cli/script.js\")).toBe(false);\n });\n\n it(\"includes Kiro as a startable agent\", () => {\n expect(AGENTS.kiro.command).toBe(\"kiro-cli\");\n expect(AGENTS.kiro.matches(\"kiro-cli\")).toBe(true);\n expect(AGENTS.kiro.matches(\"/usr/local/bin/kiro --model x\")).toBe(true);\n expect(AGENTS.kiro.matches(\"node /repo/feature-kiro-adapter/script.js\")).toBe(false);\n });\n\n it(\"matches Gemini as argv[0] or as a script argument\", () => {\n expect(AGENTS.gemini_cli.matches(\"gemini --yolo\")).toBe(true);\n expect(AGENTS.gemini_cli.matches(\"node --no-warnings /usr/local/bin/gemini\")).toBe(true);\n expect(AGENTS.gemini_cli.matches(\"node /repo/gemini-tools/script.js\")).toBe(false);\n });\n});\n\ndescribe(\"AGENTS matchers with executables under paths containing spaces\", () => {\n let root: string;\n\n function install(relativePath: string): string {\n const fullPath = path.join(root, relativePath);\n fs.mkdirSync(path.dirname(fullPath), { recursive: true });\n fs.writeFileSync(fullPath, \"\");\n return fullPath;\n }\n\n beforeEach(() => {\n root = fs.mkdtempSync(path.join(os.tmpdir(), \"agents-spaces-\"));\n });\n\n afterEach(() => {\n fs.rmSync(root, { recursive: true, force: true });\n });\n\n it(\"recognises argv[0] under a spaced directory (matchArgv0)\", () => {\n const codex = install(\"Applications/Some App.app/Contents/Resources/codex\");\n const claude = install(\"Users/dev/My Tools/bin/claude\");\n\n expect(AGENTS.codex.matches(`${codex} --sandbox workspace-write`)).toBe(true);\n expect(AGENTS.codex.matches(codex)).toBe(true);\n expect(AGENTS.claude.matches(`${claude} --continue`)).toBe(true);\n expect(AGENTS.claude.matches(`${codex} exec --cd /repo`)).toBe(false);\n });\n\n it(\"recognises argv[0] under a spaced directory by name (matchArgv0Name)\", () => {\n const copilot = install(\"opt/Home Brew/Caskroom/copilot-cli/1.0.60/copilot\");\n\n expect(AGENTS.copilot.matches(`${copilot} --allow-all-tools`)).toBe(true);\n });\n\n it(\"does not treat arguments containing spaces as the executable\", () => {\n const vim = install(\"usr/bin/vim\");\n const codex = install(\"Applications/Some App.app/Contents/Resources/codex\");\n\n expect(AGENTS.claude.matches(`${vim} My Notes/claude`)).toBe(false);\n expect(AGENTS.claude.matches(`${codex} exec review the Other Dir/claude`)).toBe(false);\n expect(AGENTS.copilot.matches(`${vim} Some Dir/copilot-cli/notes.md`)).toBe(false);\n expect(AGENTS.claude.matches(\"/usr/bin/vim My Notes/claude\")).toBe(false);\n });\n\n it(\"recognises a spaced argv[0] in the any-token matchers\", () => {\n const pi = install(\"Users/dev/Node Tools/bin/pi\");\n const kiro = install(\"Applications/Kiro CLI.app/Contents/MacOS/kiro-cli\");\n const node = install(\"Applications/Dev Tools/node/bin/node\");\n\n expect(AGENTS.pi.matches(`${pi} --model x`)).toBe(true);\n expect(AGENTS.kiro.matches(`${kiro} chat`)).toBe(true);\n expect(AGENTS.gemini_cli.matches(`${node} /Users/dev/.npm/bin/gemini --yolo`)).toBe(true);\n expect(AGENTS.pi.matches(`${node} /opt/pi-tools/script.js`)).toBe(false);\n });\n\n it(\"does not match words inside a spaced argv[0] directory in the any-token matchers\", () => {\n const node = install(\"opt/Dev pi gemini/bin/node\");\n\n expect(AGENTS.pi.matches(`${node} /repo/script.js`)).toBe(false);\n expect(AGENTS.gemini_cli.matches(`${node} /repo/script.js`)).toBe(false);\n expect(AGENTS.gemini_cli.matches(`${node} /repo/bin/gemini`)).toBe(true);\n expect(AGENTS.pi.matches(`${node} --title pi`)).toBe(true);\n });\n});\n"],"names":["fs","os","path","afterEach","beforeEach","describe","expect","it","AGENTS","copilot","command","toBe","matches","pi","grok_cli","kiro","gemini_cli","root","install","relativePath","fullPath","join","mkdirSync","dirname","recursive","writeFileSync","mkdtempSync","tmpdir","rmSync","force","codex","claude","vim","node"],"mappings":"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"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Large-transcript measurement for `getConversation({ tail })` (issue #260).
|
|
3
|
+
*
|
|
4
|
+
* Skipped by default. Run with:
|
|
5
|
+
* AI_DEVKIT_TAIL_BENCH=1 npx vitest run src/__tests__/utils/conversationTail.bench.test.ts
|
|
6
|
+
*
|
|
7
|
+
* Generates a synthetic ~400 MB transcript per adapter under os.tmpdir(),
|
|
8
|
+
* counts bytes read through `fs`, and checks the acceptance limits: the first
|
|
9
|
+
* tail read reads <= 2 MB in <= 50 ms, and a poll after appending K bytes
|
|
10
|
+
* reads <= K + 64 KiB. The file is deleted afterwards.
|
|
11
|
+
*/ import * as fs from "fs";
|
|
12
|
+
import * as os from "os";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
15
|
+
import { ClaudeSessionParser } from "../../harnesses/claude/ClaudeSessionParser.js";
|
|
16
|
+
import { CodexSessionParser } from "../../harnesses/codex/CodexSessionParser.js";
|
|
17
|
+
const readBytes = vi.hoisted(()=>({
|
|
18
|
+
total: 0
|
|
19
|
+
}));
|
|
20
|
+
vi.mock("fs", async (importOriginal)=>{
|
|
21
|
+
const actual = await importOriginal();
|
|
22
|
+
const readSync = (...args)=>{
|
|
23
|
+
const n = actual.readSync(...args);
|
|
24
|
+
readBytes.total += n;
|
|
25
|
+
return n;
|
|
26
|
+
};
|
|
27
|
+
const readFileSync = (...args)=>{
|
|
28
|
+
const out = actual.readFileSync(...args);
|
|
29
|
+
readBytes.total += typeof out === "string" ? Buffer.byteLength(out) : out.length;
|
|
30
|
+
return out;
|
|
31
|
+
};
|
|
32
|
+
return {
|
|
33
|
+
...actual,
|
|
34
|
+
readSync,
|
|
35
|
+
readFileSync,
|
|
36
|
+
default: {
|
|
37
|
+
...actual,
|
|
38
|
+
readSync,
|
|
39
|
+
readFileSync
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
const TARGET_BYTES = 400 * 1024 * 1024;
|
|
44
|
+
const TAIL = 20;
|
|
45
|
+
const MB = 1024 * 1024;
|
|
46
|
+
function writeLargeFile(file, header, turn) {
|
|
47
|
+
const fd = fs.openSync(file, "w");
|
|
48
|
+
try {
|
|
49
|
+
fs.writeSync(fd, header.map((l)=>l + "\n").join(""));
|
|
50
|
+
let written = 0;
|
|
51
|
+
let i = 0;
|
|
52
|
+
while(written < TARGET_BYTES){
|
|
53
|
+
const parts = [];
|
|
54
|
+
for(let k = 0; k < 500; k++, i++){
|
|
55
|
+
for (const line of turn(i))parts.push(line, "\n");
|
|
56
|
+
}
|
|
57
|
+
const block = parts.join("");
|
|
58
|
+
fs.writeSync(fd, block);
|
|
59
|
+
written += Buffer.byteLength(block);
|
|
60
|
+
}
|
|
61
|
+
} finally{
|
|
62
|
+
fs.closeSync(fd);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const filler = "x".repeat(2000);
|
|
66
|
+
const adapters = [
|
|
67
|
+
{
|
|
68
|
+
name: "codex",
|
|
69
|
+
create: ()=>new CodexSessionParser(),
|
|
70
|
+
header: [
|
|
71
|
+
JSON.stringify({
|
|
72
|
+
type: "session_meta",
|
|
73
|
+
payload: {
|
|
74
|
+
id: "bench",
|
|
75
|
+
cwd: "/repo"
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
],
|
|
79
|
+
turn: (i)=>{
|
|
80
|
+
const turnId = `t${i}`;
|
|
81
|
+
return [
|
|
82
|
+
JSON.stringify({
|
|
83
|
+
type: "response_item",
|
|
84
|
+
timestamp: "2026-01-01T00:00:00Z",
|
|
85
|
+
payload: {
|
|
86
|
+
type: "message",
|
|
87
|
+
role: "user",
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: "input_text",
|
|
91
|
+
text: `question ${i}`
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
internal_chat_message_metadata_passthrough: {
|
|
95
|
+
turn_id: turnId
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}),
|
|
99
|
+
JSON.stringify({
|
|
100
|
+
type: "event_msg",
|
|
101
|
+
payload: {
|
|
102
|
+
type: "item_completed",
|
|
103
|
+
turn_id: turnId,
|
|
104
|
+
item: {
|
|
105
|
+
type: "UserMessage",
|
|
106
|
+
content: [
|
|
107
|
+
{
|
|
108
|
+
type: "text",
|
|
109
|
+
text: `question ${i}`
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}),
|
|
115
|
+
JSON.stringify({
|
|
116
|
+
type: "response_item",
|
|
117
|
+
payload: {
|
|
118
|
+
type: "function_call_output",
|
|
119
|
+
output: filler
|
|
120
|
+
}
|
|
121
|
+
}),
|
|
122
|
+
JSON.stringify({
|
|
123
|
+
type: "event_msg",
|
|
124
|
+
payload: {
|
|
125
|
+
type: "agent_message",
|
|
126
|
+
message: `answer ${i}`
|
|
127
|
+
}
|
|
128
|
+
})
|
|
129
|
+
];
|
|
130
|
+
},
|
|
131
|
+
appendTurn: (i)=>JSON.stringify({
|
|
132
|
+
type: "event_msg",
|
|
133
|
+
payload: {
|
|
134
|
+
type: "agent_message",
|
|
135
|
+
message: `appended ${i}`
|
|
136
|
+
}
|
|
137
|
+
})
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
name: "claude",
|
|
141
|
+
create: ()=>new ClaudeSessionParser(),
|
|
142
|
+
header: [
|
|
143
|
+
JSON.stringify({
|
|
144
|
+
type: "file-history-snapshot",
|
|
145
|
+
snapshot: {}
|
|
146
|
+
})
|
|
147
|
+
],
|
|
148
|
+
turn: (i)=>[
|
|
149
|
+
JSON.stringify({
|
|
150
|
+
type: "user",
|
|
151
|
+
message: {
|
|
152
|
+
content: `question ${i}`
|
|
153
|
+
}
|
|
154
|
+
}),
|
|
155
|
+
JSON.stringify({
|
|
156
|
+
type: "assistant",
|
|
157
|
+
message: {
|
|
158
|
+
content: [
|
|
159
|
+
{
|
|
160
|
+
type: "tool_use",
|
|
161
|
+
name: "Bash",
|
|
162
|
+
input: {
|
|
163
|
+
command: "ls"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
}),
|
|
169
|
+
JSON.stringify({
|
|
170
|
+
type: "user",
|
|
171
|
+
message: {
|
|
172
|
+
content: [
|
|
173
|
+
{
|
|
174
|
+
type: "tool_result",
|
|
175
|
+
content: filler
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
}),
|
|
180
|
+
JSON.stringify({
|
|
181
|
+
type: "assistant",
|
|
182
|
+
message: {
|
|
183
|
+
content: [
|
|
184
|
+
{
|
|
185
|
+
type: "text",
|
|
186
|
+
text: `answer ${i}`
|
|
187
|
+
}
|
|
188
|
+
]
|
|
189
|
+
}
|
|
190
|
+
})
|
|
191
|
+
],
|
|
192
|
+
appendTurn: (i)=>JSON.stringify({
|
|
193
|
+
type: "assistant",
|
|
194
|
+
message: {
|
|
195
|
+
content: [
|
|
196
|
+
{
|
|
197
|
+
type: "text",
|
|
198
|
+
text: `appended ${i}`
|
|
199
|
+
}
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
})
|
|
203
|
+
}
|
|
204
|
+
];
|
|
205
|
+
describe.skipIf(!process.env.AI_DEVKIT_TAIL_BENCH)("getConversation tail on a 400 MB transcript", ()=>{
|
|
206
|
+
let tmpDir;
|
|
207
|
+
beforeAll(()=>{
|
|
208
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "tail-bench-"));
|
|
209
|
+
});
|
|
210
|
+
afterAll(()=>{
|
|
211
|
+
fs.rmSync(tmpDir, {
|
|
212
|
+
recursive: true,
|
|
213
|
+
force: true
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
it.each(adapters)("$name: first call and incremental polls stay within the byte/time budget", (adapter)=>{
|
|
217
|
+
const file = path.join(tmpDir, `${adapter.name}.jsonl`);
|
|
218
|
+
writeLargeFile(file, adapter.header, adapter.turn);
|
|
219
|
+
const size = fs.statSync(file).size;
|
|
220
|
+
expect(size).toBeGreaterThanOrEqual(TARGET_BYTES);
|
|
221
|
+
const parser = adapter.create();
|
|
222
|
+
readBytes.total = 0;
|
|
223
|
+
const rssBefore = process.memoryUsage().rss;
|
|
224
|
+
const start = performance.now();
|
|
225
|
+
const messages = parser.getConversation(file, {
|
|
226
|
+
tail: TAIL
|
|
227
|
+
});
|
|
228
|
+
const firstMs = performance.now() - start;
|
|
229
|
+
const firstRead = readBytes.total;
|
|
230
|
+
const rssDelta = process.memoryUsage().rss - rssBefore;
|
|
231
|
+
expect(messages).toHaveLength(TAIL);
|
|
232
|
+
expect(messages.at(-1)?.content).toMatch(/^answer \d+$/);
|
|
233
|
+
const polls = [];
|
|
234
|
+
for(let round = 0; round < 3; round++){
|
|
235
|
+
const appended = adapter.appendTurn(round) + "\n";
|
|
236
|
+
fs.appendFileSync(file, appended);
|
|
237
|
+
readBytes.total = 0;
|
|
238
|
+
const t0 = performance.now();
|
|
239
|
+
const next = parser.getConversation(file, {
|
|
240
|
+
tail: TAIL
|
|
241
|
+
});
|
|
242
|
+
const pollMs = performance.now() - t0;
|
|
243
|
+
expect(next.at(-1)?.content).toBe(`appended ${round}`);
|
|
244
|
+
expect(next).toHaveLength(TAIL);
|
|
245
|
+
const k = Buffer.byteLength(appended);
|
|
246
|
+
expect(readBytes.total).toBeLessThanOrEqual(k + 64 * 1024);
|
|
247
|
+
polls.push(`K=${k}B read=${readBytes.total}B ${pollMs.toFixed(2)}ms`);
|
|
248
|
+
}
|
|
249
|
+
console.log(`[${adapter.name}] file=${(size / MB).toFixed(1)} MB first call: ` + `read=${(firstRead / 1024).toFixed(1)} KiB, ${firstMs.toFixed(2)} ms, ` + `rssDelta=${(rssDelta / MB).toFixed(1)} MB; polls: ${polls.join("; ")}`);
|
|
250
|
+
expect(firstRead).toBeLessThanOrEqual(2 * MB);
|
|
251
|
+
expect(firstMs).toBeLessThanOrEqual(50);
|
|
252
|
+
fs.rmSync(file, {
|
|
253
|
+
force: true
|
|
254
|
+
});
|
|
255
|
+
}, 120_000);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
//# sourceMappingURL=conversationTail.bench.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/utils/conversationTail.bench.test.ts"],"sourcesContent":["/**\n * Large-transcript measurement for `getConversation({ tail })` (issue #260).\n *\n * Skipped by default. Run with:\n * AI_DEVKIT_TAIL_BENCH=1 npx vitest run src/__tests__/utils/conversationTail.bench.test.ts\n *\n * Generates a synthetic ~400 MB transcript per adapter under os.tmpdir(),\n * counts bytes read through `fs`, and checks the acceptance limits: the first\n * tail read reads <= 2 MB in <= 50 ms, and a poll after appending K bytes\n * reads <= K + 64 KiB. The file is deleted afterwards.\n */\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { afterAll, beforeAll, describe, expect, it, vi } from \"vitest\";\nimport { ClaudeSessionParser } from \"../../harnesses/claude/ClaudeSessionParser.js\";\nimport { CodexSessionParser } from \"../../harnesses/codex/CodexSessionParser.js\";\n\nconst readBytes = vi.hoisted(() => ({ total: 0 }));\n\nvi.mock(\"fs\", async (importOriginal) => {\n const actual = await importOriginal<typeof import(\"fs\")>();\n const readSync = ((...args: Parameters<typeof actual.readSync>) => {\n const n = (actual.readSync as (...a: unknown[]) => number)(...args);\n readBytes.total += n;\n return n;\n }) as typeof actual.readSync;\n const readFileSync = ((...args: Parameters<typeof actual.readFileSync>) => {\n const out = (actual.readFileSync as (...a: unknown[]) => string | Buffer)(...args);\n readBytes.total += typeof out === \"string\" ? Buffer.byteLength(out) : out.length;\n return out;\n }) as typeof actual.readFileSync;\n return { ...actual, readSync, readFileSync, default: { ...actual, readSync, readFileSync } };\n});\n\nconst TARGET_BYTES = 400 * 1024 * 1024;\nconst TAIL = 20;\nconst MB = 1024 * 1024;\n\nfunction writeLargeFile(file: string, header: string[], turn: (i: number) => string[]): void {\n const fd = fs.openSync(file, \"w\");\n try {\n fs.writeSync(fd, header.map((l) => l + \"\\n\").join(\"\"));\n let written = 0;\n let i = 0;\n while (written < TARGET_BYTES) {\n const parts: string[] = [];\n for (let k = 0; k < 500; k++, i++) {\n for (const line of turn(i)) parts.push(line, \"\\n\");\n }\n const block = parts.join(\"\");\n fs.writeSync(fd, block);\n written += Buffer.byteLength(block);\n }\n } finally {\n fs.closeSync(fd);\n }\n}\n\nconst filler = \"x\".repeat(2000);\n\nconst adapters = [\n {\n name: \"codex\",\n create: () => new CodexSessionParser(),\n header: [JSON.stringify({ type: \"session_meta\", payload: { id: \"bench\", cwd: \"/repo\" } })],\n turn: (i: number) => {\n const turnId = `t${i}`;\n return [\n JSON.stringify({\n type: \"response_item\",\n timestamp: \"2026-01-01T00:00:00Z\",\n payload: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text: `question ${i}` }],\n internal_chat_message_metadata_passthrough: { turn_id: turnId },\n },\n }),\n JSON.stringify({\n type: \"event_msg\",\n payload: {\n type: \"item_completed\",\n turn_id: turnId,\n item: { type: \"UserMessage\", content: [{ type: \"text\", text: `question ${i}` }] },\n },\n }),\n JSON.stringify({\n type: \"response_item\",\n payload: { type: \"function_call_output\", output: filler },\n }),\n JSON.stringify({\n type: \"event_msg\",\n payload: { type: \"agent_message\", message: `answer ${i}` },\n }),\n ];\n },\n appendTurn: (i: number) =>\n JSON.stringify({\n type: \"event_msg\",\n payload: { type: \"agent_message\", message: `appended ${i}` },\n }),\n },\n {\n name: \"claude\",\n create: () => new ClaudeSessionParser(),\n header: [JSON.stringify({ type: \"file-history-snapshot\", snapshot: {} })],\n turn: (i: number) => [\n JSON.stringify({ type: \"user\", message: { content: `question ${i}` } }),\n JSON.stringify({\n type: \"assistant\",\n message: { content: [{ type: \"tool_use\", name: \"Bash\", input: { command: \"ls\" } }] },\n }),\n JSON.stringify({\n type: \"user\",\n message: { content: [{ type: \"tool_result\", content: filler }] },\n }),\n JSON.stringify({\n type: \"assistant\",\n message: { content: [{ type: \"text\", text: `answer ${i}` }] },\n }),\n ],\n appendTurn: (i: number) =>\n JSON.stringify({\n type: \"assistant\",\n message: { content: [{ type: \"text\", text: `appended ${i}` }] },\n }),\n },\n];\n\ndescribe.skipIf(!process.env.AI_DEVKIT_TAIL_BENCH)(\n \"getConversation tail on a 400 MB transcript\",\n () => {\n let tmpDir: string;\n\n beforeAll(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"tail-bench-\"));\n });\n\n afterAll(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it.each(adapters)(\n \"$name: first call and incremental polls stay within the byte/time budget\",\n (adapter) => {\n const file = path.join(tmpDir, `${adapter.name}.jsonl`);\n writeLargeFile(file, adapter.header, adapter.turn);\n const size = fs.statSync(file).size;\n expect(size).toBeGreaterThanOrEqual(TARGET_BYTES);\n\n const parser = adapter.create();\n readBytes.total = 0;\n const rssBefore = process.memoryUsage().rss;\n const start = performance.now();\n const messages = parser.getConversation(file, { tail: TAIL });\n const firstMs = performance.now() - start;\n const firstRead = readBytes.total;\n const rssDelta = process.memoryUsage().rss - rssBefore;\n\n expect(messages).toHaveLength(TAIL);\n expect(messages.at(-1)?.content).toMatch(/^answer \\d+$/);\n\n const polls: string[] = [];\n for (let round = 0; round < 3; round++) {\n const appended = adapter.appendTurn(round) + \"\\n\";\n fs.appendFileSync(file, appended);\n readBytes.total = 0;\n const t0 = performance.now();\n const next = parser.getConversation(file, { tail: TAIL });\n const pollMs = performance.now() - t0;\n expect(next.at(-1)?.content).toBe(`appended ${round}`);\n expect(next).toHaveLength(TAIL);\n const k = Buffer.byteLength(appended);\n expect(readBytes.total).toBeLessThanOrEqual(k + 64 * 1024);\n polls.push(`K=${k}B read=${readBytes.total}B ${pollMs.toFixed(2)}ms`);\n }\n\n console.log(\n `[${adapter.name}] file=${(size / MB).toFixed(1)} MB first call: ` +\n `read=${(firstRead / 1024).toFixed(1)} KiB, ${firstMs.toFixed(2)} ms, ` +\n `rssDelta=${(rssDelta / MB).toFixed(1)} MB; polls: ${polls.join(\"; \")}`,\n );\n\n expect(firstRead).toBeLessThanOrEqual(2 * MB);\n expect(firstMs).toBeLessThanOrEqual(50);\n\n fs.rmSync(file, { force: true });\n },\n 120_000,\n );\n },\n);\n"],"names":["fs","os","path","afterAll","beforeAll","describe","expect","it","vi","ClaudeSessionParser","CodexSessionParser","readBytes","hoisted","total","mock","importOriginal","actual","readSync","args","n","readFileSync","out","Buffer","byteLength","length","default","TARGET_BYTES","TAIL","MB","writeLargeFile","file","header","turn","fd","openSync","writeSync","map","l","join","written","i","parts","k","line","push","block","closeSync","filler","repeat","adapters","name","create","JSON","stringify","type","payload","id","cwd","turnId","timestamp","role","content","text","internal_chat_message_metadata_passthrough","turn_id","item","output","message","appendTurn","snapshot","input","command","skipIf","process","env","AI_DEVKIT_TAIL_BENCH","tmpDir","mkdtempSync","tmpdir","rmSync","recursive","force","each","adapter","size","statSync","toBeGreaterThanOrEqual","parser","rssBefore","memoryUsage","rss","start","performance","now","messages","getConversation","tail","firstMs","firstRead","rssDelta","toHaveLength","at","toMatch","polls","round","appended","appendFileSync","t0","next","pollMs","toBe","toBeLessThanOrEqual","toFixed","console","log"],"mappings":"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"}
|