@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,463 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { CodexSessionLocator } from "../../../harnesses/codex/CodexSessionLocator.js";
|
|
5
|
+
import { batchGetSessionFileBirthtimes } from "../../../utils/session.js";
|
|
6
|
+
import { matchProcessesToSessions } from "../../../utils/matching.js";
|
|
7
|
+
vi.mock("fs", async ()=>{
|
|
8
|
+
const actual = await vi.importActual("fs");
|
|
9
|
+
const wrapped = {
|
|
10
|
+
...actual,
|
|
11
|
+
readSync: vi.fn(actual.readSync),
|
|
12
|
+
readFileSync: vi.fn(actual.readFileSync)
|
|
13
|
+
};
|
|
14
|
+
return {
|
|
15
|
+
...wrapped,
|
|
16
|
+
default: wrapped
|
|
17
|
+
};
|
|
18
|
+
});
|
|
19
|
+
vi.mock("../../../utils/session.js", async ()=>{
|
|
20
|
+
const actual = await vi.importActual("../../../utils/session");
|
|
21
|
+
return {
|
|
22
|
+
...actual,
|
|
23
|
+
batchGetSessionFileBirthtimes: vi.fn()
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
vi.mock("../../../utils/matching.js", async ()=>{
|
|
27
|
+
const actual = await vi.importActual("../../../utils/matching");
|
|
28
|
+
return {
|
|
29
|
+
...actual,
|
|
30
|
+
matchProcessesToSessions: vi.fn()
|
|
31
|
+
};
|
|
32
|
+
});
|
|
33
|
+
const mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes;
|
|
34
|
+
const mockedMatchProcessesToSessions = matchProcessesToSessions;
|
|
35
|
+
describe("CodexSessionLocator", ()=>{
|
|
36
|
+
let tmpDir;
|
|
37
|
+
let sessionsDir;
|
|
38
|
+
let locator;
|
|
39
|
+
beforeEach(()=>{
|
|
40
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "codex-locator-"));
|
|
41
|
+
sessionsDir = path.join(tmpDir, "sessions");
|
|
42
|
+
locator = new CodexSessionLocator({
|
|
43
|
+
sessionsDir
|
|
44
|
+
});
|
|
45
|
+
mockedBatchGetSessionFileBirthtimes.mockReset();
|
|
46
|
+
mockedMatchProcessesToSessions.mockReset();
|
|
47
|
+
});
|
|
48
|
+
afterEach(()=>{
|
|
49
|
+
fs.rmSync(tmpDir, {
|
|
50
|
+
recursive: true,
|
|
51
|
+
force: true
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
it("discovers live sessions from the process start day window and applies session_meta cwd and timestamp", ()=>{
|
|
55
|
+
const dateDir = path.join(sessionsDir, "2026", "03", "18");
|
|
56
|
+
fs.mkdirSync(dateDir, {
|
|
57
|
+
recursive: true
|
|
58
|
+
});
|
|
59
|
+
const sessionFile = path.join(dateDir, "sess-meta-time.jsonl");
|
|
60
|
+
fs.writeFileSync(sessionFile, JSON.stringify({
|
|
61
|
+
type: "session_meta",
|
|
62
|
+
payload: {
|
|
63
|
+
id: "sess-meta-time",
|
|
64
|
+
timestamp: "2026-03-18T15:00:05.000Z",
|
|
65
|
+
cwd: "/repo-a"
|
|
66
|
+
}
|
|
67
|
+
}));
|
|
68
|
+
mockedBatchGetSessionFileBirthtimes.mockReturnValue([
|
|
69
|
+
{
|
|
70
|
+
sessionId: "sess-meta-time",
|
|
71
|
+
filePath: sessionFile,
|
|
72
|
+
projectDir: dateDir,
|
|
73
|
+
birthtimeMs: new Date("2026-03-18T15:05:30.000Z").getTime(),
|
|
74
|
+
resolvedCwd: ""
|
|
75
|
+
}
|
|
76
|
+
]);
|
|
77
|
+
const result = locator.discoverLiveSessions([
|
|
78
|
+
{
|
|
79
|
+
pid: 1,
|
|
80
|
+
command: "codex",
|
|
81
|
+
cwd: "/repo-a",
|
|
82
|
+
tty: "",
|
|
83
|
+
startTime: new Date("2026-03-18T15:00:00Z")
|
|
84
|
+
}
|
|
85
|
+
]);
|
|
86
|
+
expect(result.sessions).toHaveLength(1);
|
|
87
|
+
expect(result.sessions[0]).toMatchObject({
|
|
88
|
+
resolvedCwd: "/repo-a",
|
|
89
|
+
birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime()
|
|
90
|
+
});
|
|
91
|
+
expect(result).not.toHaveProperty("contentCache");
|
|
92
|
+
expect(mockedBatchGetSessionFileBirthtimes.mock.calls[0][0]).toEqual([
|
|
93
|
+
dateDir
|
|
94
|
+
]);
|
|
95
|
+
});
|
|
96
|
+
it("matches resumed UUIDv7 sessions directly without legacy matching", ()=>{
|
|
97
|
+
const sessionId = "019eabed-4079-7071-9531-b853ddd9914e";
|
|
98
|
+
const sessionFile = writeSession(sessionId, "2026/06/09");
|
|
99
|
+
const processInfo = {
|
|
100
|
+
pid: 88018,
|
|
101
|
+
command: `codex resume ${sessionId}`,
|
|
102
|
+
cwd: "/repo-a",
|
|
103
|
+
tty: "ttys001",
|
|
104
|
+
startTime: new Date("2026-06-10T12:00:00.000Z")
|
|
105
|
+
};
|
|
106
|
+
const result = locator.matchRunningProcesses([
|
|
107
|
+
processInfo
|
|
108
|
+
]);
|
|
109
|
+
expect(result.direct).toHaveLength(1);
|
|
110
|
+
expect(result.direct[0]).toMatchObject({
|
|
111
|
+
process: processInfo,
|
|
112
|
+
sessionFile: {
|
|
113
|
+
sessionId,
|
|
114
|
+
filePath: sessionFile,
|
|
115
|
+
resolvedCwd: "/repo-a"
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
expect(result.fallback).toEqual([]);
|
|
119
|
+
expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();
|
|
120
|
+
expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();
|
|
121
|
+
});
|
|
122
|
+
it("falls back to walking all session files for non-time-sortable resume ids", ()=>{
|
|
123
|
+
const sessionId = "aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee";
|
|
124
|
+
const sessionFile = writeSession(sessionId, "2026/01/02");
|
|
125
|
+
const result = locator.matchRunningProcesses([
|
|
126
|
+
{
|
|
127
|
+
pid: 42,
|
|
128
|
+
command: `codex resume ${sessionId}`,
|
|
129
|
+
cwd: "/repo-a",
|
|
130
|
+
tty: "ttys001"
|
|
131
|
+
}
|
|
132
|
+
]);
|
|
133
|
+
expect(result.direct[0].sessionFile.filePath).toBe(sessionFile);
|
|
134
|
+
});
|
|
135
|
+
it("passes unmatched processes and discovered sessions to legacy matching", ()=>{
|
|
136
|
+
const dateDir = path.join(sessionsDir, "2026", "03", "18");
|
|
137
|
+
fs.mkdirSync(dateDir, {
|
|
138
|
+
recursive: true
|
|
139
|
+
});
|
|
140
|
+
const candidate = {
|
|
141
|
+
sessionId: "sess",
|
|
142
|
+
filePath: path.join(dateDir, "sess.jsonl"),
|
|
143
|
+
projectDir: dateDir,
|
|
144
|
+
birthtimeMs: new Date("2026-03-18T15:00:05Z").getTime(),
|
|
145
|
+
resolvedCwd: ""
|
|
146
|
+
};
|
|
147
|
+
fs.writeFileSync(candidate.filePath, JSON.stringify({
|
|
148
|
+
type: "session_meta",
|
|
149
|
+
payload: {
|
|
150
|
+
id: "sess",
|
|
151
|
+
cwd: "/repo-a",
|
|
152
|
+
timestamp: "2026-03-18T15:00:05Z"
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
const processInfo = {
|
|
156
|
+
pid: 100,
|
|
157
|
+
command: "codex",
|
|
158
|
+
cwd: "/repo-a",
|
|
159
|
+
tty: "ttys001",
|
|
160
|
+
startTime: new Date("2026-03-18T15:00:00Z")
|
|
161
|
+
};
|
|
162
|
+
const legacyMatch = {
|
|
163
|
+
process: processInfo,
|
|
164
|
+
session: {
|
|
165
|
+
...candidate,
|
|
166
|
+
resolvedCwd: "/repo-a"
|
|
167
|
+
},
|
|
168
|
+
deltaMs: 5000
|
|
169
|
+
};
|
|
170
|
+
mockedBatchGetSessionFileBirthtimes.mockReturnValue([
|
|
171
|
+
candidate
|
|
172
|
+
]);
|
|
173
|
+
mockedMatchProcessesToSessions.mockReturnValue([
|
|
174
|
+
legacyMatch
|
|
175
|
+
]);
|
|
176
|
+
const result = locator.matchRunningProcesses([
|
|
177
|
+
processInfo
|
|
178
|
+
]);
|
|
179
|
+
expect(result.direct).toEqual([]);
|
|
180
|
+
expect(result.fallback).toEqual([
|
|
181
|
+
processInfo
|
|
182
|
+
]);
|
|
183
|
+
expect(result.legacyMatches).toEqual([
|
|
184
|
+
legacyMatch
|
|
185
|
+
]);
|
|
186
|
+
expect(result).not.toHaveProperty("contentCache");
|
|
187
|
+
});
|
|
188
|
+
describe("bounded session_meta discovery", ()=>{
|
|
189
|
+
const HEAD_LIMIT_BYTES = 64 * 1024;
|
|
190
|
+
const dayDirParts = [
|
|
191
|
+
"2026",
|
|
192
|
+
"03",
|
|
193
|
+
"18"
|
|
194
|
+
];
|
|
195
|
+
const mockedReadSync = fs.readSync;
|
|
196
|
+
const mockedReadFileSync = fs.readFileSync;
|
|
197
|
+
let dateDir;
|
|
198
|
+
let nowMs;
|
|
199
|
+
let actualBatch;
|
|
200
|
+
const processInfo = {
|
|
201
|
+
pid: 4242,
|
|
202
|
+
command: "codex",
|
|
203
|
+
cwd: "/repo-a",
|
|
204
|
+
tty: "ttys009",
|
|
205
|
+
startTime: new Date("2026-03-18T15:00:00Z")
|
|
206
|
+
};
|
|
207
|
+
beforeEach(async ()=>{
|
|
208
|
+
dateDir = path.join(sessionsDir, ...dayDirParts);
|
|
209
|
+
fs.mkdirSync(dateDir, {
|
|
210
|
+
recursive: true
|
|
211
|
+
});
|
|
212
|
+
nowMs = new Date("2026-03-18T16:00:00Z").getTime();
|
|
213
|
+
locator = new CodexSessionLocator({
|
|
214
|
+
sessionsDir,
|
|
215
|
+
now: ()=>nowMs
|
|
216
|
+
});
|
|
217
|
+
actualBatch = (await vi.importActual("../../../utils/session")).batchGetSessionFileBirthtimes;
|
|
218
|
+
mockedBatchGetSessionFileBirthtimes.mockImplementation(actualBatch);
|
|
219
|
+
mockedMatchProcessesToSessions.mockReturnValue([]);
|
|
220
|
+
mockedReadSync.mockClear();
|
|
221
|
+
mockedReadFileSync.mockClear();
|
|
222
|
+
});
|
|
223
|
+
it("reads at most 64 KiB of a 100 MB session file", ()=>{
|
|
224
|
+
const filePath = writeMetaSession("big", "/repo-big", 100 * 1024 * 1024);
|
|
225
|
+
const { sessions } = locator.discoverSessionFilesInDateDirs([
|
|
226
|
+
dateDir
|
|
227
|
+
]);
|
|
228
|
+
expect(sessions).toHaveLength(1);
|
|
229
|
+
expect(sessions[0]).toMatchObject({
|
|
230
|
+
filePath,
|
|
231
|
+
resolvedCwd: "/repo-big",
|
|
232
|
+
birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime()
|
|
233
|
+
});
|
|
234
|
+
expect(bytesRead()).toBeGreaterThan(0);
|
|
235
|
+
expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);
|
|
236
|
+
});
|
|
237
|
+
it("extracts cwd and timestamp when the session_meta line exceeds 64 KiB", ()=>{
|
|
238
|
+
const filePath = path.join(dateDir, "long-meta.jsonl");
|
|
239
|
+
fs.writeFileSync(filePath, JSON.stringify({
|
|
240
|
+
timestamp: "2026-03-18T15:00:04.000Z",
|
|
241
|
+
type: "session_meta",
|
|
242
|
+
payload: {
|
|
243
|
+
id: "long-meta",
|
|
244
|
+
timestamp: "2026-03-18T15:00:05.000Z",
|
|
245
|
+
cwd: '/repo "quoted"',
|
|
246
|
+
instructions: "x".repeat(300 * 1024)
|
|
247
|
+
}
|
|
248
|
+
}) + "\n");
|
|
249
|
+
const { sessions } = locator.discoverSessionFilesInDateDirs([
|
|
250
|
+
dateDir
|
|
251
|
+
]);
|
|
252
|
+
expect(sessions[0]).toMatchObject({
|
|
253
|
+
resolvedCwd: '/repo "quoted"',
|
|
254
|
+
birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime()
|
|
255
|
+
});
|
|
256
|
+
expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);
|
|
257
|
+
});
|
|
258
|
+
it("leaves files without a session_meta first line unresolved", ()=>{
|
|
259
|
+
const filePath = path.join(dateDir, "not-meta.jsonl");
|
|
260
|
+
fs.writeFileSync(filePath, JSON.stringify({
|
|
261
|
+
type: "event",
|
|
262
|
+
payload: {
|
|
263
|
+
cwd: "/x"
|
|
264
|
+
}
|
|
265
|
+
}) + "\n");
|
|
266
|
+
const birthtimeMs = fs.statSync(filePath).birthtimeMs;
|
|
267
|
+
const { sessions } = locator.discoverSessionFilesInDateDirs([
|
|
268
|
+
dateDir
|
|
269
|
+
]);
|
|
270
|
+
expect(sessions[0]).toMatchObject({
|
|
271
|
+
resolvedCwd: "",
|
|
272
|
+
birthtimeMs
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
it("reads 0 bytes on later refreshes while session files only grow", ()=>{
|
|
276
|
+
const filePath = writeMetaSession("grow", "/repo-a");
|
|
277
|
+
mockedMatchProcessesToSessions.mockImplementation((_procs, sessions)=>[
|
|
278
|
+
{
|
|
279
|
+
process: processInfo,
|
|
280
|
+
session: sessions[0],
|
|
281
|
+
deltaMs: 5000
|
|
282
|
+
}
|
|
283
|
+
]);
|
|
284
|
+
const first = locator.matchRunningProcesses([
|
|
285
|
+
processInfo
|
|
286
|
+
]);
|
|
287
|
+
expect(first.legacyMatches).toHaveLength(1);
|
|
288
|
+
expect(bytesRead()).toBeGreaterThan(0);
|
|
289
|
+
fs.appendFileSync(filePath, JSON.stringify({
|
|
290
|
+
type: "event",
|
|
291
|
+
payload: {}
|
|
292
|
+
}) + "\n");
|
|
293
|
+
mockedReadSync.mockClear();
|
|
294
|
+
mockedReadFileSync.mockClear();
|
|
295
|
+
const second = locator.matchRunningProcesses([
|
|
296
|
+
processInfo
|
|
297
|
+
]);
|
|
298
|
+
expect(second.legacyMatches).toHaveLength(1);
|
|
299
|
+
expect(second.legacyMatches[0].session).toMatchObject({
|
|
300
|
+
filePath,
|
|
301
|
+
resolvedCwd: "/repo-a",
|
|
302
|
+
birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime()
|
|
303
|
+
});
|
|
304
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
|
|
305
|
+
expect(bytesRead()).toBe(0);
|
|
306
|
+
});
|
|
307
|
+
it("rereads a session head when the file is replaced", ()=>{
|
|
308
|
+
const filePath = writeMetaSession("replaced", "/repo-old");
|
|
309
|
+
locator.discoverSessionFilesInDateDirs([
|
|
310
|
+
dateDir
|
|
311
|
+
]);
|
|
312
|
+
const tmpFile = path.join(tmpDir, "replacement.jsonl");
|
|
313
|
+
fs.writeFileSync(tmpFile, metaLine("replaced", "/repo-new") + "\n");
|
|
314
|
+
fs.renameSync(tmpFile, filePath);
|
|
315
|
+
mockedReadSync.mockClear();
|
|
316
|
+
const { sessions } = locator.discoverSessionFilesInDateDirs([
|
|
317
|
+
dateDir
|
|
318
|
+
]);
|
|
319
|
+
expect(sessions[0].resolvedCwd).toBe("/repo-new");
|
|
320
|
+
expect(bytesRead()).toBeGreaterThan(0);
|
|
321
|
+
});
|
|
322
|
+
it("does not rescan an unmatched process until its date directories change", ()=>{
|
|
323
|
+
writeMetaSession("other", "/repo-other");
|
|
324
|
+
setDirMtime(dateDir, new Date("2026-01-01T00:00:00Z"));
|
|
325
|
+
const first = locator.matchRunningProcesses([
|
|
326
|
+
processInfo
|
|
327
|
+
]);
|
|
328
|
+
expect(first.fallback).toEqual([
|
|
329
|
+
processInfo
|
|
330
|
+
]);
|
|
331
|
+
expect(first.legacyMatches).toEqual([]);
|
|
332
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
|
|
333
|
+
mockedReadSync.mockClear();
|
|
334
|
+
nowMs += 5_000;
|
|
335
|
+
const second = locator.matchRunningProcesses([
|
|
336
|
+
processInfo
|
|
337
|
+
]);
|
|
338
|
+
expect(second.fallback).toEqual([
|
|
339
|
+
processInfo
|
|
340
|
+
]);
|
|
341
|
+
expect(second.legacyMatches).toEqual([]);
|
|
342
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
|
|
343
|
+
expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(1);
|
|
344
|
+
expect(bytesRead()).toBe(0);
|
|
345
|
+
const newFile = writeMetaSession("new-session", "/repo-a");
|
|
346
|
+
nowMs += 5_000;
|
|
347
|
+
locator.matchRunningProcesses([
|
|
348
|
+
processInfo
|
|
349
|
+
]);
|
|
350
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
|
|
351
|
+
expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(2);
|
|
352
|
+
const rescannedPaths = mockedMatchProcessesToSessions.mock.calls[1][1].map((session)=>session.filePath);
|
|
353
|
+
expect(rescannedPaths).toContain(newFile);
|
|
354
|
+
expect(bytesRead()).toBeGreaterThan(0);
|
|
355
|
+
expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);
|
|
356
|
+
});
|
|
357
|
+
it("rescans a newly created adjacent date directory for an unmatched process", ()=>{
|
|
358
|
+
locator.matchRunningProcesses([
|
|
359
|
+
processInfo
|
|
360
|
+
]);
|
|
361
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
|
|
362
|
+
const nextDayDir = path.join(sessionsDir, "2026", "03", "19");
|
|
363
|
+
fs.mkdirSync(nextDayDir, {
|
|
364
|
+
recursive: true
|
|
365
|
+
});
|
|
366
|
+
nowMs += 1_000;
|
|
367
|
+
locator.matchRunningProcesses([
|
|
368
|
+
processInfo
|
|
369
|
+
]);
|
|
370
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
|
|
371
|
+
expect(mockedBatchGetSessionFileBirthtimes.mock.calls[1][0]).toContain(nextDayDir);
|
|
372
|
+
});
|
|
373
|
+
it("re-checks an unmatched process at most every 30 seconds with unchanged directories", ()=>{
|
|
374
|
+
writeMetaSession("other", "/repo-other");
|
|
375
|
+
setDirMtime(dateDir, new Date("2026-01-01T00:00:00Z"));
|
|
376
|
+
locator.matchRunningProcesses([
|
|
377
|
+
processInfo
|
|
378
|
+
]);
|
|
379
|
+
mockedReadSync.mockClear();
|
|
380
|
+
nowMs += 29_999;
|
|
381
|
+
locator.matchRunningProcesses([
|
|
382
|
+
processInfo
|
|
383
|
+
]);
|
|
384
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
|
|
385
|
+
nowMs += 1;
|
|
386
|
+
locator.matchRunningProcesses([
|
|
387
|
+
processInfo
|
|
388
|
+
]);
|
|
389
|
+
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
|
|
390
|
+
expect(bytesRead()).toBe(0);
|
|
391
|
+
});
|
|
392
|
+
it("scans a new process even when another process is negatively cached", ()=>{
|
|
393
|
+
writeMetaSession("other", "/repo-other");
|
|
394
|
+
locator.matchRunningProcesses([
|
|
395
|
+
processInfo
|
|
396
|
+
]);
|
|
397
|
+
const other = {
|
|
398
|
+
...processInfo,
|
|
399
|
+
pid: 5151
|
|
400
|
+
};
|
|
401
|
+
const result = locator.matchRunningProcesses([
|
|
402
|
+
processInfo,
|
|
403
|
+
other
|
|
404
|
+
]);
|
|
405
|
+
expect(mockedMatchProcessesToSessions).toHaveBeenLastCalledWith([
|
|
406
|
+
other
|
|
407
|
+
], expect.any(Array));
|
|
408
|
+
expect(result.fallback).toEqual([
|
|
409
|
+
processInfo,
|
|
410
|
+
other
|
|
411
|
+
]);
|
|
412
|
+
});
|
|
413
|
+
function metaLine(id, cwd) {
|
|
414
|
+
return JSON.stringify({
|
|
415
|
+
type: "session_meta",
|
|
416
|
+
payload: {
|
|
417
|
+
id,
|
|
418
|
+
timestamp: "2026-03-18T15:00:05.000Z",
|
|
419
|
+
cwd
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
}
|
|
423
|
+
function writeMetaSession(id, cwd, totalBytes) {
|
|
424
|
+
const filePath = path.join(dateDir, `${id}.jsonl`);
|
|
425
|
+
fs.writeFileSync(filePath, metaLine(id, cwd) + "\n");
|
|
426
|
+
if (totalBytes !== undefined) fs.truncateSync(filePath, totalBytes);
|
|
427
|
+
return filePath;
|
|
428
|
+
}
|
|
429
|
+
function setDirMtime(dir, date) {
|
|
430
|
+
fs.utimesSync(dir, date, date);
|
|
431
|
+
}
|
|
432
|
+
function bytesRead() {
|
|
433
|
+
let total = 0;
|
|
434
|
+
for (const result of mockedReadSync.mock.results){
|
|
435
|
+
if (result.type === "return" && typeof result.value === "number") total += result.value;
|
|
436
|
+
}
|
|
437
|
+
mockedReadFileSync.mock.calls.forEach((call, index)=>{
|
|
438
|
+
if (!String(call[0]).startsWith(sessionsDir)) return;
|
|
439
|
+
const result = mockedReadFileSync.mock.results[index];
|
|
440
|
+
if (result?.type === "return") total += Buffer.byteLength(result.value);
|
|
441
|
+
});
|
|
442
|
+
return total;
|
|
443
|
+
}
|
|
444
|
+
});
|
|
445
|
+
function writeSession(sessionId, day) {
|
|
446
|
+
const dateDir = path.join(sessionsDir, ...day.split("/"));
|
|
447
|
+
fs.mkdirSync(dateDir, {
|
|
448
|
+
recursive: true
|
|
449
|
+
});
|
|
450
|
+
const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);
|
|
451
|
+
fs.writeFileSync(sessionFile, JSON.stringify({
|
|
452
|
+
type: "session_meta",
|
|
453
|
+
payload: {
|
|
454
|
+
id: sessionId,
|
|
455
|
+
timestamp: "2026-03-18T15:00:05.000Z",
|
|
456
|
+
cwd: "/repo-a"
|
|
457
|
+
}
|
|
458
|
+
}));
|
|
459
|
+
return sessionFile;
|
|
460
|
+
}
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
//# sourceMappingURL=CodexSessionLocator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/__tests__/harnesses/codex/CodexSessionLocator.test.ts"],"sourcesContent":["import type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { CodexSessionLocator } from \"../../../harnesses/codex/CodexSessionLocator.js\";\nimport { batchGetSessionFileBirthtimes, type SessionFile } from \"../../../utils/session.js\";\nimport { matchProcessesToSessions, type MatchResult } from \"../../../utils/matching.js\";\n\nvi.mock(\"fs\", async () => {\n const actual = (await vi.importActual(\"fs\")) as typeof import(\"fs\");\n const wrapped = {\n ...actual,\n readSync: vi.fn(actual.readSync),\n readFileSync: vi.fn(actual.readFileSync),\n };\n return { ...wrapped, default: wrapped };\n});\n\nvi.mock(\"../../../utils/session.js\", async () => {\n const actual = (await vi.importActual(\n \"../../../utils/session\",\n )) as typeof import(\"../../../utils/session\");\n return {\n ...actual,\n batchGetSessionFileBirthtimes: vi.fn(),\n };\n});\n\nvi.mock(\"../../../utils/matching.js\", async () => {\n const actual = (await vi.importActual(\n \"../../../utils/matching\",\n )) as typeof import(\"../../../utils/matching\");\n return {\n ...actual,\n matchProcessesToSessions: vi.fn(),\n };\n});\n\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<\n typeof batchGetSessionFileBirthtimes\n>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<\n typeof matchProcessesToSessions\n>;\n\ndescribe(\"CodexSessionLocator\", () => {\n let tmpDir: string;\n let sessionsDir: string;\n let locator: CodexSessionLocator;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-locator-\"));\n sessionsDir = path.join(tmpDir, \"sessions\");\n locator = new CodexSessionLocator({ sessionsDir });\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"discovers live sessions from the process start day window and applies session_meta cwd and timestamp\", () => {\n const dateDir = path.join(sessionsDir, \"2026\", \"03\", \"18\");\n fs.mkdirSync(dateDir, { recursive: true });\n const sessionFile = path.join(dateDir, \"sess-meta-time.jsonl\");\n fs.writeFileSync(\n sessionFile,\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"sess-meta-time\", timestamp: \"2026-03-18T15:00:05.000Z\", cwd: \"/repo-a\" },\n }),\n );\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: \"sess-meta-time\",\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(\"2026-03-18T15:05:30.000Z\").getTime(),\n resolvedCwd: \"\",\n },\n ]);\n\n const result = locator.discoverLiveSessions([\n {\n pid: 1,\n command: \"codex\",\n cwd: \"/repo-a\",\n tty: \"\",\n startTime: new Date(\"2026-03-18T15:00:00Z\"),\n },\n ]);\n\n expect(result.sessions).toHaveLength(1);\n expect(result.sessions[0]).toMatchObject({\n resolvedCwd: \"/repo-a\",\n birthtimeMs: new Date(\"2026-03-18T15:00:05.000Z\").getTime(),\n });\n expect(result).not.toHaveProperty(\"contentCache\");\n expect(mockedBatchGetSessionFileBirthtimes.mock.calls[0][0]).toEqual([dateDir]);\n });\n\n it(\"matches resumed UUIDv7 sessions directly without legacy matching\", () => {\n const sessionId = \"019eabed-4079-7071-9531-b853ddd9914e\";\n const sessionFile = writeSession(sessionId, \"2026/06/09\");\n const processInfo: ProcessInfo = {\n pid: 88018,\n command: `codex resume ${sessionId}`,\n cwd: \"/repo-a\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-06-10T12:00:00.000Z\"),\n };\n\n const result = locator.matchRunningProcesses([processInfo]);\n\n expect(result.direct).toHaveLength(1);\n expect(result.direct[0]).toMatchObject({\n process: processInfo,\n sessionFile: { sessionId, filePath: sessionFile, resolvedCwd: \"/repo-a\" },\n });\n expect(result.fallback).toEqual([]);\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it(\"falls back to walking all session files for non-time-sortable resume ids\", () => {\n const sessionId = \"aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee\";\n const sessionFile = writeSession(sessionId, \"2026/01/02\");\n\n const result = locator.matchRunningProcesses([\n { pid: 42, command: `codex resume ${sessionId}`, cwd: \"/repo-a\", tty: \"ttys001\" },\n ]);\n\n expect(result.direct[0].sessionFile.filePath).toBe(sessionFile);\n });\n\n it(\"passes unmatched processes and discovered sessions to legacy matching\", () => {\n const dateDir = path.join(sessionsDir, \"2026\", \"03\", \"18\");\n fs.mkdirSync(dateDir, { recursive: true });\n const candidate: SessionFile = {\n sessionId: \"sess\",\n filePath: path.join(dateDir, \"sess.jsonl\"),\n projectDir: dateDir,\n birthtimeMs: new Date(\"2026-03-18T15:00:05Z\").getTime(),\n resolvedCwd: \"\",\n };\n fs.writeFileSync(\n candidate.filePath,\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"sess\", cwd: \"/repo-a\", timestamp: \"2026-03-18T15:00:05Z\" },\n }),\n );\n const processInfo: ProcessInfo = {\n pid: 100,\n command: \"codex\",\n cwd: \"/repo-a\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-03-18T15:00:00Z\"),\n };\n const legacyMatch: MatchResult = {\n process: processInfo,\n session: { ...candidate, resolvedCwd: \"/repo-a\" },\n deltaMs: 5000,\n };\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([candidate]);\n mockedMatchProcessesToSessions.mockReturnValue([legacyMatch]);\n\n const result = locator.matchRunningProcesses([processInfo]);\n\n expect(result.direct).toEqual([]);\n expect(result.fallback).toEqual([processInfo]);\n expect(result.legacyMatches).toEqual([legacyMatch]);\n expect(result).not.toHaveProperty(\"contentCache\");\n });\n\n describe(\"bounded session_meta discovery\", () => {\n const HEAD_LIMIT_BYTES = 64 * 1024;\n const dayDirParts = [\"2026\", \"03\", \"18\"];\n const mockedReadSync = fs.readSync as MockedFunction<typeof fs.readSync>;\n const mockedReadFileSync = fs.readFileSync as MockedFunction<typeof fs.readFileSync>;\n let dateDir: string;\n let nowMs: number;\n let actualBatch: typeof batchGetSessionFileBirthtimes;\n\n const processInfo: ProcessInfo = {\n pid: 4242,\n command: \"codex\",\n cwd: \"/repo-a\",\n tty: \"ttys009\",\n startTime: new Date(\"2026-03-18T15:00:00Z\"),\n };\n\n beforeEach(async () => {\n dateDir = path.join(sessionsDir, ...dayDirParts);\n fs.mkdirSync(dateDir, { recursive: true });\n nowMs = new Date(\"2026-03-18T16:00:00Z\").getTime();\n locator = new CodexSessionLocator({ sessionsDir, now: () => nowMs });\n actualBatch = (\n (await vi.importActual(\"../../../utils/session\")) as typeof import(\"../../../utils/session\")\n ).batchGetSessionFileBirthtimes;\n mockedBatchGetSessionFileBirthtimes.mockImplementation(actualBatch);\n mockedMatchProcessesToSessions.mockReturnValue([]);\n mockedReadSync.mockClear();\n mockedReadFileSync.mockClear();\n });\n\n it(\"reads at most 64 KiB of a 100 MB session file\", () => {\n const filePath = writeMetaSession(\"big\", \"/repo-big\", 100 * 1024 * 1024);\n\n const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0]).toMatchObject({\n filePath,\n resolvedCwd: \"/repo-big\",\n birthtimeMs: new Date(\"2026-03-18T15:00:05.000Z\").getTime(),\n });\n expect(bytesRead()).toBeGreaterThan(0);\n expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);\n });\n\n it(\"extracts cwd and timestamp when the session_meta line exceeds 64 KiB\", () => {\n const filePath = path.join(dateDir, \"long-meta.jsonl\");\n fs.writeFileSync(\n filePath,\n JSON.stringify({\n timestamp: \"2026-03-18T15:00:04.000Z\",\n type: \"session_meta\",\n payload: {\n id: \"long-meta\",\n timestamp: \"2026-03-18T15:00:05.000Z\",\n cwd: '/repo \"quoted\"',\n instructions: \"x\".repeat(300 * 1024),\n },\n }) + \"\\n\",\n );\n\n const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);\n\n expect(sessions[0]).toMatchObject({\n resolvedCwd: '/repo \"quoted\"',\n birthtimeMs: new Date(\"2026-03-18T15:00:05.000Z\").getTime(),\n });\n expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);\n });\n\n it(\"leaves files without a session_meta first line unresolved\", () => {\n const filePath = path.join(dateDir, \"not-meta.jsonl\");\n fs.writeFileSync(filePath, JSON.stringify({ type: \"event\", payload: { cwd: \"/x\" } }) + \"\\n\");\n const birthtimeMs = fs.statSync(filePath).birthtimeMs;\n\n const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);\n\n expect(sessions[0]).toMatchObject({ resolvedCwd: \"\", birthtimeMs });\n });\n\n it(\"reads 0 bytes on later refreshes while session files only grow\", () => {\n const filePath = writeMetaSession(\"grow\", \"/repo-a\");\n mockedMatchProcessesToSessions.mockImplementation((_procs, sessions) => [\n { process: processInfo, session: sessions[0], deltaMs: 5000 },\n ]);\n\n const first = locator.matchRunningProcesses([processInfo]);\n expect(first.legacyMatches).toHaveLength(1);\n expect(bytesRead()).toBeGreaterThan(0);\n\n fs.appendFileSync(filePath, JSON.stringify({ type: \"event\", payload: {} }) + \"\\n\");\n mockedReadSync.mockClear();\n mockedReadFileSync.mockClear();\n\n const second = locator.matchRunningProcesses([processInfo]);\n\n expect(second.legacyMatches).toHaveLength(1);\n expect(second.legacyMatches[0].session).toMatchObject({\n filePath,\n resolvedCwd: \"/repo-a\",\n birthtimeMs: new Date(\"2026-03-18T15:00:05.000Z\").getTime(),\n });\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);\n expect(bytesRead()).toBe(0);\n });\n\n it(\"rereads a session head when the file is replaced\", () => {\n const filePath = writeMetaSession(\"replaced\", \"/repo-old\");\n locator.discoverSessionFilesInDateDirs([dateDir]);\n\n const tmpFile = path.join(tmpDir, \"replacement.jsonl\");\n fs.writeFileSync(tmpFile, metaLine(\"replaced\", \"/repo-new\") + \"\\n\");\n fs.renameSync(tmpFile, filePath);\n mockedReadSync.mockClear();\n\n const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);\n\n expect(sessions[0].resolvedCwd).toBe(\"/repo-new\");\n expect(bytesRead()).toBeGreaterThan(0);\n });\n\n it(\"does not rescan an unmatched process until its date directories change\", () => {\n writeMetaSession(\"other\", \"/repo-other\");\n setDirMtime(dateDir, new Date(\"2026-01-01T00:00:00Z\"));\n\n const first = locator.matchRunningProcesses([processInfo]);\n expect(first.fallback).toEqual([processInfo]);\n expect(first.legacyMatches).toEqual([]);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n\n mockedReadSync.mockClear();\n nowMs += 5_000;\n const second = locator.matchRunningProcesses([processInfo]);\n\n expect(second.fallback).toEqual([processInfo]);\n expect(second.legacyMatches).toEqual([]);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(1);\n expect(bytesRead()).toBe(0);\n\n const newFile = writeMetaSession(\"new-session\", \"/repo-a\");\n nowMs += 5_000;\n locator.matchRunningProcesses([processInfo]);\n\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(2);\n const rescannedPaths = mockedMatchProcessesToSessions.mock.calls[1][1].map(\n (session) => session.filePath,\n );\n expect(rescannedPaths).toContain(newFile);\n expect(bytesRead()).toBeGreaterThan(0);\n expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);\n });\n\n it(\"rescans a newly created adjacent date directory for an unmatched process\", () => {\n locator.matchRunningProcesses([processInfo]);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n\n const nextDayDir = path.join(sessionsDir, \"2026\", \"03\", \"19\");\n fs.mkdirSync(nextDayDir, { recursive: true });\n nowMs += 1_000;\n locator.matchRunningProcesses([processInfo]);\n\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);\n expect(mockedBatchGetSessionFileBirthtimes.mock.calls[1][0]).toContain(nextDayDir);\n });\n\n it(\"re-checks an unmatched process at most every 30 seconds with unchanged directories\", () => {\n writeMetaSession(\"other\", \"/repo-other\");\n setDirMtime(dateDir, new Date(\"2026-01-01T00:00:00Z\"));\n locator.matchRunningProcesses([processInfo]);\n mockedReadSync.mockClear();\n\n nowMs += 29_999;\n locator.matchRunningProcesses([processInfo]);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n\n nowMs += 1;\n locator.matchRunningProcesses([processInfo]);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);\n expect(bytesRead()).toBe(0);\n });\n\n it(\"scans a new process even when another process is negatively cached\", () => {\n writeMetaSession(\"other\", \"/repo-other\");\n locator.matchRunningProcesses([processInfo]);\n const other: ProcessInfo = { ...processInfo, pid: 5151 };\n\n const result = locator.matchRunningProcesses([processInfo, other]);\n\n expect(mockedMatchProcessesToSessions).toHaveBeenLastCalledWith([other], expect.any(Array));\n expect(result.fallback).toEqual([processInfo, other]);\n });\n\n function metaLine(id: string, cwd: string): string {\n return JSON.stringify({\n type: \"session_meta\",\n payload: { id, timestamp: \"2026-03-18T15:00:05.000Z\", cwd },\n });\n }\n\n function writeMetaSession(id: string, cwd: string, totalBytes?: number): string {\n const filePath = path.join(dateDir, `${id}.jsonl`);\n fs.writeFileSync(filePath, metaLine(id, cwd) + \"\\n\");\n if (totalBytes !== undefined) fs.truncateSync(filePath, totalBytes);\n return filePath;\n }\n\n function setDirMtime(dir: string, date: Date): void {\n fs.utimesSync(dir, date, date);\n }\n\n function bytesRead(): number {\n let total = 0;\n for (const result of mockedReadSync.mock.results) {\n if (result.type === \"return\" && typeof result.value === \"number\") total += result.value;\n }\n mockedReadFileSync.mock.calls.forEach((call, index) => {\n if (!String(call[0]).startsWith(sessionsDir)) return;\n const result = mockedReadFileSync.mock.results[index];\n if (result?.type === \"return\") total += Buffer.byteLength(result.value as string | Buffer);\n });\n return total;\n }\n });\n\n function writeSession(sessionId: string, day: string): string {\n const dateDir = path.join(sessionsDir, ...day.split(\"/\"));\n fs.mkdirSync(dateDir, { recursive: true });\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n sessionFile,\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: sessionId, timestamp: \"2026-03-18T15:00:05.000Z\", cwd: \"/repo-a\" },\n }),\n );\n return sessionFile;\n }\n});\n"],"names":["fs","os","path","CodexSessionLocator","batchGetSessionFileBirthtimes","matchProcessesToSessions","vi","mock","actual","importActual","wrapped","readSync","fn","readFileSync","default","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","describe","tmpDir","sessionsDir","locator","beforeEach","mkdtempSync","join","tmpdir","mockReset","afterEach","rmSync","recursive","force","it","dateDir","mkdirSync","sessionFile","writeFileSync","JSON","stringify","type","payload","id","timestamp","cwd","mockReturnValue","sessionId","filePath","projectDir","birthtimeMs","Date","getTime","resolvedCwd","result","discoverLiveSessions","pid","command","tty","startTime","expect","sessions","toHaveLength","toMatchObject","not","toHaveProperty","calls","toEqual","writeSession","processInfo","matchRunningProcesses","direct","process","fallback","toHaveBeenCalled","toBe","candidate","legacyMatch","session","deltaMs","legacyMatches","HEAD_LIMIT_BYTES","dayDirParts","mockedReadSync","mockedReadFileSync","nowMs","actualBatch","now","mockImplementation","mockClear","writeMetaSession","discoverSessionFilesInDateDirs","bytesRead","toBeGreaterThan","toBeLessThanOrEqual","instructions","repeat","statSync","_procs","first","appendFileSync","second","toHaveBeenCalledTimes","tmpFile","metaLine","renameSync","setDirMtime","newFile","rescannedPaths","map","toContain","nextDayDir","other","toHaveBeenLastCalledWith","any","Array","totalBytes","undefined","truncateSync","dir","date","utimesSync","total","results","value","forEach","call","index","String","startsWith","Buffer","byteLength","day","split"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as os from "os";
|
|
3
3
|
import * as path from "path";
|
|
4
|
-
import { CodexSessionMapping } from "../../../
|
|
4
|
+
import { CodexSessionMapping } from "../../../harnesses/codex/CodexSessionMapping.js";
|
|
5
5
|
describe("CodexSessionMapping", ()=>{
|
|
6
6
|
let tmpDir;
|
|
7
7
|
let sessionsDir;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/__tests__/
|
|
1
|
+
{"version":3,"sources":["../../../../src/__tests__/harnesses/codex/CodexSessionMapping.test.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { CodexSessionMapping } from \"../../../harnesses/codex/CodexSessionMapping.js\";\n\ndescribe(\"CodexSessionMapping\", () => {\n let tmpDir: string;\n let sessionsDir: string;\n let mappingPath: string;\n let processInfo: ProcessInfo;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-mapping-\"));\n sessionsDir = path.join(tmpDir, \".codex\", \"sessions\");\n mappingPath = path.join(tmpDir, \".codex\", \"ai-devkit\", \"sessions.json\");\n processInfo = { pid: 5151, command: \"codex\", cwd: \"/repo\", tty: \"ttys001\" };\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"matches a process to an existing trusted session file\", () => {\n const sessionFile = path.join(sessionsDir, \"2026\", \"06\", \"26\", \"session.jsonl\");\n fs.mkdirSync(path.dirname(sessionFile), { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(sessionFile, \"\");\n fs.writeFileSync(mappingPath, JSON.stringify({ 5151: sessionFile }));\n\n expect(createMapping().match([processInfo])).toEqual({\n matches: [{ process: processInfo, filePath: sessionFile }],\n fallback: [],\n });\n });\n\n it(\"falls back for malformed mappings, missing files, invalid pids, and untrusted paths\", () => {\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(\n mappingPath,\n JSON.stringify({\n invalid: path.join(sessionsDir, \"ignored.jsonl\"),\n 5151: path.join(tmpDir, \"outside.jsonl\"),\n 9999: path.join(sessionsDir, \"missing.jsonl\"),\n }),\n );\n\n expect(createMapping().match([processInfo])).toEqual({\n matches: [],\n fallback: [processInfo],\n });\n\n fs.writeFileSync(mappingPath, \"{not-json\");\n expect(createMapping().match([processInfo])).toEqual({\n matches: [],\n fallback: [processInfo],\n });\n });\n\n function createMapping(): CodexSessionMapping {\n return new CodexSessionMapping({ mappingPath, sessionsDir });\n }\n});\n"],"names":["fs","os","path","CodexSessionMapping","describe","tmpDir","sessionsDir","mappingPath","processInfo","beforeEach","mkdtempSync","join","tmpdir","pid","command","cwd","tty","afterEach","rmSync","recursive","force","it","sessionFile","mkdirSync","dirname","writeFileSync","JSON","stringify","expect","createMapping","match","toEqual","matches","process","filePath","fallback","invalid"],"mappings":"AAAA,YAAYA,QAAQ,KAAK;AACzB,YAAYC,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtFC,SAAS,uBAAuB;IAC9B,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IAEJC,WAAW;QACTJ,SAASL,GAAGU,WAAW,CAACR,KAAKS,IAAI,CAACV,GAAGW,MAAM,IAAI;QAC/CN,cAAcJ,KAAKS,IAAI,CAACN,QAAQ,UAAU;QAC1CE,cAAcL,KAAKS,IAAI,CAACN,QAAQ,UAAU,aAAa;QACvDG,cAAc;YAAEK,KAAK;YAAMC,SAAS;YAASC,KAAK;YAASC,KAAK;QAAU;IAC5E;IAEAC,UAAU;QACRjB,GAAGkB,MAAM,CAACb,QAAQ;YAAEc,WAAW;YAAMC,OAAO;QAAK;IACnD;IAEAC,GAAG,yDAAyD;QAC1D,MAAMC,cAAcpB,KAAKS,IAAI,CAACL,aAAa,QAAQ,MAAM,MAAM;QAC/DN,GAAGuB,SAAS,CAACrB,KAAKsB,OAAO,CAACF,cAAc;YAAEH,WAAW;QAAK;QAC1DnB,GAAGuB,SAAS,CAACrB,KAAKsB,OAAO,CAACjB,cAAc;YAAEY,WAAW;QAAK;QAC1DnB,GAAGyB,aAAa,CAACH,aAAa;QAC9BtB,GAAGyB,aAAa,CAAClB,aAAamB,KAAKC,SAAS,CAAC;YAAE,MAAML;QAAY;QAEjEM,OAAOC,gBAAgBC,KAAK,CAAC;YAACtB;SAAY,GAAGuB,OAAO,CAAC;YACnDC,SAAS;gBAAC;oBAAEC,SAASzB;oBAAa0B,UAAUZ;gBAAY;aAAE;YAC1Da,UAAU,EAAE;QACd;IACF;IAEAd,GAAG,uFAAuF;QACxFrB,GAAGuB,SAAS,CAACrB,KAAKsB,OAAO,CAACjB,cAAc;YAAEY,WAAW;QAAK;QAC1DnB,GAAGyB,aAAa,CACdlB,aACAmB,KAAKC,SAAS,CAAC;YACbS,SAASlC,KAAKS,IAAI,CAACL,aAAa;YAChC,MAAMJ,KAAKS,IAAI,CAACN,QAAQ;YACxB,MAAMH,KAAKS,IAAI,CAACL,aAAa;QAC/B;QAGFsB,OAAOC,gBAAgBC,KAAK,CAAC;YAACtB;SAAY,GAAGuB,OAAO,CAAC;YACnDC,SAAS,EAAE;YACXG,UAAU;gBAAC3B;aAAY;QACzB;QAEAR,GAAGyB,aAAa,CAAClB,aAAa;QAC9BqB,OAAOC,gBAAgBC,KAAK,CAAC;YAACtB;SAAY,GAAGuB,OAAO,CAAC;YACnDC,SAAS,EAAE;YACXG,UAAU;gBAAC3B;aAAY;QACzB;IACF;IAEA,SAASqB;QACP,OAAO,IAAI1B,oBAAoB;YAAEI;YAAaD;QAAY;IAC5D;AACF"}
|
|
@@ -2,7 +2,7 @@ import * as fs from "fs";
|
|
|
2
2
|
import * as os from "os";
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import { AgentStatus } from "../../../adapters/AgentAdapter.js";
|
|
5
|
-
import { CodexSessionParser } from "../../../
|
|
5
|
+
import { CodexSessionParser } from "../../../harnesses/codex/CodexSessionParser.js";
|
|
6
6
|
describe("CodexSessionParser", ()=>{
|
|
7
7
|
let tmpDir;
|
|
8
8
|
let parser;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/__tests__/providers/codex/CodexSessionParser.test.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { AgentStatus } from \"../../../adapters/AgentAdapter.js\";\nimport { CodexSessionParser } from \"../../../providers/codex/CodexSessionParser.js\";\n\ndescribe(\"CodexSessionParser\", () => {\n let tmpDir: string;\n let parser: CodexSessionParser;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-parser-\"));\n parser = new CodexSessionParser();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"reads session metadata, summary, timestamps, and status signal\", () => {\n const filePath = writeJsonl(\"session.jsonl\", [\n {\n type: \"session_meta\",\n payload: { id: \"sess-1\", timestamp: \"2026-03-18T15:00:00Z\", cwd: \"/repo\" },\n },\n {\n type: \"event\",\n timestamp: \"2026-03-18T15:01:00Z\",\n payload: { type: \"agent_reasoning\", message: \"Working on feature\" },\n },\n ]);\n\n const session = parser.readSession(filePath);\n\n expect(session).toMatchObject({\n sessionId: \"sess-1\",\n projectPath: \"/repo\",\n summary: \"Working on feature\",\n lastPayloadType: \"agent_reasoning\",\n });\n expect(session?.sessionStart.toISOString()).toBe(\"2026-03-18T15:00:00.000Z\");\n expect(parser.determineStatus(session!)).toBe(AgentStatus.IDLE);\n });\n\n it(\"reads current response_item and event_msg messages without mirrored duplicates\", () => {\n const filePath = writeJsonl(\"conversation.jsonl\", [\n {\n type: \"session_meta\",\n payload: { id: \"sess-1\", cwd: \"/repo\", timestamp: \"2026-03-27T10:00:00Z\" },\n },\n {\n type: \"response_item\",\n timestamp: \"2026-03-27T10:00:01Z\",\n payload: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text: \"Fix the bug\" }],\n internal_chat_message_metadata_passthrough: { turn_id: \"turn-1\" },\n },\n },\n {\n type: \"event_msg\",\n timestamp: \"2026-03-27T10:00:01.001Z\",\n payload: {\n type: \"item_completed\",\n turn_id: \"turn-1\",\n item: { type: \"UserMessage\", content: [{ type: \"text\", text: \"Fix the bug\" }] },\n },\n },\n {\n type: \"event_msg\",\n timestamp: \"2026-03-27T10:00:05Z\",\n payload: {\n type: \"item_completed\",\n turn_id: \"turn-1\",\n item: { type: \"AgentMessage\", content: [{ type: \"Text\", text: \"I found the issue\" }] },\n },\n },\n {\n type: \"response_item\",\n timestamp: \"2026-03-27T10:00:05.005Z\",\n payload: {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: \"I found the issue\" }],\n internal_chat_message_metadata_passthrough: { turn_id: \"turn-1\" },\n },\n },\n ]);\n\n expect(parser.getConversation(filePath)).toEqual([\n { role: \"user\", content: \"Fix the bug\", timestamp: \"2026-03-27T10:00:01Z\" },\n { role: \"assistant\", content: \"I found the issue\", timestamp: \"2026-03-27T10:00:05.005Z\" },\n ]);\n });\n\n it(\"maps completed assistant messages as waiting while recent active events stay running\", () => {\n const waiting = parser.readSession(\n \"unused.jsonl\",\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"waiting\", timestamp: new Date().toISOString(), cwd: \"/repo\" },\n }),\n JSON.stringify({\n type: \"event_msg\",\n timestamp: new Date().toISOString(),\n payload: {\n type: \"item_completed\",\n item: {\n type: \"AgentMessage\",\n content: [{ type: \"Text\", text: \"Waiting for the user now\" }],\n },\n },\n }),\n ].join(\"\\n\"),\n );\n\n const running = parser.readSession(\n \"unused.jsonl\",\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"running\", timestamp: new Date().toISOString(), cwd: \"/repo\" },\n }),\n JSON.stringify({\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Working\" },\n }),\n ].join(\"\\n\"),\n );\n\n expect(waiting?.summary).toBe(\"Waiting for the user now\");\n expect(parser.determineStatus(waiting!)).toBe(AgentStatus.WAITING);\n expect(parser.determineStatus(running!)).toBe(AgentStatus.RUNNING);\n });\n\n it(\"builds historical summaries from the first non-synthetic user message\", () => {\n const filePath = writeJsonl(\"summary.jsonl\", [\n {\n type: \"session_meta\",\n payload: { id: \"summary\", cwd: \"/repo\", timestamp: \"2025-01-01T00:00:00Z\" },\n },\n {\n type: \"response_item\",\n timestamp: \"2025-01-01T00:00:00.500Z\",\n payload: {\n type: \"message\",\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: \"<environment_context>\\n <cwd>/repo</cwd>\\n</environment_context>\",\n },\n ],\n },\n },\n {\n type: \"event_msg\",\n timestamp: \"2025-01-01T00:00:02Z\",\n payload: {\n type: \"item_completed\",\n item: { type: \"UserMessage\", content: [{ type: \"text\", text: \"first event user\" }] },\n },\n },\n ]);\n\n expect(parser.fileToSessionSummary(filePath)).toMatchObject({\n type: \"codex\",\n sessionId: \"summary\",\n cwd: \"/repo\",\n firstUserMessage: \"first event user\",\n sessionFilePath: filePath,\n });\n });\n\n it(\"returns null or empty results for unreadable and malformed inputs\", () => {\n expect(parser.readSession(path.join(tmpDir, \"missing.jsonl\"))).toBeNull();\n expect(parser.readSession(\"unused.jsonl\", \"\")).toBeNull();\n expect(\n parser.readSession(\"unused.jsonl\", JSON.stringify({ type: \"event\", payload: {} })),\n ).toBeNull();\n expect(parser.getConversation(path.join(tmpDir, \"missing.jsonl\"))).toEqual([]);\n });\n\n function writeJsonl(name: string, entries: object[]): string {\n const filePath = path.join(tmpDir, name);\n fs.writeFileSync(filePath, entries.map((entry) => JSON.stringify(entry)).join(\"\\n\"));\n return filePath;\n }\n});\n"],"names":["fs","os","path","AgentStatus","CodexSessionParser","describe","tmpDir","parser","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","it","filePath","writeJsonl","type","payload","id","timestamp","cwd","message","session","readSession","expect","toMatchObject","sessionId","projectPath","summary","lastPayloadType","sessionStart","toISOString","toBe","determineStatus","IDLE","role","content","text","internal_chat_message_metadata_passthrough","turn_id","item","getConversation","toEqual","waiting","JSON","stringify","Date","running","WAITING","RUNNING","fileToSessionSummary","firstUserMessage","sessionFilePath","toBeNull","name","entries","writeFileSync","map","entry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/__tests__/harnesses/codex/CodexSessionParser.test.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { AgentStatus } from \"../../../adapters/AgentAdapter.js\";\nimport { CodexSessionParser } from \"../../../harnesses/codex/CodexSessionParser.js\";\n\ndescribe(\"CodexSessionParser\", () => {\n let tmpDir: string;\n let parser: CodexSessionParser;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-parser-\"));\n parser = new CodexSessionParser();\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"reads session metadata, summary, timestamps, and status signal\", () => {\n const filePath = writeJsonl(\"session.jsonl\", [\n {\n type: \"session_meta\",\n payload: { id: \"sess-1\", timestamp: \"2026-03-18T15:00:00Z\", cwd: \"/repo\" },\n },\n {\n type: \"event\",\n timestamp: \"2026-03-18T15:01:00Z\",\n payload: { type: \"agent_reasoning\", message: \"Working on feature\" },\n },\n ]);\n\n const session = parser.readSession(filePath);\n\n expect(session).toMatchObject({\n sessionId: \"sess-1\",\n projectPath: \"/repo\",\n summary: \"Working on feature\",\n lastPayloadType: \"agent_reasoning\",\n });\n expect(session?.sessionStart.toISOString()).toBe(\"2026-03-18T15:00:00.000Z\");\n expect(parser.determineStatus(session!)).toBe(AgentStatus.IDLE);\n });\n\n it(\"reads current response_item and event_msg messages without mirrored duplicates\", () => {\n const filePath = writeJsonl(\"conversation.jsonl\", [\n {\n type: \"session_meta\",\n payload: { id: \"sess-1\", cwd: \"/repo\", timestamp: \"2026-03-27T10:00:00Z\" },\n },\n {\n type: \"response_item\",\n timestamp: \"2026-03-27T10:00:01Z\",\n payload: {\n type: \"message\",\n role: \"user\",\n content: [{ type: \"input_text\", text: \"Fix the bug\" }],\n internal_chat_message_metadata_passthrough: { turn_id: \"turn-1\" },\n },\n },\n {\n type: \"event_msg\",\n timestamp: \"2026-03-27T10:00:01.001Z\",\n payload: {\n type: \"item_completed\",\n turn_id: \"turn-1\",\n item: { type: \"UserMessage\", content: [{ type: \"text\", text: \"Fix the bug\" }] },\n },\n },\n {\n type: \"event_msg\",\n timestamp: \"2026-03-27T10:00:05Z\",\n payload: {\n type: \"item_completed\",\n turn_id: \"turn-1\",\n item: { type: \"AgentMessage\", content: [{ type: \"Text\", text: \"I found the issue\" }] },\n },\n },\n {\n type: \"response_item\",\n timestamp: \"2026-03-27T10:00:05.005Z\",\n payload: {\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: \"I found the issue\" }],\n internal_chat_message_metadata_passthrough: { turn_id: \"turn-1\" },\n },\n },\n ]);\n\n expect(parser.getConversation(filePath)).toEqual([\n { role: \"user\", content: \"Fix the bug\", timestamp: \"2026-03-27T10:00:01Z\" },\n { role: \"assistant\", content: \"I found the issue\", timestamp: \"2026-03-27T10:00:05.005Z\" },\n ]);\n });\n\n it(\"maps completed assistant messages as waiting while recent active events stay running\", () => {\n const waiting = parser.readSession(\n \"unused.jsonl\",\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"waiting\", timestamp: new Date().toISOString(), cwd: \"/repo\" },\n }),\n JSON.stringify({\n type: \"event_msg\",\n timestamp: new Date().toISOString(),\n payload: {\n type: \"item_completed\",\n item: {\n type: \"AgentMessage\",\n content: [{ type: \"Text\", text: \"Waiting for the user now\" }],\n },\n },\n }),\n ].join(\"\\n\"),\n );\n\n const running = parser.readSession(\n \"unused.jsonl\",\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"running\", timestamp: new Date().toISOString(), cwd: \"/repo\" },\n }),\n JSON.stringify({\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Working\" },\n }),\n ].join(\"\\n\"),\n );\n\n expect(waiting?.summary).toBe(\"Waiting for the user now\");\n expect(parser.determineStatus(waiting!)).toBe(AgentStatus.WAITING);\n expect(parser.determineStatus(running!)).toBe(AgentStatus.RUNNING);\n });\n\n it(\"builds historical summaries from the first non-synthetic user message\", () => {\n const filePath = writeJsonl(\"summary.jsonl\", [\n {\n type: \"session_meta\",\n payload: { id: \"summary\", cwd: \"/repo\", timestamp: \"2025-01-01T00:00:00Z\" },\n },\n {\n type: \"response_item\",\n timestamp: \"2025-01-01T00:00:00.500Z\",\n payload: {\n type: \"message\",\n role: \"user\",\n content: [\n {\n type: \"input_text\",\n text: \"<environment_context>\\n <cwd>/repo</cwd>\\n</environment_context>\",\n },\n ],\n },\n },\n {\n type: \"event_msg\",\n timestamp: \"2025-01-01T00:00:02Z\",\n payload: {\n type: \"item_completed\",\n item: { type: \"UserMessage\", content: [{ type: \"text\", text: \"first event user\" }] },\n },\n },\n ]);\n\n expect(parser.fileToSessionSummary(filePath)).toMatchObject({\n type: \"codex\",\n sessionId: \"summary\",\n cwd: \"/repo\",\n firstUserMessage: \"first event user\",\n sessionFilePath: filePath,\n });\n });\n\n it(\"returns null or empty results for unreadable and malformed inputs\", () => {\n expect(parser.readSession(path.join(tmpDir, \"missing.jsonl\"))).toBeNull();\n expect(parser.readSession(\"unused.jsonl\", \"\")).toBeNull();\n expect(\n parser.readSession(\"unused.jsonl\", JSON.stringify({ type: \"event\", payload: {} })),\n ).toBeNull();\n expect(parser.getConversation(path.join(tmpDir, \"missing.jsonl\"))).toEqual([]);\n });\n\n function writeJsonl(name: string, entries: object[]): string {\n const filePath = path.join(tmpDir, name);\n fs.writeFileSync(filePath, entries.map((entry) => JSON.stringify(entry)).join(\"\\n\"));\n return filePath;\n }\n});\n"],"names":["fs","os","path","AgentStatus","CodexSessionParser","describe","tmpDir","parser","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","it","filePath","writeJsonl","type","payload","id","timestamp","cwd","message","session","readSession","expect","toMatchObject","sessionId","projectPath","summary","lastPayloadType","sessionStart","toISOString","toBe","determineStatus","IDLE","role","content","text","internal_chat_message_metadata_passthrough","turn_id","item","getConversation","toEqual","waiting","JSON","stringify","Date","running","WAITING","RUNNING","fileToSessionSummary","firstUserMessage","sessionFilePath","toBeNull","name","entries","writeFileSync","map","entry"],"mappings":"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"}
|