@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
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
|
|
3
4
|
import { safeReadFile, safeStat } from "../../utils/session.js";
|
|
4
|
-
|
|
5
|
+
import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
|
|
6
|
+
import { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
|
|
7
|
+
const MIRROR_OVERSCAN = 8;
|
|
5
8
|
export class CodexSessionParser {
|
|
9
|
+
/** Incremental reader backing `getConversation({ tail })`. */ tailReader = new JsonlTailReader();
|
|
10
|
+
sessionCache;
|
|
11
|
+
constructor(options = {}){
|
|
12
|
+
this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {
|
|
13
|
+
bounds: options.summaryBounds
|
|
14
|
+
});
|
|
15
|
+
}
|
|
6
16
|
readSession(filePath, cachedContent) {
|
|
7
17
|
let content;
|
|
8
18
|
if (cachedContent !== undefined) {
|
|
@@ -14,42 +24,83 @@ export class CodexSessionParser {
|
|
|
14
24
|
return null;
|
|
15
25
|
}
|
|
16
26
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
27
|
+
return this.toSession(reduceJsonlContent(this.summaryReducer, content), ()=>fs.statSync(filePath).mtime);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Same result as `readSession`, but backed by a per-instance incremental
|
|
31
|
+
* cache so repeated refreshes only parse bytes appended since the last call.
|
|
32
|
+
* Call `pruneSessionCache()` once per refresh to evict files no longer read.
|
|
33
|
+
*
|
|
34
|
+
* The first read of a large transcript is a bounded head + tail scan (see
|
|
35
|
+
* `summaryReducer.skip`); fields whose entries lie only in the skipped
|
|
36
|
+
* middle fall back to their defaults instead of forcing a full parse.
|
|
37
|
+
*/ readSessionIncremental(filePath) {
|
|
38
|
+
const result = this.sessionCache.read(filePath);
|
|
39
|
+
return result ? this.toSession(result.state, ()=>result.mtime) : null;
|
|
40
|
+
}
|
|
41
|
+
/** Evict cached summaries for files not read since the previous prune. */ pruneSessionCache() {
|
|
42
|
+
this.sessionCache.prune();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Fold one JSONL entry into the O(1) session summary. The first line must
|
|
46
|
+
* be a `session_meta` entry; the rest track the last typed entry and the
|
|
47
|
+
* last entry with displayable text.
|
|
48
|
+
*
|
|
49
|
+
* `skip` (bounded cold start) keeps the head's `session_meta` and clears the
|
|
50
|
+
* "latest" fields, so those come from the tail only. Without a typed tail
|
|
51
|
+
* entry lastActive falls back to the meta timestamp, then the file mtime;
|
|
52
|
+
* without tail text the summary is the "Codex session active" default. A
|
|
53
|
+
* `session_meta` line longer than the head window yields no session (null).
|
|
54
|
+
*/ summaryReducer = {
|
|
55
|
+
initial: ()=>({
|
|
56
|
+
seenFirstLine: false
|
|
57
|
+
}),
|
|
58
|
+
reduce: (state, value)=>{
|
|
59
|
+
const entry = value && typeof value === "object" ? value : undefined;
|
|
60
|
+
const next = {
|
|
61
|
+
...state,
|
|
62
|
+
seenFirstLine: true
|
|
63
|
+
};
|
|
64
|
+
if (!state.seenFirstLine) {
|
|
65
|
+
if (entry?.type === "session_meta" && entry.payload?.id) {
|
|
66
|
+
next.meta = {
|
|
67
|
+
id: entry.payload.id,
|
|
68
|
+
cwd: entry.payload.cwd,
|
|
69
|
+
timestamp: entry.payload.timestamp
|
|
70
|
+
};
|
|
71
|
+
}
|
|
34
72
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
73
|
+
// Without a leading session_meta the file is not a Codex session; skip the work
|
|
74
|
+
if (!entry || !next.meta) return next;
|
|
75
|
+
if (typeof entry.type === "string") {
|
|
76
|
+
next.lastEntryTimestamp = entry.timestamp;
|
|
77
|
+
next.lastPayloadType = this.normalizedPayloadType(entry);
|
|
78
|
+
}
|
|
79
|
+
const text = this.extractEntryText(entry);
|
|
80
|
+
if (text) next.summary = truncate(text, SUMMARY_MAX_LENGTH);
|
|
81
|
+
return next;
|
|
82
|
+
},
|
|
83
|
+
skip: (state)=>({
|
|
84
|
+
seenFirstLine: true,
|
|
85
|
+
meta: state.meta
|
|
86
|
+
})
|
|
87
|
+
};
|
|
88
|
+
toSession(state, fileMtime) {
|
|
89
|
+
const meta = state.meta;
|
|
90
|
+
if (!meta) return null;
|
|
91
|
+
const lastActive = parseTimestamp(state.lastEntryTimestamp) || parseTimestamp(meta.timestamp) || fileMtime();
|
|
92
|
+
const sessionStart = parseTimestamp(meta.timestamp) || lastActive;
|
|
40
93
|
return {
|
|
41
|
-
sessionId:
|
|
42
|
-
projectPath:
|
|
43
|
-
summary:
|
|
94
|
+
sessionId: meta.id,
|
|
95
|
+
projectPath: meta.cwd || "",
|
|
96
|
+
summary: state.summary ?? "Codex session active",
|
|
44
97
|
sessionStart,
|
|
45
98
|
lastActive,
|
|
46
|
-
lastPayloadType
|
|
99
|
+
lastPayloadType: state.lastPayloadType
|
|
47
100
|
};
|
|
48
101
|
}
|
|
49
102
|
determineStatus(session) {
|
|
50
|
-
|
|
51
|
-
const diffMinutes = diffMs / 60000;
|
|
52
|
-
if (diffMinutes > IDLE_THRESHOLD_MINUTES) {
|
|
103
|
+
if (isIdle(session.lastActive)) {
|
|
53
104
|
return AgentStatus.IDLE;
|
|
54
105
|
}
|
|
55
106
|
if (session.lastPayloadType === "agent_message" || session.lastPayloadType === "task_complete" || session.lastPayloadType === "turn_aborted") {
|
|
@@ -59,33 +110,53 @@ export class CodexSessionParser {
|
|
|
59
110
|
}
|
|
60
111
|
getConversation(sessionFilePath, options) {
|
|
61
112
|
const verbose = options?.verbose ?? false;
|
|
113
|
+
const source = {
|
|
114
|
+
parseLine: (line)=>this.lineToConversationItem(line, verbose),
|
|
115
|
+
finalize: (items)=>this.dedupeMirroredMessages(items)
|
|
116
|
+
};
|
|
117
|
+
const tail = normalizeTail(options?.tail);
|
|
118
|
+
if (tail !== undefined) {
|
|
119
|
+
// Mirrored pairs sit next to each other, so a few extra messages of
|
|
120
|
+
// look-behind keep de-duplication exact for the returned tail.
|
|
121
|
+
return this.tailReader.read(sessionFilePath, tail, source, String(verbose), MIRROR_OVERSCAN);
|
|
122
|
+
}
|
|
62
123
|
const content = safeReadFile(sessionFilePath);
|
|
63
124
|
if (content === undefined) return [];
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
try {
|
|
69
|
-
entries.push(JSON.parse(line));
|
|
70
|
-
} catch {
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
125
|
+
const items = [];
|
|
126
|
+
for (const line of content.trim().split("\n")){
|
|
127
|
+
const item = source.parseLine(line);
|
|
128
|
+
if (item) items.push(item);
|
|
73
129
|
}
|
|
130
|
+
return this.dedupeMirroredMessages(items);
|
|
131
|
+
}
|
|
132
|
+
lineToConversationItem(line, verbose) {
|
|
133
|
+
let entry;
|
|
134
|
+
try {
|
|
135
|
+
entry = JSON.parse(line);
|
|
136
|
+
} catch {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const message = this.toConversationMessage(entry, verbose);
|
|
140
|
+
if (!message) return null;
|
|
141
|
+
return {
|
|
142
|
+
entryType: entry.type,
|
|
143
|
+
mirrorKey: this.mirroredMessageKey(entry, message),
|
|
144
|
+
message
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** Drop event_msg messages mirrored by a response_item with the same turn/role/content. */ dedupeMirroredMessages(items) {
|
|
74
148
|
const responseItemMirrorKeys = new Set();
|
|
75
|
-
for (const
|
|
76
|
-
if (
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (mirrorKey) responseItemMirrorKeys.add(mirrorKey);
|
|
149
|
+
for (const item of items){
|
|
150
|
+
if (item.entryType === "response_item" && item.mirrorKey) {
|
|
151
|
+
responseItemMirrorKeys.add(item.mirrorKey);
|
|
152
|
+
}
|
|
80
153
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
const mirrorKey = this.mirroredMessageKey(entry, message);
|
|
85
|
-
if (entry.type === "event_msg" && mirrorKey && responseItemMirrorKeys.has(mirrorKey)) {
|
|
154
|
+
const messages = [];
|
|
155
|
+
for (const item of items){
|
|
156
|
+
if (item.entryType === "event_msg" && item.mirrorKey && responseItemMirrorKeys.has(item.mirrorKey)) {
|
|
86
157
|
continue;
|
|
87
158
|
}
|
|
88
|
-
messages.push(message);
|
|
159
|
+
messages.push(item.message);
|
|
89
160
|
}
|
|
90
161
|
return messages;
|
|
91
162
|
}
|
|
@@ -112,7 +183,7 @@ export class CodexSessionParser {
|
|
|
112
183
|
} catch {
|
|
113
184
|
continue;
|
|
114
185
|
}
|
|
115
|
-
const ts =
|
|
186
|
+
const ts = parseTimestamp(entry.timestamp);
|
|
116
187
|
if (ts) lastTimestamp = ts;
|
|
117
188
|
if (!firstUserMessage) {
|
|
118
189
|
const message = this.toConversationMessage(entry, false);
|
|
@@ -123,7 +194,7 @@ export class CodexSessionParser {
|
|
|
123
194
|
}
|
|
124
195
|
}
|
|
125
196
|
const stat = safeStat(filePath);
|
|
126
|
-
const startedAt =
|
|
197
|
+
const startedAt = parseTimestamp(metaEntry.payload.timestamp) || lastTimestamp || stat?.birthtime || stat?.mtime || new Date();
|
|
127
198
|
const lastActive = lastTimestamp || startedAt;
|
|
128
199
|
return {
|
|
129
200
|
type: "codex",
|
|
@@ -135,34 +206,13 @@ export class CodexSessionParser {
|
|
|
135
206
|
sessionFilePath: filePath
|
|
136
207
|
};
|
|
137
208
|
}
|
|
138
|
-
parseTimestamp(value) {
|
|
139
|
-
if (!value) return null;
|
|
140
|
-
const timestamp = new Date(value);
|
|
141
|
-
return Number.isNaN(timestamp.getTime()) ? null : timestamp;
|
|
142
|
-
}
|
|
143
209
|
parseMetaTimestampMs(value) {
|
|
144
210
|
if (typeof value !== "string") return null;
|
|
145
|
-
const timestamp =
|
|
211
|
+
const timestamp = parseTimestamp(value);
|
|
146
212
|
if (!timestamp) return null;
|
|
147
213
|
const timestampMs = timestamp.getTime();
|
|
148
214
|
return Number.isFinite(timestampMs) ? timestampMs : null;
|
|
149
215
|
}
|
|
150
|
-
findLastEventEntry(entries) {
|
|
151
|
-
for(let i = entries.length - 1; i >= 0; i--){
|
|
152
|
-
const entry = entries[i];
|
|
153
|
-
if (entry && typeof entry.type === "string") {
|
|
154
|
-
return entry;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return undefined;
|
|
158
|
-
}
|
|
159
|
-
extractSummary(entries) {
|
|
160
|
-
for(let i = entries.length - 1; i >= 0; i--){
|
|
161
|
-
const message = this.extractEntryText(entries[i]);
|
|
162
|
-
if (message) return this.truncate(message, 120);
|
|
163
|
-
}
|
|
164
|
-
return "Codex session active";
|
|
165
|
-
}
|
|
166
216
|
normalizedPayloadType(entry) {
|
|
167
217
|
const payloadType = entry.payload?.type;
|
|
168
218
|
if (entry.type === "response_item" && payloadType === "message") {
|
|
@@ -187,10 +237,6 @@ export class CodexSessionParser {
|
|
|
187
237
|
const conversationMessage = this.toConversationMessage(entry, false);
|
|
188
238
|
return conversationMessage?.content.trim() ?? "";
|
|
189
239
|
}
|
|
190
|
-
truncate(value, maxLength) {
|
|
191
|
-
if (value.length <= maxLength) return value;
|
|
192
|
-
return `${value.slice(0, maxLength - 3)}...`;
|
|
193
|
-
}
|
|
194
240
|
toConversationMessage(entry, verbose) {
|
|
195
241
|
if (entry.type === "session_meta") return null;
|
|
196
242
|
const payloadType = entry.payload?.type;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/codex/CodexSessionParser.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport type {\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n} from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { JsonlTailReader, normalizeTail, type JsonlTailSource } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\n\nexport interface CodexEventEntry {\n timestamp?: string;\n type?: string;\n payload?: {\n type?: string;\n message?: string;\n id?: string;\n cwd?: string;\n timestamp?: string;\n role?: string;\n content?: CodexContent[];\n item?: CodexItem;\n turn_id?: string;\n internal_chat_message_metadata_passthrough?: {\n turn_id?: string;\n };\n };\n}\n\nexport interface CodexContent {\n type?: string;\n text?: string;\n}\n\nexport interface CodexItem {\n type?: string;\n content?: string | CodexContent[];\n}\n\nexport interface CodexSession {\n sessionId: string;\n projectPath: string;\n summary: string;\n sessionStart: Date;\n lastActive: Date;\n lastPayloadType?: string;\n}\n\n/** O(1) running summary folded from session entries; `toSession` builds a `CodexSession`. */\ninterface CodexSummaryState {\n seenFirstLine: boolean;\n /** Set only when the first line is a valid `session_meta` entry. */\n meta?: { id: string; cwd?: string; timestamp?: string };\n lastEntryTimestamp?: string;\n lastPayloadType?: string;\n /** Truncated text of the last entry with displayable content. */\n summary?: string;\n}\n\n/** A candidate conversation message plus what is needed to de-duplicate mirrors. */\ninterface CodexConversationItem {\n entryType?: string;\n mirrorKey: string | null;\n message: ConversationMessage;\n}\n\nconst MIRROR_OVERSCAN = 8;\n\nexport interface CodexSessionParserOptions {\n /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class CodexSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly sessionCache: IncrementalJsonlSummary<CodexSummaryState>;\n\n constructor(options: CodexSessionParserOptions = {}) {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n readSession(filePath: string, cachedContent?: string): CodexSession | null {\n let content: string;\n if (cachedContent !== undefined) {\n content = cachedContent;\n } else {\n try {\n content = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n return this.toSession(\n reduceJsonlContent(this.summaryReducer, content),\n () => fs.statSync(filePath).mtime,\n );\n }\n\n /**\n * Same result as `readSession`, but backed by a per-instance incremental\n * cache so repeated refreshes only parse bytes appended since the last call.\n * Call `pruneSessionCache()` once per refresh to evict files no longer read.\n *\n * The first read of a large transcript is a bounded head + tail scan (see\n * `summaryReducer.skip`); fields whose entries lie only in the skipped\n * middle fall back to their defaults instead of forcing a full parse.\n */\n readSessionIncremental(filePath: string): CodexSession | null {\n const result = this.sessionCache.read(filePath);\n return result ? this.toSession(result.state, () => result.mtime) : null;\n }\n\n /** Evict cached summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n /**\n * Fold one JSONL entry into the O(1) session summary. The first line must\n * be a `session_meta` entry; the rest track the last typed entry and the\n * last entry with displayable text.\n *\n * `skip` (bounded cold start) keeps the head's `session_meta` and clears the\n * \"latest\" fields, so those come from the tail only. Without a typed tail\n * entry lastActive falls back to the meta timestamp, then the file mtime;\n * without tail text the summary is the \"Codex session active\" default. A\n * `session_meta` line longer than the head window yields no session (null).\n */\n private readonly summaryReducer: JsonlSummaryReducer<CodexSummaryState> = {\n initial: () => ({ seenFirstLine: false }),\n reduce: (state, value) => {\n const entry = value && typeof value === \"object\" ? (value as CodexEventEntry) : undefined;\n const next: CodexSummaryState = { ...state, seenFirstLine: true };\n\n if (!state.seenFirstLine) {\n if (entry?.type === \"session_meta\" && entry.payload?.id) {\n next.meta = {\n id: entry.payload.id,\n cwd: entry.payload.cwd,\n timestamp: entry.payload.timestamp,\n };\n }\n }\n // Without a leading session_meta the file is not a Codex session; skip the work\n if (!entry || !next.meta) return next;\n\n if (typeof entry.type === \"string\") {\n next.lastEntryTimestamp = entry.timestamp;\n next.lastPayloadType = this.normalizedPayloadType(entry);\n }\n\n const text = this.extractEntryText(entry);\n if (text) next.summary = truncate(text, SUMMARY_MAX_LENGTH);\n\n return next;\n },\n skip: (state) => ({ seenFirstLine: true, meta: state.meta }),\n };\n\n private toSession(state: CodexSummaryState, fileMtime: () => Date): CodexSession | null {\n const meta = state.meta;\n if (!meta) return null;\n\n const lastActive =\n parseTimestamp(state.lastEntryTimestamp) || parseTimestamp(meta.timestamp) || fileMtime();\n const sessionStart = parseTimestamp(meta.timestamp) || lastActive;\n\n return {\n sessionId: meta.id,\n projectPath: meta.cwd || \"\",\n summary: state.summary ?? \"Codex session active\",\n sessionStart,\n lastActive,\n lastPayloadType: state.lastPayloadType,\n };\n }\n\n determineStatus(session: CodexSession): AgentStatus {\n if (isIdle(session.lastActive)) {\n return AgentStatus.IDLE;\n }\n\n if (\n session.lastPayloadType === \"agent_message\" ||\n session.lastPayloadType === \"task_complete\" ||\n session.lastPayloadType === \"turn_aborted\"\n ) {\n return AgentStatus.WAITING;\n }\n\n return AgentStatus.RUNNING;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const source: JsonlTailSource<CodexConversationItem> = {\n parseLine: (line) => this.lineToConversationItem(line, verbose),\n finalize: (items) => this.dedupeMirroredMessages(items),\n };\n\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n // Mirrored pairs sit next to each other, so a few extra messages of\n // look-behind keep de-duplication exact for the returned tail.\n return this.tailReader.read(sessionFilePath, tail, source, String(verbose), MIRROR_OVERSCAN);\n }\n\n const content = safeReadFile(sessionFilePath);\n if (content === undefined) return [];\n\n const items: CodexConversationItem[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const item = source.parseLine(line);\n if (item) items.push(item);\n }\n\n return this.dedupeMirroredMessages(items);\n }\n\n private lineToConversationItem(line: string, verbose: boolean): CodexConversationItem | null {\n let entry: CodexEventEntry;\n try {\n entry = JSON.parse(line);\n } catch {\n return null;\n }\n\n const message = this.toConversationMessage(entry, verbose);\n if (!message) return null;\n\n return { entryType: entry.type, mirrorKey: this.mirroredMessageKey(entry, message), message };\n }\n\n /** Drop event_msg messages mirrored by a response_item with the same turn/role/content. */\n private dedupeMirroredMessages(items: CodexConversationItem[]): ConversationMessage[] {\n const responseItemMirrorKeys = new Set<string>();\n for (const item of items) {\n if (item.entryType === \"response_item\" && item.mirrorKey) {\n responseItemMirrorKeys.add(item.mirrorKey);\n }\n }\n\n const messages: ConversationMessage[] = [];\n for (const item of items) {\n if (\n item.entryType === \"event_msg\" &&\n item.mirrorKey &&\n responseItemMirrorKeys.has(item.mirrorKey)\n ) {\n continue;\n }\n messages.push(item.message);\n }\n return messages;\n }\n\n fileToSessionSummary(filePath: string): SessionSummary | null {\n const content = safeReadFile(filePath);\n if (content === undefined) return null;\n\n const allLines = content.trim().split(\"\\n\");\n if (!allLines[0]) return null;\n\n let metaEntry: CodexEventEntry;\n try {\n metaEntry = JSON.parse(allLines[0]);\n } catch {\n return null;\n }\n\n if (metaEntry.type !== \"session_meta\" || !metaEntry.payload?.id) {\n return null;\n }\n\n let firstUserMessage = \"\";\n let lastTimestamp: Date | null = null;\n\n for (let i = 1; i < allLines.length; i++) {\n let entry: CodexEventEntry;\n try {\n entry = JSON.parse(allLines[i]);\n } catch {\n continue;\n }\n\n const ts = parseTimestamp(entry.timestamp);\n if (ts) lastTimestamp = ts;\n\n if (!firstUserMessage) {\n const message = this.toConversationMessage(entry, false);\n const content = message?.content.trim() ?? \"\";\n if (\n message?.role === \"user\" &&\n content.length > 0 &&\n !this.isSyntheticUserMessage(content)\n ) {\n firstUserMessage = content;\n }\n }\n }\n\n const stat = safeStat(filePath);\n\n const startedAt =\n parseTimestamp(metaEntry.payload.timestamp) ||\n lastTimestamp ||\n stat?.birthtime ||\n stat?.mtime ||\n new Date();\n const lastActive = lastTimestamp || startedAt;\n\n return {\n type: \"codex\",\n sessionId: metaEntry.payload.id,\n cwd: metaEntry.payload.cwd || \"\",\n firstUserMessage,\n lastActive,\n startedAt,\n sessionFilePath: filePath,\n };\n }\n\n parseMetaTimestampMs(value?: string): number | null {\n if (typeof value !== \"string\") return null;\n\n const timestamp = parseTimestamp(value);\n if (!timestamp) return null;\n\n const timestampMs = timestamp.getTime();\n return Number.isFinite(timestampMs) ? timestampMs : null;\n }\n\n private normalizedPayloadType(entry: CodexEventEntry): string | undefined {\n const payloadType = entry.payload?.type;\n\n if (entry.type === \"response_item\" && payloadType === \"message\") {\n if (entry.payload?.role === \"assistant\") return \"agent_message\";\n if (entry.payload?.role === \"user\") return \"user_message\";\n return payloadType;\n }\n\n if (entry.type === \"event_msg\" && payloadType === \"item_completed\") {\n const itemType = entry.payload?.item?.type;\n if (itemType === \"AgentMessage\") return \"agent_message\";\n if (itemType === \"UserMessage\") return \"user_message\";\n return itemType ?? payloadType;\n }\n\n return payloadType;\n }\n\n private extractEntryText(entry: CodexEventEntry | undefined): string {\n if (!entry) return \"\";\n\n const legacyMessage = entry.payload?.message;\n if (typeof legacyMessage === \"string\" && legacyMessage.trim().length > 0) {\n return legacyMessage.trim();\n }\n\n const conversationMessage = this.toConversationMessage(entry, false);\n return conversationMessage?.content.trim() ?? \"\";\n }\n\n private toConversationMessage(\n entry: CodexEventEntry,\n verbose: boolean,\n ): ConversationMessage | null {\n if (entry.type === \"session_meta\") return null;\n\n const payloadType = entry.payload?.type;\n if (entry.type === \"response_item\" && payloadType === \"message\") {\n const role = this.mapCodexRole(entry.payload?.role, verbose);\n const text = this.extractContentText(entry.payload?.content);\n if (!role || !text) return null;\n\n return { role, content: text, timestamp: entry.timestamp };\n }\n\n if (entry.type === \"event_msg\" && payloadType === \"item_completed\") {\n const item = entry.payload?.item;\n const role = this.mapCodexItemRole(item?.type, verbose);\n const text = this.extractContentText(item?.content);\n if (!role || !text) return null;\n\n return { role, content: text, timestamp: entry.timestamp };\n }\n\n if (!payloadType) return null;\n\n let role: ConversationMessage[\"role\"];\n if (payloadType === \"user_message\") {\n role = \"user\";\n } else if (payloadType === \"agent_message\" || payloadType === \"task_complete\") {\n role = \"assistant\";\n } else if (verbose) {\n role = \"system\";\n } else {\n return null;\n }\n\n const text = entry.payload?.message?.trim();\n if (!text) return null;\n\n return { role, content: text, timestamp: entry.timestamp };\n }\n\n private mapCodexRole(\n role: string | undefined,\n verbose: boolean,\n ): ConversationMessage[\"role\"] | null {\n if (role === \"user\") return \"user\";\n if (role === \"assistant\") return \"assistant\";\n return verbose ? \"system\" : null;\n }\n\n private mapCodexItemRole(\n itemType: string | undefined,\n verbose: boolean,\n ): ConversationMessage[\"role\"] | null {\n if (itemType === \"AgentMessage\") return \"assistant\";\n if (itemType === \"UserMessage\") return \"user\";\n return verbose ? \"system\" : null;\n }\n\n private mirroredMessageKey(entry: CodexEventEntry, message: ConversationMessage): string | null {\n const turnId =\n entry.payload?.turn_id || entry.payload?.internal_chat_message_metadata_passthrough?.turn_id;\n\n if (!turnId) return null;\n return `${turnId}\\0${message.role}\\0${message.content}`;\n }\n\n private extractContentText(content: string | CodexContent[] | undefined): string {\n if (typeof content === \"string\") return content.trim();\n if (!Array.isArray(content)) return \"\";\n\n return content\n .map((part) => part.text)\n .filter((text): text is string => typeof text === \"string\" && text.trim().length > 0)\n .map((text) => text.trim())\n .join(\"\\n\")\n .trim();\n }\n\n private isSyntheticUserMessage(content: string): boolean {\n return (\n content.startsWith(\"<environment_context>\") && content.includes(\"</environment_context>\")\n );\n }\n}\n"],"names":["fs","AgentStatus","JsonlTailReader","normalizeTail","safeReadFile","safeStat","IncrementalJsonlSummary","reduceJsonlContent","isIdle","parseTimestamp","SUMMARY_MAX_LENGTH","truncate","MIRROR_OVERSCAN","CodexSessionParser","tailReader","sessionCache","options","summaryReducer","bounds","summaryBounds","readSession","filePath","cachedContent","content","undefined","readFileSync","toSession","statSync","mtime","readSessionIncremental","result","read","state","pruneSessionCache","prune","initial","seenFirstLine","reduce","value","entry","next","type","payload","id","meta","cwd","timestamp","lastEntryTimestamp","lastPayloadType","normalizedPayloadType","text","extractEntryText","summary","skip","fileMtime","lastActive","sessionStart","sessionId","projectPath","determineStatus","session","IDLE","WAITING","RUNNING","getConversation","sessionFilePath","verbose","source","parseLine","line","lineToConversationItem","finalize","items","dedupeMirroredMessages","tail","String","trim","split","item","push","JSON","parse","message","toConversationMessage","entryType","mirrorKey","mirroredMessageKey","responseItemMirrorKeys","Set","add","messages","has","fileToSessionSummary","allLines","metaEntry","firstUserMessage","lastTimestamp","i","length","ts","role","isSyntheticUserMessage","stat","startedAt","birthtime","Date","parseMetaTimestampMs","timestampMs","getTime","Number","isFinite","payloadType","itemType","legacyMessage","conversationMessage","mapCodexRole","extractContentText","mapCodexItemRole","turnId","turn_id","internal_chat_message_metadata_passthrough","Array","isArray","map","part","filter","join","startsWith","includes"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/
|
|
1
|
+
{"version":3,"file":"CodexCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/codex/durable/CodexCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIlE,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,oBAAyB;IAaxC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CA+BnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/codex/durable/CodexCliProbe.ts"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { CodexPrintError } from \"../../../durable/DurableAgent.js\";\nimport { sanitizeText } from \"../../../durable/utils.js\";\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CodexCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class CodexCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: CodexCliProbeOptions = {}) {\n this.executable = options.executable ?? \"codex\";\n this.exec =\n options.exec ??\n (async (file, args) => {\n const result = await execFileAsync(file, args, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const version = await this.exec(this.executable, [\"--version\"]);\n const execHelp = await this.exec(this.executable, [\"exec\", \"--help\"]);\n const resumeHelp = await this.exec(this.executable, [\"exec\", \"resume\", \"--help\"]);\n const missing = [\n !execHelp.stdout.includes(\"exec\") && \"exec\",\n !execHelp.stdout.includes(\"--json\") && \"--json\",\n !hasStdinDash(execHelp.stdout) && \"stdin -\",\n !resumeHelp.stdout.includes(\"resume\") && \"resume\",\n !resumeHelp.stdout.includes(\"--json\") && \"resume --json\",\n !hasStdinDash(resumeHelp.stdout) && \"resume stdin -\",\n ].filter((value): value is string => typeof value === \"string\");\n if (missing.length > 0) {\n throw new CodexPrintError(\n `Codex CLI does not support required print-mode capabilities: ${missing.join(\", \")}.`,\n \"CODEX_CLI_UNSUPPORTED\",\n );\n }\n return {\n executable: this.executable,\n version: sanitizeText(version.stdout, 256) || \"unknown\",\n };\n } catch (error) {\n if (error instanceof CodexPrintError) throw error;\n throw new CodexPrintError(\n `Codex CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n \"CODEX_CLI_UNAVAILABLE\",\n );\n }\n }\n}\n\nfunction hasStdinDash(help: string): boolean {\n return /(?:^|\\s)-(?:\\s|$)/m.test(help);\n}\n"],"names":["execFile","promisify","CodexPrintError","sanitizeText","execFileAsync","CodexCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","version","execHelp","resumeHelp","missing","includes","hasStdinDash","filter","value","length","join","error","message","help","test"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,eAAe,QAAQ,mCAAmC;AACnE,SAASC,YAAY,QAAQ,4BAA4B;AAKzD,MAAMC,gBAAgBH,UAAUD;AAOhC,OAAO,MAAMK;IACMC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAAgC,CAAC,CAAC,CAAE;QAC9C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GACPC,QAAQD,IAAI,IACX,CAAA,OAAOE,MAAMC;YACZ,MAAMC,SAAS,MAAMP,cAAcK,MAAMC,MAAM;gBAC7CE,UAAU;gBACVC,WAAW,OAAO;YACpB;YACA,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QACxD,CAAA;IACJ;IAEA,MAAMC,WAA6D;QACjE,IAAI;YACF,MAAMC,UAAU,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YAC9D,MAAMY,WAAW,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;gBAAQ;aAAS;YACpE,MAAMa,aAAa,MAAM,IAAI,CAACZ,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;gBAAQ;gBAAU;aAAS;YAChF,MAAMc,UAAU;gBACd,CAACF,SAASJ,MAAM,CAACO,QAAQ,CAAC,WAAW;gBACrC,CAACH,SAASJ,MAAM,CAACO,QAAQ,CAAC,aAAa;gBACvC,CAACC,aAAaJ,SAASJ,MAAM,KAAK;gBAClC,CAACK,WAAWL,MAAM,CAACO,QAAQ,CAAC,aAAa;gBACzC,CAACF,WAAWL,MAAM,CAACO,QAAQ,CAAC,aAAa;gBACzC,CAACC,aAAaH,WAAWL,MAAM,KAAK;aACrC,CAACS,MAAM,CAAC,CAACC,QAA2B,OAAOA,UAAU;YACtD,IAAIJ,QAAQK,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAIvB,gBACR,CAAC,6DAA6D,EAAEkB,QAAQM,IAAI,CAAC,MAAM,CAAC,CAAC,EACrF;YAEJ;YACA,OAAO;gBACLpB,YAAY,IAAI,CAACA,UAAU;gBAC3BW,SAASd,aAAac,QAAQH,MAAM,EAAE,QAAQ;YAChD;QACF,EAAE,OAAOa,OAAO;YACd,IAAIA,iBAAiBzB,iBAAiB,MAAMyB;YAC5C,MAAM,IAAIzB,gBACR,CAAC,6BAA6B,EAAEC,aAAa,AAACwB,MAAgBC,OAAO,EAAE,MAAM,EAC7E;QAEJ;IACF;AACF;AAEA,SAASN,aAAaO,IAAY;IAChC,OAAO,qBAAqBC,IAAI,CAACD;AACnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/
|
|
1
|
+
{"version":3,"file":"CodexPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/codex/durable/CodexPrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACnD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAClG;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,UAAU,UAAU;IAClB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,6BAA6B;IAC5C,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,sBAAsB;IACjC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,6BAAkC;IAOjD,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAK/E,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAwB7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/codex/durable/CodexPrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { CodexPrintError } from \"../../../durable/DurableAgent.js\";\nimport { CodexCliProbe } from \"./CodexCliProbe.js\";\nimport { CodexPrintRunner, type CodexPrintRunResult } from \"./CodexPrintRunner.js\";\nimport {\n DurableAgentRepository,\n type CreateDurableAgentInput,\n} from \"../../../durable/DurableAgentRepository.js\";\nimport { runDurableAgent, type DurableRunRepository } from \"../../../durable/run.js\";\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n bindProviderSession(id: string, token: string, providerSessionId: string): Promise<DurableAgent>;\n}\n\ninterface ProbeLike {\n validate(): Promise<{ executable: string; version: string }>;\n}\ninterface RunnerLike {\n run(request: Parameters<CodexPrintRunner[\"run\"]>[0]): Promise<CodexPrintRunResult>;\n}\n\nexport interface CodexPrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface CodexPrintSendResult extends CodexPrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class CodexPrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: CodexPrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new CodexCliProbe();\n this.runner = options.runner ?? new CodexPrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: Omit<CreateDurableAgentInput, \"provider\">): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create({ ...input, provider: \"codex\" });\n }\n\n async send(reference: string, prompt: string): Promise<CodexPrintSendResult> {\n const completed = await runDurableAgent({\n reference,\n provider: \"codex\",\n repository: this.repository,\n ambiguousError: () =>\n new CodexPrintError(\"Multiple print agents match.\", \"CODEX_UNSUPPORTED\"),\n providerError: () =>\n new CodexPrintError(\"Print agent provider is not Codex.\", \"CODEX_UNSUPPORTED\"),\n execute: (agent, token) =>\n this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n onSession: async (sessionId) => {\n await this.repository.bindProviderSession(agent.id, token, sessionId);\n },\n }),\n isSessionMismatch: (error) =>\n error instanceof CodexPrintError && error.code === \"CODEX_SESSION_MISMATCH\",\n });\n return { ...completed.result, agentId: completed.agent.id, agentName: completed.agent.name };\n }\n}\n"],"names":["CodexPrintError","CodexCliProbe","CodexPrintRunner","DurableAgentRepository","runDurableAgent","CodexPrintAgentService","repository","probe","runner","executable","options","create","input","validate","provider","send","reference","prompt","completed","ambiguousError","providerError","execute","agent","token","run","onSpawn","identity","recordProviderProcess","id","onSession","sessionId","bindProviderSession","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,eAAe,QAAQ,mCAAmC;AACnE,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,gBAAgB,QAAkC,wBAAwB;AACnF,SACEC,sBAAsB,QAEjB,6CAA6C;AACpD,SAASC,eAAe,QAAmC,0BAA0B;AA4BrF,OAAO,MAAMC;IACFC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAAyC,CAAC,CAAC,CAAE;QACvD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACtC;IAEA,MAAME,OAAOC,KAAgD,EAAyB;QACpF,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAAC;YAAE,GAAGC,KAAK;YAAEE,UAAU;QAAQ;IAC9D;IAEA,MAAMC,KAAKC,SAAiB,EAAEC,MAAc,EAAiC;QAC3E,MAAMC,YAAY,MAAMd,gBAAgB;YACtCY;YACAF,UAAU;YACVR,YAAY,IAAI,CAACA,UAAU;YAC3Ba,gBAAgB,IACd,IAAInB,gBAAgB,gCAAgC;YACtDoB,eAAe,IACb,IAAIpB,gBAAgB,sCAAsC;YAC5DqB,SAAS,CAACC,OAAOC,QACf,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACdF;oBACAL;oBACAR,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,SAAS,CAACC,WAAa,IAAI,CAACpB,UAAU,CAACqB,qBAAqB,CAACL,MAAMM,EAAE,EAAEL,OAAOG;oBAC9EG,WAAW,OAAOC;wBAChB,MAAM,IAAI,CAACxB,UAAU,CAACyB,mBAAmB,CAACT,MAAMM,EAAE,EAAEL,OAAOO;oBAC7D;gBACF;YACFE,mBAAmB,CAACC,QAClBA,iBAAiBjC,mBAAmBiC,MAAMC,IAAI,KAAK;QACvD;QACA,OAAO;YAAE,GAAGhB,UAAUiB,MAAM;YAAEC,SAASlB,UAAUI,KAAK,CAACM,EAAE;YAAES,WAAWnB,UAAUI,KAAK,CAACgB,IAAI;QAAC;IAC7F;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/
|
|
1
|
+
{"version":3,"file":"CodexPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/codex/durable/CodexPrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE3F,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAI3F,KAAK,KAAK,GAAG,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACpE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,uBAA4B;IAM3C,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAoCtE,OAAO,CAAC,qBAAqB;CAY9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/codex/durable/CodexPrintRunner.ts"],"sourcesContent":["import {\n spawn as nodeSpawn,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"child_process\";\nimport type { CodexDurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { CodexPrintError } from \"../../../durable/DurableAgent.js\";\nimport { LocalProcessInspector, type ProcessInspector } from \"../../../durable/process.js\";\nimport { waitForChildClose } from \"../../../durable/utils.js\";\nimport { CodexStreamParser } from \"./CodexStreamParser.js\";\n\ntype Spawn = (\n command: string,\n args: readonly string[],\n options: SpawnOptionsWithoutStdio & { stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n) => ChildProcessWithoutNullStreams;\n\nexport interface CodexPrintRunRequest {\n agent: CodexDurableAgent;\n prompt: string;\n executable?: string;\n onSpawn(identity: ProcessIdentity): Promise<void>;\n onSession(providerSessionId: string): Promise<void>;\n}\n\nexport interface CodexPrintRunResult {\n sessionId: string;\n result: string;\n messages: string[];\n exitCode: number;\n}\n\nexport interface CodexPrintRunnerOptions {\n spawn?: Spawn;\n processInspector?: ProcessInspector;\n maxLineBytes?: number;\n}\n\nexport class CodexPrintRunner {\n private readonly spawn: Spawn;\n private readonly processInspector: ProcessInspector;\n private readonly maxLineBytes: number;\n\n constructor(options: CodexPrintRunnerOptions = {}) {\n this.spawn = options.spawn ?? (nodeSpawn as Spawn);\n this.processInspector = options.processInspector ?? new LocalProcessInspector();\n this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;\n }\n\n async run(request: CodexPrintRunRequest): Promise<CodexPrintRunResult> {\n const args = buildCodexExecArgs(request.agent);\n const child = this.spawn(request.executable ?? \"codex\", args, {\n cwd: request.agent.cwd,\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n const identity = this.verifyProcessIdentity(child);\n\n const parser = new CodexStreamParser(\n request.agent.providerSessionId,\n request.onSession,\n this.maxLineBytes,\n );\n let processing = Promise.resolve();\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n if (parser.hasFailed()) return;\n processing = processing.then(() => parser.accept(chunk)).catch((error) => parser.fail(error));\n });\n child.stderr.resume();\n const closed = waitForChildClose(child);\n try {\n await request.onSpawn(identity);\n } catch (error) {\n child.kill();\n throw error;\n }\n child.stdin.end(request.prompt);\n const { code, signal } = await closed.catch(() => {\n throw new CodexPrintError(\"Codex process failed to start or communicate.\", \"CODEX_PROCESS\");\n });\n await processing;\n return parser.result({ code, signal });\n }\n\n private verifyProcessIdentity(child: ChildProcessWithoutNullStreams): ProcessIdentity {\n if (!child.pid) {\n child.kill();\n throw new CodexPrintError(\"Codex process did not provide a PID.\", \"CODEX_PROCESS\");\n }\n const identity = this.processInspector.getIdentity(child.pid);\n if (!identity) {\n child.kill();\n throw new CodexPrintError(\"Cannot verify Codex process identity.\", \"CODEX_PROCESS\");\n }\n return identity;\n }\n}\n\nfunction buildCodexExecArgs(agent: CodexDurableAgent): string[] {\n return agent.providerSessionId === null\n ? [\"exec\", \"--json\", \"-\"]\n : [\"exec\", \"resume\", \"--json\", agent.providerSessionId, \"-\"];\n}\n"],"names":["spawn","nodeSpawn","CodexPrintError","LocalProcessInspector","waitForChildClose","CodexStreamParser","CodexPrintRunner","processInspector","maxLineBytes","options","run","request","args","buildCodexExecArgs","agent","child","executable","cwd","shell","stdio","identity","verifyProcessIdentity","parser","providerSessionId","onSession","processing","Promise","resolve","stdout","on","chunk","hasFailed","then","accept","catch","error","fail","stderr","resume","closed","onSpawn","kill","stdin","end","prompt","code","signal","result","pid","getIdentity"],"mappings":"AAAA,SACEA,SAASC,SAAS,QAGb,gBAAgB;AAEvB,SAASC,eAAe,QAAQ,mCAAmC;AACnE,SAASC,qBAAqB,QAA+B,8BAA8B;AAC3F,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,iBAAiB,QAAQ,yBAAyB;AA6B3D,OAAO,MAAMC;IACMN,MAAa;IACbO,iBAAmC;IACnCC,aAAqB;IAEtC,YAAYC,UAAmC,CAAC,CAAC,CAAE;QACjD,IAAI,CAACT,KAAK,GAAGS,QAAQT,KAAK,IAAKC;QAC/B,IAAI,CAACM,gBAAgB,GAAGE,QAAQF,gBAAgB,IAAI,IAAIJ;QACxD,IAAI,CAACK,YAAY,GAAGC,QAAQD,YAAY,IAAI,OAAO;IACrD;IAEA,MAAME,IAAIC,OAA6B,EAAgC;QACrE,MAAMC,OAAOC,mBAAmBF,QAAQG,KAAK;QAC7C,MAAMC,QAAQ,IAAI,CAACf,KAAK,CAACW,QAAQK,UAAU,IAAI,SAASJ,MAAM;YAC5DK,KAAKN,QAAQG,KAAK,CAACG,GAAG;YACtBC,OAAO;YACPC,OAAO;gBAAC;gBAAQ;gBAAQ;aAAO;QACjC;QACA,MAAMC,WAAW,IAAI,CAACC,qBAAqB,CAACN;QAE5C,MAAMO,SAAS,IAAIjB,kBACjBM,QAAQG,KAAK,CAACS,iBAAiB,EAC/BZ,QAAQa,SAAS,EACjB,IAAI,CAAChB,YAAY;QAEnB,IAAIiB,aAAaC,QAAQC,OAAO;QAEhCZ,MAAMa,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;YACvB,IAAIR,OAAOS,SAAS,IAAI;YACxBN,aAAaA,WAAWO,IAAI,CAAC,IAAMV,OAAOW,MAAM,CAACH,QAAQI,KAAK,CAAC,CAACC,QAAUb,OAAOc,IAAI,CAACD;QACxF;QACApB,MAAMsB,MAAM,CAACC,MAAM;QACnB,MAAMC,SAASnC,kBAAkBW;QACjC,IAAI;YACF,MAAMJ,QAAQ6B,OAAO,CAACpB;QACxB,EAAE,OAAOe,OAAO;YACdpB,MAAM0B,IAAI;YACV,MAAMN;QACR;QACApB,MAAM2B,KAAK,CAACC,GAAG,CAAChC,QAAQiC,MAAM;QAC9B,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAG,MAAMP,OAAOL,KAAK,CAAC;YAC1C,MAAM,IAAIhC,gBAAgB,iDAAiD;QAC7E;QACA,MAAMuB;QACN,OAAOH,OAAOyB,MAAM,CAAC;YAAEF;YAAMC;QAAO;IACtC;IAEQzB,sBAAsBN,KAAqC,EAAmB;QACpF,IAAI,CAACA,MAAMiC,GAAG,EAAE;YACdjC,MAAM0B,IAAI;YACV,MAAM,IAAIvC,gBAAgB,wCAAwC;QACpE;QACA,MAAMkB,WAAW,IAAI,CAACb,gBAAgB,CAAC0C,WAAW,CAAClC,MAAMiC,GAAG;QAC5D,IAAI,CAAC5B,UAAU;YACbL,MAAM0B,IAAI;YACV,MAAM,IAAIvC,gBAAgB,yCAAyC;QACrE;QACA,OAAOkB;IACT;AACF;AAEA,SAASP,mBAAmBC,KAAwB;IAClD,OAAOA,MAAMS,iBAAiB,KAAK,OAC/B;QAAC;QAAQ;QAAU;KAAI,GACvB;QAAC;QAAQ;QAAU;QAAUT,MAAMS,iBAAiB;QAAE;KAAI;AAChE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CodexStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/
|
|
1
|
+
{"version":3,"file":"CodexStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/codex/durable/CodexStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,qBAAa,iBAAiB;IAQ1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,aAAa,CAAgC;gBAGlC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,SAAS,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACxE,YAAY,EAAE,MAAM;IAQtB,SAAS,IAAI,OAAO;IAId,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO1B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB;YA6BtC,WAAW;IAazB,OAAO,CAAC,UAAU;YAaJ,aAAa;IAe3B,OAAO,CAAC,sBAAsB;CAO/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/codex/durable/CodexStreamParser.ts"],"sourcesContent":["import { CodexPrintError } from \"../../../durable/DurableAgent.js\";\nimport { isUuid, LineBuffer, type ChildCloseResult } from \"../../../durable/utils.js\";\nimport type { CodexPrintRunResult } from \"./CodexPrintRunner.js\";\n\nexport class CodexStreamParser {\n private readonly lines: LineBuffer;\n private sessionId: string | null = null;\n private turnCompleted = false;\n private readonly messages: string[] = [];\n private protocolError: CodexPrintError | null = null;\n\n constructor(\n private readonly expectedSessionId: string | null,\n private readonly onSession: (providerSessionId: string) => Promise<void>,\n maxLineBytes: number,\n ) {\n this.lines = new LineBuffer(\n maxLineBytes,\n () => new CodexPrintError(\"Codex stream line exceeded the safety limit.\", \"CODEX_PROTOCOL\"),\n );\n }\n\n hasFailed(): boolean {\n return this.protocolError !== null;\n }\n\n async accept(chunk: Buffer | string): Promise<void> {\n for (const line of this.lines.accept(chunk)) {\n await this.processLine(line);\n }\n }\n\n fail(error: unknown): void {\n this.protocolError =\n error instanceof CodexPrintError\n ? error\n : new CodexPrintError(\"Codex stream processing failed.\", \"CODEX_PROTOCOL\");\n }\n\n result(close: ChildCloseResult): CodexPrintRunResult {\n if (this.protocolError) throw this.protocolError;\n this.lines.assertComplete(\n () => new CodexPrintError(\"Codex stream ended with incomplete JSON.\", \"CODEX_PROTOCOL\"),\n );\n\n if (close.code !== 0) {\n throw new CodexPrintError(\n `Codex print run failed${close.signal ? ` (${close.signal})` : \".\"}`,\n \"CODEX_PROCESS\",\n );\n }\n if (this.sessionId === null)\n throw new CodexPrintError(\"Codex stream ended without a thread identity.\", \"CODEX_PROTOCOL\");\n if (!this.turnCompleted)\n throw new CodexPrintError(\"Codex stream ended before turn completion.\", \"CODEX_PROTOCOL\");\n if (this.messages.length === 0)\n throw new CodexPrintError(\n \"Codex stream ended without an assistant result.\",\n \"CODEX_RESULT_MISSING\",\n );\n return {\n sessionId: this.sessionId,\n result: this.messages.at(-1)!,\n messages: this.messages,\n exitCode: close.code,\n };\n }\n\n private async processLine(line: Buffer): Promise<void> {\n if (this.protocolError || line.length === 0) return;\n\n const event = this.parseEvent(line);\n if (event.type === \"thread.started\") {\n await this.recordSession(event);\n } else if (event.type === \"item.completed\") {\n this.recordAssistantMessage(event.item);\n } else if (event.type === \"turn.completed\") {\n this.turnCompleted = true;\n }\n }\n\n private parseEvent(line: Buffer): Record<string, unknown> {\n let value: unknown;\n try {\n value = JSON.parse(line.toString(\"utf8\"));\n } catch {\n throw new CodexPrintError(\"Codex emitted malformed stream JSON.\", \"CODEX_PROTOCOL\");\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new CodexPrintError(\"Codex emitted a non-object stream message.\", \"CODEX_PROTOCOL\");\n }\n return value as Record<string, unknown>;\n }\n\n private async recordSession(event: Record<string, unknown>): Promise<void> {\n const sessionId = String(event.thread_id ?? \"\");\n if (this.sessionId !== null || !isUuid(sessionId)) {\n throw new CodexPrintError(\"Codex emitted an invalid thread identity.\", \"CODEX_PROTOCOL\");\n }\n if (this.expectedSessionId !== null && this.expectedSessionId !== sessionId) {\n throw new CodexPrintError(\n \"Codex returned a different session identity.\",\n \"CODEX_SESSION_MISMATCH\",\n );\n }\n this.sessionId = sessionId;\n await this.onSession(sessionId);\n }\n\n private recordAssistantMessage(item: unknown): void {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) return;\n const record = item as Record<string, unknown>;\n if (record.type === \"agent_message\" && typeof record.text === \"string\" && record.text.trim()) {\n this.messages.push(record.text);\n }\n }\n}\n"],"names":["CodexPrintError","isUuid","LineBuffer","CodexStreamParser","lines","sessionId","turnCompleted","messages","protocolError","expectedSessionId","onSession","maxLineBytes","hasFailed","accept","chunk","line","processLine","fail","error","result","close","assertComplete","code","signal","length","at","exitCode","event","parseEvent","type","recordSession","recordAssistantMessage","item","value","JSON","parse","toString","Array","isArray","String","thread_id","record","text","trim","push"],"mappings":"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"}
|
|
@@ -5,10 +5,13 @@
|
|
|
5
5
|
* 1. Filtering Copilot processes from a shared asynchronous process snapshot
|
|
6
6
|
* 2. Using snapshot CWD and start-time enrichment
|
|
7
7
|
* 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes
|
|
8
|
-
*
|
|
8
|
+
* (only directories modified since the process started are listed, and a
|
|
9
|
+
* known lock is re-validated with one stat on later refreshes)
|
|
10
|
+
* 4. Reading events.jsonl as the primary session/conversation source (incrementally
|
|
11
|
+
* cached across refreshes, so unchanged files are not re-read)
|
|
9
12
|
* 5. Reading workspace.yaml as a flat fallback metadata source
|
|
10
13
|
*/
|
|
11
|
-
import type { AgentAdapter, AgentInfo, ConversationMessage, ListSessionsOptions, ProcessInfo, SessionSummary, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
|
|
14
|
+
import type { AgentAdapter, AgentInfo, ConversationMessage, ConversationOptions, ListSessionsOptions, ProcessInfo, SessionSummary, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
|
|
12
15
|
import { AgentRegistry } from "../../utils/AgentRegistry.js";
|
|
13
16
|
export interface CopilotAdapterOptions {
|
|
14
17
|
sessionStateDir?: string;
|
|
@@ -23,13 +26,11 @@ export declare class CopilotAdapter implements AgentAdapter {
|
|
|
23
26
|
constructor(registry?: AgentRegistry, options?: CopilotAdapterOptions);
|
|
24
27
|
canHandle(processInfo: ProcessInfo): boolean;
|
|
25
28
|
detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}): ConversationMessage[];
|
|
29
|
+
private detectRunningAgents;
|
|
30
|
+
getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
|
|
29
31
|
listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
|
|
30
32
|
findSessionsById(sessionId: string): Promise<SessionSummary[]>;
|
|
31
33
|
private toSessionSummary;
|
|
32
34
|
private applyWrapperRegistryName;
|
|
33
|
-
private isCopilotExecutable;
|
|
34
35
|
}
|
|
35
36
|
//# sourceMappingURL=CopilotAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopilotAdapter.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,aAAa,EAAsB,MAAM,8BAA8B,CAAC;AAMjF,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,YAAY,uBAAwB;IAE7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;gBAG9C,QAAQ,GAAE,aAAuC,EACjD,OAAO,GAAE,qBAA0B;IAUrC,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAS3D,mBAAmB;IAoCjC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAIxF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAcnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYpE,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,wBAAwB;CAYjC"}
|
|
@@ -5,14 +5,18 @@
|
|
|
5
5
|
* 1. Filtering Copilot processes from a shared asynchronous process snapshot
|
|
6
6
|
* 2. Using snapshot CWD and start-time enrichment
|
|
7
7
|
* 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes
|
|
8
|
-
*
|
|
8
|
+
* (only directories modified since the process started are listed, and a
|
|
9
|
+
* known lock is re-validated with one stat on later refreshes)
|
|
10
|
+
* 4. Reading events.jsonl as the primary session/conversation source (incrementally
|
|
11
|
+
* cached across refreshes, so unchanged files are not re-read)
|
|
9
12
|
* 5. Reading workspace.yaml as a flat fallback metadata source
|
|
10
13
|
*/ import * as path from "path";
|
|
11
|
-
import {
|
|
14
|
+
import { findWrapperProcess, findWrapperProcessPids } from "../../utils/process.js";
|
|
12
15
|
import { AgentRegistry } from "../../utils/AgentRegistry.js";
|
|
13
16
|
import { CopilotAgentMapper } from "./CopilotAgentMapper.js";
|
|
14
17
|
import { CopilotSessionLocator } from "./CopilotSessionLocator.js";
|
|
15
18
|
import { CopilotSessionParser } from "./CopilotSessionParser.js";
|
|
19
|
+
import { findHarnessProcesses, homeDir, matchesExecutable } from "../shared.js";
|
|
16
20
|
export class CopilotAdapter {
|
|
17
21
|
type = "copilot";
|
|
18
22
|
processNames = [
|
|
@@ -23,21 +27,26 @@ export class CopilotAdapter {
|
|
|
23
27
|
mapper;
|
|
24
28
|
locator;
|
|
25
29
|
constructor(registry = AgentRegistry.default(), options = {}){
|
|
26
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
27
30
|
this.registry = registry;
|
|
28
31
|
this.parser = new CopilotSessionParser();
|
|
29
32
|
this.mapper = new CopilotAgentMapper(this.parser);
|
|
30
33
|
this.locator = new CopilotSessionLocator({
|
|
31
|
-
sessionStateDir: options.sessionStateDir ?? path.join(homeDir, ".copilot", "session-state")
|
|
34
|
+
sessionStateDir: options.sessionStateDir ?? path.join(homeDir(), ".copilot", "session-state")
|
|
32
35
|
});
|
|
33
36
|
}
|
|
34
37
|
canHandle(processInfo) {
|
|
35
|
-
return
|
|
38
|
+
return matchesExecutable(processInfo.command, "copilot");
|
|
36
39
|
}
|
|
37
40
|
async detectAgents(context) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
try {
|
|
42
|
+
return await this.detectRunningAgents(context);
|
|
43
|
+
} finally{
|
|
44
|
+
// Drop cached event summaries for sessions that were not part of this refresh
|
|
45
|
+
this.parser.pruneSessionCache();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async detectRunningAgents(context) {
|
|
49
|
+
const { processes } = await findHarnessProcesses(this, context);
|
|
41
50
|
if (processes.length === 0) return [];
|
|
42
51
|
const processByPid = new Map(processes.map((proc)=>[
|
|
43
52
|
proc.pid,
|
|
@@ -50,10 +59,10 @@ export class CopilotAdapter {
|
|
|
50
59
|
const matchedPids = new Set();
|
|
51
60
|
const matchedProcesses = [];
|
|
52
61
|
const agents = [];
|
|
53
|
-
for (const lock of this.locator.discoverActiveLocks()){
|
|
62
|
+
for (const lock of this.locator.discoverActiveLocks(processes)){
|
|
54
63
|
const proc = processByPid.get(lock.pid);
|
|
55
64
|
if (!proc) continue;
|
|
56
|
-
const session = this.parser.
|
|
65
|
+
const session = this.parser.readSessionDirIncremental(lock.sessionDir, lock.sessionId);
|
|
57
66
|
if (!session) continue;
|
|
58
67
|
const agent = this.mapper.mapSessionToAgent(session, proc);
|
|
59
68
|
this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);
|
|
@@ -114,10 +123,6 @@ export class CopilotAdapter {
|
|
|
114
123
|
agent.name = wrapperEntry.name;
|
|
115
124
|
}
|
|
116
125
|
}
|
|
117
|
-
isCopilotExecutable(command) {
|
|
118
|
-
const base = executableBasename(command);
|
|
119
|
-
return base === "copilot" || base === "copilot.exe";
|
|
120
|
-
}
|
|
121
126
|
}
|
|
122
127
|
|
|
123
128
|
//# sourceMappingURL=CopilotAdapter.js.map
|