@ai-devkit/agent-manager 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/claude.test.js +485 -0
- package/dist/__tests__/capacity/claude.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +670 -0
- package/dist/__tests__/capacity/openai.test.js.map +1 -0
- package/dist/__tests__/capacity/wham.test.js +144 -0
- package/dist/__tests__/capacity/wham.test.js.map +1 -0
- 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__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
- 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__/harnesses/kiro/KiroAdapter.test.js +662 -0
- 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 +72 -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/claude.d.ts +17 -0
- package/dist/capacity/claude.d.ts.map +1 -0
- package/dist/capacity/claude.js +271 -0
- package/dist/capacity/claude.js.map +1 -0
- package/dist/capacity/codex.d.ts +1 -2
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +5 -47
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +17 -0
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/openai.d.ts +47 -0
- package/dist/capacity/openai.d.ts.map +1 -0
- package/dist/capacity/openai.js +307 -0
- package/dist/capacity/openai.js.map +1 -0
- package/dist/capacity/wham.d.ts +16 -0
- package/dist/capacity/wham.d.ts.map +1 -0
- package/dist/capacity/wham.js +66 -0
- package/dist/capacity/wham.js.map +1 -0
- 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 +28 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +1 -1
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +3 -1
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.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 +61 -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/claude.test.ts +467 -0
- package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
- package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
- package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
- package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
- package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
- package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
- package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
- package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
- package/src/__tests__/capacity/openai.test.ts +560 -0
- package/src/__tests__/capacity/wham.test.ts +104 -0
- 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__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
- 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__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- 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 +83 -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 -12
- package/src/capacity/claude.ts +313 -0
- package/src/capacity/codex.ts +25 -134
- package/src/capacity/index.ts +33 -4
- package/src/capacity/openai.ts +355 -0
- package/src/capacity/wham.ts +84 -0
- 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 +34 -23
- package/src/readiness/AgentReadiness.ts +4 -1
- package/src/runtime/ManagedAgentRuntime.ts +2 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +62 -20
- 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/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.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/index.d.ts +0 -10
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -10
- 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/index.ts +0 -15
- 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,7 +1,14 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
|
-
import type { ConversationMessage } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
|
|
4
4
|
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
5
|
+
import {
|
|
6
|
+
IncrementalJsonlSummary,
|
|
7
|
+
reduceJsonlContent,
|
|
8
|
+
type JsonlSummaryBounds,
|
|
9
|
+
type JsonlSummaryReducer,
|
|
10
|
+
} from "../../utils/IncrementalJsonlSummary.js";
|
|
11
|
+
import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
|
|
5
12
|
|
|
6
13
|
/**
|
|
7
14
|
* Content block within a Claude Code JSONL message entry.
|
|
@@ -51,6 +58,23 @@ export interface ClaudeSession {
|
|
|
51
58
|
firstUserMessage?: string;
|
|
52
59
|
}
|
|
53
60
|
|
|
61
|
+
/**
|
|
62
|
+
* O(1) running summary folded from session entries; `toSession` turns it into
|
|
63
|
+
* a `ClaudeSession`. Timestamps are epoch ms so cached state stays immutable.
|
|
64
|
+
*/
|
|
65
|
+
interface ClaudeSummaryState {
|
|
66
|
+
seenFirstLine: boolean;
|
|
67
|
+
/** A bounded cold start skipped the middle: later lines are not the session's first. */
|
|
68
|
+
pastHead?: boolean;
|
|
69
|
+
sessionStartMs?: number;
|
|
70
|
+
lastActiveMs?: number;
|
|
71
|
+
lastCwd?: string;
|
|
72
|
+
lastEntryType?: string;
|
|
73
|
+
isInterrupted: boolean;
|
|
74
|
+
lastUserMessage?: string;
|
|
75
|
+
firstUserMessage?: string;
|
|
76
|
+
}
|
|
77
|
+
|
|
54
78
|
/**
|
|
55
79
|
* Top-level JSONL entry types that represent conversation/agent state.
|
|
56
80
|
*
|
|
@@ -63,6 +87,11 @@ export interface ClaudeSession {
|
|
|
63
87
|
*/
|
|
64
88
|
const CONVERSATION_ENTRY_TYPES = new Set(["user", "assistant", "system", "progress", "thinking"]);
|
|
65
89
|
|
|
90
|
+
export interface ClaudeSessionParserOptions {
|
|
91
|
+
/** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */
|
|
92
|
+
summaryBounds?: JsonlSummaryBounds | false;
|
|
93
|
+
}
|
|
94
|
+
|
|
66
95
|
/**
|
|
67
96
|
* Parses Claude Code session JSONL files into structured data.
|
|
68
97
|
*
|
|
@@ -71,6 +100,17 @@ const CONVERSATION_ENTRY_TYPES = new Set(["user", "assistant", "system", "progre
|
|
|
71
100
|
* event (user turn, assistant response, tool call, etc.).
|
|
72
101
|
*/
|
|
73
102
|
export class ClaudeSessionParser {
|
|
103
|
+
/** Incremental reader backing `getConversation({ tail })`. */
|
|
104
|
+
private readonly tailReader = new JsonlTailReader();
|
|
105
|
+
|
|
106
|
+
private readonly sessionCache: IncrementalJsonlSummary<ClaudeSummaryState>;
|
|
107
|
+
|
|
108
|
+
constructor(options: ClaudeSessionParserOptions = {}) {
|
|
109
|
+
this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {
|
|
110
|
+
bounds: options.summaryBounds,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
74
114
|
/**
|
|
75
115
|
* Parse a session JSONL file into a ClaudeSession summary.
|
|
76
116
|
*
|
|
@@ -81,8 +121,6 @@ export class ClaudeSessionParser {
|
|
|
81
121
|
* Returns null if the file is unreadable or empty.
|
|
82
122
|
*/
|
|
83
123
|
readSession(filePath: string, projectPath: string): ClaudeSession | null {
|
|
84
|
-
const sessionId = path.basename(filePath, ".jsonl");
|
|
85
|
-
|
|
86
124
|
let content: string;
|
|
87
125
|
try {
|
|
88
126
|
content = fs.readFileSync(filePath, "utf-8");
|
|
@@ -90,74 +128,113 @@ export class ClaudeSessionParser {
|
|
|
90
128
|
return null;
|
|
91
129
|
}
|
|
92
130
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
131
|
+
return this.toSession(filePath, projectPath, reduceJsonlContent(this.summaryReducer, content));
|
|
132
|
+
}
|
|
97
133
|
|
|
98
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Same result as `readSession`, but backed by a per-instance incremental
|
|
136
|
+
* cache so repeated refreshes only parse bytes appended since the last call.
|
|
137
|
+
* Call `pruneSessionCache()` once per refresh to evict files no longer read.
|
|
138
|
+
*
|
|
139
|
+
* The first read of a large transcript is a bounded head + tail scan (see
|
|
140
|
+
* `summaryReducer.skip`); fields whose entries lie only in the skipped
|
|
141
|
+
* middle fall back to their defaults instead of forcing a full parse.
|
|
142
|
+
*/
|
|
143
|
+
readSessionIncremental(filePath: string, projectPath: string): ClaudeSession | null {
|
|
144
|
+
const result = this.sessionCache.read(filePath);
|
|
145
|
+
return result ? this.toSession(filePath, projectPath, result.state) : null;
|
|
146
|
+
}
|
|
99
147
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
let lastUserMessage: string | undefined;
|
|
105
|
-
let firstUserMessage: string | undefined;
|
|
148
|
+
/** Evict cached summaries for files not read since the previous prune. */
|
|
149
|
+
pruneSessionCache(): void {
|
|
150
|
+
this.sessionCache.prune();
|
|
151
|
+
}
|
|
106
152
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
153
|
+
/**
|
|
154
|
+
* Fold one JSONL entry into the O(1) session summary. Mirrors the fields
|
|
155
|
+
* `readSession` exposes: session start comes from the first line only;
|
|
156
|
+
* everything else tracks the latest matching entry.
|
|
157
|
+
*
|
|
158
|
+
* `skip` (bounded cold start) keeps the head's session start and first user
|
|
159
|
+
* message and clears every "latest" field, so those come from the tail only:
|
|
160
|
+
* a first user message beyond the head stays undefined, and a last user
|
|
161
|
+
* message before the tail window stays undefined.
|
|
162
|
+
*/
|
|
163
|
+
private readonly summaryReducer: JsonlSummaryReducer<ClaudeSummaryState> = {
|
|
164
|
+
initial: () => ({ seenFirstLine: false, isInterrupted: false }),
|
|
165
|
+
reduce: (state, value) => {
|
|
166
|
+
const next: ClaudeSummaryState = { ...state, seenFirstLine: true };
|
|
167
|
+
if (!state.seenFirstLine) {
|
|
168
|
+
next.sessionStartMs = this.parseSessionStart(value);
|
|
169
|
+
}
|
|
170
|
+
if (!value || typeof value !== "object") {
|
|
171
|
+
return next;
|
|
172
|
+
}
|
|
110
173
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
174
|
+
const entry = value as SessionEntry;
|
|
175
|
+
if (entry.timestamp) {
|
|
176
|
+
const ts = new Date(entry.timestamp).getTime();
|
|
177
|
+
if (!Number.isNaN(ts)) {
|
|
178
|
+
next.lastActiveMs = ts;
|
|
116
179
|
}
|
|
180
|
+
}
|
|
117
181
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
182
|
+
if (typeof entry.cwd === "string" && entry.cwd.trim().length > 0) {
|
|
183
|
+
next.lastCwd = entry.cwd;
|
|
184
|
+
}
|
|
121
185
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
186
|
+
if (entry.type && CONVERSATION_ENTRY_TYPES.has(entry.type)) {
|
|
187
|
+
next.lastEntryType = entry.type;
|
|
188
|
+
|
|
189
|
+
if (entry.type === "user") {
|
|
190
|
+
const msgContent = entry.message?.content;
|
|
191
|
+
next.isInterrupted =
|
|
192
|
+
Array.isArray(msgContent) &&
|
|
193
|
+
msgContent.some(
|
|
194
|
+
(c) =>
|
|
195
|
+
(c.type === "text" && c.text?.includes("[Request interrupted")) ||
|
|
196
|
+
(c.type === "tool_result" && c.content?.includes("[Request interrupted")),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
const text = this.extractUserMessageText(msgContent);
|
|
200
|
+
if (text) {
|
|
201
|
+
next.lastUserMessage = text;
|
|
202
|
+
if (!next.firstUserMessage && !state.pastHead) {
|
|
203
|
+
next.firstUserMessage = text;
|
|
141
204
|
}
|
|
142
|
-
} else {
|
|
143
|
-
isInterrupted = false;
|
|
144
205
|
}
|
|
206
|
+
} else {
|
|
207
|
+
next.isInterrupted = false;
|
|
145
208
|
}
|
|
146
|
-
} catch {
|
|
147
|
-
continue;
|
|
148
209
|
}
|
|
149
|
-
}
|
|
150
210
|
|
|
211
|
+
return next;
|
|
212
|
+
},
|
|
213
|
+
skip: (state) => ({
|
|
214
|
+
seenFirstLine: true,
|
|
215
|
+
pastHead: true,
|
|
216
|
+
sessionStartMs: state.sessionStartMs,
|
|
217
|
+
firstUserMessage: state.firstUserMessage,
|
|
218
|
+
isInterrupted: false,
|
|
219
|
+
}),
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
private toSession(
|
|
223
|
+
filePath: string,
|
|
224
|
+
projectPath: string,
|
|
225
|
+
state: ClaudeSummaryState,
|
|
226
|
+
): ClaudeSession {
|
|
227
|
+
const sessionStartMs = state.sessionStartMs ?? state.lastActiveMs;
|
|
151
228
|
return {
|
|
152
|
-
sessionId,
|
|
153
|
-
projectPath: projectPath || lastCwd || "",
|
|
154
|
-
lastCwd,
|
|
155
|
-
sessionStart:
|
|
156
|
-
lastActive:
|
|
157
|
-
lastEntryType,
|
|
158
|
-
isInterrupted,
|
|
159
|
-
lastUserMessage,
|
|
160
|
-
firstUserMessage,
|
|
229
|
+
sessionId: path.basename(filePath, ".jsonl"),
|
|
230
|
+
projectPath: projectPath || state.lastCwd || "",
|
|
231
|
+
lastCwd: state.lastCwd,
|
|
232
|
+
sessionStart: sessionStartMs !== undefined ? new Date(sessionStartMs) : new Date(),
|
|
233
|
+
lastActive: state.lastActiveMs !== undefined ? new Date(state.lastActiveMs) : new Date(),
|
|
234
|
+
lastEntryType: state.lastEntryType,
|
|
235
|
+
isInterrupted: state.isInterrupted,
|
|
236
|
+
lastUserMessage: state.lastUserMessage,
|
|
237
|
+
firstUserMessage: state.firstUserMessage,
|
|
161
238
|
};
|
|
162
239
|
}
|
|
163
240
|
|
|
@@ -199,10 +276,20 @@ export class ClaudeSessionParser {
|
|
|
199
276
|
* Read the full conversation from a session JSONL file.
|
|
200
277
|
*
|
|
201
278
|
* Default mode returns only text content from user/assistant/system messages.
|
|
202
|
-
* Verbose mode also includes tool_use and tool_result blocks.
|
|
279
|
+
* Verbose mode also includes tool_use and tool_result blocks. With `tail`,
|
|
280
|
+
* only the last N messages are read (from the end of the file).
|
|
203
281
|
*/
|
|
204
|
-
getConversation(sessionFilePath: string, options?:
|
|
282
|
+
getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {
|
|
205
283
|
const verbose = options?.verbose ?? false;
|
|
284
|
+
const tail = normalizeTail(options?.tail);
|
|
285
|
+
if (tail !== undefined) {
|
|
286
|
+
return this.tailReader.read(
|
|
287
|
+
sessionFilePath,
|
|
288
|
+
tail,
|
|
289
|
+
{ parseLine: (line) => this.lineToMessage(line, verbose) },
|
|
290
|
+
String(verbose),
|
|
291
|
+
);
|
|
292
|
+
}
|
|
206
293
|
|
|
207
294
|
let content: string;
|
|
208
295
|
try {
|
|
@@ -215,58 +302,63 @@ export class ClaudeSessionParser {
|
|
|
215
302
|
const messages: ConversationMessage[] = [];
|
|
216
303
|
|
|
217
304
|
for (const line of lines) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
} catch {
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
305
|
+
const message = this.lineToMessage(line, verbose);
|
|
306
|
+
if (message) messages.push(message);
|
|
307
|
+
}
|
|
224
308
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
role = "user";
|
|
228
|
-
} else if (entry.type === "assistant") {
|
|
229
|
-
role = "assistant";
|
|
230
|
-
} else if (entry.type === "system") {
|
|
231
|
-
role = "system";
|
|
232
|
-
} else {
|
|
233
|
-
continue;
|
|
234
|
-
}
|
|
309
|
+
return messages;
|
|
310
|
+
}
|
|
235
311
|
|
|
236
|
-
|
|
237
|
-
|
|
312
|
+
/** Convert one JSONL line into a conversation message, or null when it is not one. */
|
|
313
|
+
private lineToMessage(line: string, verbose: boolean): ConversationMessage | null {
|
|
314
|
+
let entry: SessionEntry;
|
|
315
|
+
try {
|
|
316
|
+
entry = JSON.parse(line);
|
|
317
|
+
} catch {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
238
320
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
321
|
+
let role: ConversationMessage["role"];
|
|
322
|
+
if (entry.type === "user") {
|
|
323
|
+
role = "user";
|
|
324
|
+
} else if (entry.type === "assistant") {
|
|
325
|
+
role = "assistant";
|
|
326
|
+
} else if (entry.type === "system") {
|
|
327
|
+
role = "system";
|
|
328
|
+
} else {
|
|
329
|
+
return null;
|
|
244
330
|
}
|
|
245
331
|
|
|
246
|
-
|
|
332
|
+
const text = this.extractConversationContent(entry.message?.content, role, verbose);
|
|
333
|
+
if (!text) return null;
|
|
334
|
+
|
|
335
|
+
return {
|
|
336
|
+
role,
|
|
337
|
+
content: text,
|
|
338
|
+
timestamp: entry.timestamp,
|
|
339
|
+
};
|
|
247
340
|
}
|
|
248
341
|
|
|
249
342
|
/**
|
|
250
|
-
* Parse session start time from the first JSONL
|
|
343
|
+
* Parse session start time (epoch ms) from the first JSONL entry.
|
|
251
344
|
*
|
|
252
345
|
* Claude Code may emit a "file-history-snapshot" as the first entry,
|
|
253
346
|
* which stores its timestamp inside "snapshot.timestamp" rather than
|
|
254
347
|
* at the root level.
|
|
255
348
|
*/
|
|
256
|
-
private parseSessionStart(
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
349
|
+
private parseSessionStart(firstEntry: unknown): number | undefined {
|
|
350
|
+
if (!firstEntry || typeof firstEntry !== "object") {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
const entry = firstEntry as { timestamp?: string; snapshot?: { timestamp?: string } };
|
|
354
|
+
const rawTs = entry.timestamp || entry.snapshot?.timestamp;
|
|
355
|
+
if (rawTs) {
|
|
356
|
+
const ts = new Date(rawTs).getTime();
|
|
357
|
+
if (!Number.isNaN(ts)) {
|
|
358
|
+
return ts;
|
|
265
359
|
}
|
|
266
|
-
} catch {
|
|
267
|
-
/* malformed first line */
|
|
268
360
|
}
|
|
269
|
-
return
|
|
361
|
+
return undefined;
|
|
270
362
|
}
|
|
271
363
|
|
|
272
364
|
/**
|
|
@@ -5,21 +5,143 @@ import type {
|
|
|
5
5
|
AgentInfo,
|
|
6
6
|
ProcessInfo,
|
|
7
7
|
ConversationMessage,
|
|
8
|
+
ConversationOptions,
|
|
8
9
|
SessionSummary,
|
|
9
10
|
ListSessionsOptions,
|
|
10
11
|
AgentDetectionContext,
|
|
11
12
|
} from "../../adapters/AgentAdapter.js";
|
|
12
|
-
import {
|
|
13
|
-
captureProcessSnapshot,
|
|
14
|
-
executableBasename,
|
|
15
|
-
filterByProcessNames,
|
|
16
|
-
} from "../../utils/process.js";
|
|
17
|
-
import { safeReadFile } from "../../utils/session.js";
|
|
13
|
+
import { executablePath } from "../../utils/process.js";
|
|
18
14
|
import { AgentRegistry } from "../../utils/AgentRegistry.js";
|
|
19
15
|
import { CodexAgentMapper } from "./CodexAgentMapper.js";
|
|
20
16
|
import { CodexSessionLocator, type CodexDirectMatch } from "./CodexSessionLocator.js";
|
|
21
17
|
import { CodexSessionMapping } from "./CodexSessionMapping.js";
|
|
22
18
|
import { CodexSessionParser } from "./CodexSessionParser.js";
|
|
19
|
+
import { findHarnessProcesses, homeDir, matchesExecutable } from "../shared.js";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Codex subcommands that never own a local agent session: long-running helpers
|
|
23
|
+
* (app-server, sandbox, MCP/exec servers) and short-lived management commands.
|
|
24
|
+
* Interactive `codex`, `resume`, `fork`, `exec` and `review` remain detected.
|
|
25
|
+
*
|
|
26
|
+
* Classification of `review`, `cloud` and `agents` checked against Codex CLI
|
|
27
|
+
* 0.157.1 (source tag rust-v0.157.1, codex-rs/cli/src/main.rs):
|
|
28
|
+
* - `review` is detected: it runs as `codex exec review`, starting a
|
|
29
|
+
* non-ephemeral thread in-process (source `exec`, originator `codex_exec`), so
|
|
30
|
+
* it writes a `session_meta` rollout under ~/.codex/sessions like `codex exec`.
|
|
31
|
+
* - `cloud` is excluded: it browses and applies Codex Cloud tasks over HTTP and
|
|
32
|
+
* never starts a local thread or rollout.
|
|
33
|
+
* - `agents` is excluded: it opens a dashboard over every session on the shared
|
|
34
|
+
* app-server daemon without starting a thread of its own; the daemon, not
|
|
35
|
+
* this process, owns and writes those sessions' rollouts.
|
|
36
|
+
*/
|
|
37
|
+
const CODEX_HELPER_SUBCOMMANDS = new Set([
|
|
38
|
+
"agents",
|
|
39
|
+
"app",
|
|
40
|
+
"app-server",
|
|
41
|
+
"apply",
|
|
42
|
+
"a",
|
|
43
|
+
"archive",
|
|
44
|
+
"cloud",
|
|
45
|
+
"cloud-tasks",
|
|
46
|
+
"completion",
|
|
47
|
+
"debug",
|
|
48
|
+
"delete",
|
|
49
|
+
"doctor",
|
|
50
|
+
"exec-server",
|
|
51
|
+
"features",
|
|
52
|
+
"help",
|
|
53
|
+
"login",
|
|
54
|
+
"logout",
|
|
55
|
+
"mcp",
|
|
56
|
+
"mcp-server",
|
|
57
|
+
"migrate-rollouts",
|
|
58
|
+
"plugin",
|
|
59
|
+
"queue",
|
|
60
|
+
"remote-control",
|
|
61
|
+
"responses-api-proxy",
|
|
62
|
+
"sandbox",
|
|
63
|
+
"stdio-to-uds",
|
|
64
|
+
"unarchive",
|
|
65
|
+
"update",
|
|
66
|
+
]);
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Known root Codex subcommand names and aliases, including the hidden ones in
|
|
70
|
+
* Codex CLI 0.157.1. A variadic flag's values stop at these, as clap stops there.
|
|
71
|
+
*/
|
|
72
|
+
const CODEX_SUBCOMMANDS = new Set([
|
|
73
|
+
...CODEX_HELPER_SUBCOMMANDS,
|
|
74
|
+
"e",
|
|
75
|
+
"exec",
|
|
76
|
+
"execpolicy",
|
|
77
|
+
"fork",
|
|
78
|
+
"resume",
|
|
79
|
+
"review",
|
|
80
|
+
"tcp-tunnel",
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
/** Global Codex flags that consume the following argument as their value. */
|
|
84
|
+
const CODEX_VALUE_FLAGS = new Set([
|
|
85
|
+
"-c",
|
|
86
|
+
"--config",
|
|
87
|
+
"-m",
|
|
88
|
+
"--model",
|
|
89
|
+
"-p",
|
|
90
|
+
"--profile",
|
|
91
|
+
"-s",
|
|
92
|
+
"--sandbox",
|
|
93
|
+
"-a",
|
|
94
|
+
"--ask-for-approval",
|
|
95
|
+
"-C",
|
|
96
|
+
"--cd",
|
|
97
|
+
"--add-dir",
|
|
98
|
+
"--enable",
|
|
99
|
+
"--disable",
|
|
100
|
+
"--local-provider",
|
|
101
|
+
"--remote",
|
|
102
|
+
"--remote-auth-token-env",
|
|
103
|
+
]);
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Global Codex flags that take one or more values (clap `num_args = 1..`).
|
|
107
|
+
* `-i, --image <FILE>...` is the only one in Codex CLI 0.157.1.
|
|
108
|
+
*/
|
|
109
|
+
const CODEX_VARIADIC_VALUE_FLAGS = new Set(["-i", "--image"]);
|
|
110
|
+
|
|
111
|
+
const CODEX_APP_SERVER_DAEMON_DIR = "app-server-daemon";
|
|
112
|
+
|
|
113
|
+
function isCodexHelperCommand(command: string): boolean {
|
|
114
|
+
const trimmed = command.trim();
|
|
115
|
+
// Resolve argv[0] first so an install path containing spaces is not read as arguments.
|
|
116
|
+
const executable = executablePath(trimmed);
|
|
117
|
+
const args = trimmed.slice(executable.length).trim().split(/\s+/).filter(Boolean);
|
|
118
|
+
if (executable.replace(/\\/g, "/").split("/").includes(CODEX_APP_SERVER_DAEMON_DIR)) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const subcommand = firstPositionalArgument(args);
|
|
123
|
+
return subcommand !== undefined && CODEX_HELPER_SUBCOMMANDS.has(subcommand);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function firstPositionalArgument(args: string[]): string | undefined {
|
|
127
|
+
for (let index = 0; index < args.length; index++) {
|
|
128
|
+
const arg = args[index];
|
|
129
|
+
if (arg === "--") return undefined;
|
|
130
|
+
if (!arg.startsWith("-")) return arg;
|
|
131
|
+
if (arg.includes("=")) continue;
|
|
132
|
+
if (CODEX_VALUE_FLAGS.has(arg)) {
|
|
133
|
+
index++;
|
|
134
|
+
} else if (CODEX_VARIADIC_VALUE_FLAGS.has(arg)) {
|
|
135
|
+
// Like clap, take values until the next flag or subcommand name.
|
|
136
|
+
while (index + 1 < args.length && isVariadicFlagValue(args[index + 1])) index++;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function isVariadicFlagValue(arg: string): boolean {
|
|
143
|
+
return !arg.startsWith("-") && !CODEX_SUBCOMMANDS.has(arg);
|
|
144
|
+
}
|
|
23
145
|
|
|
24
146
|
interface MappedAgentResult {
|
|
25
147
|
agents: AgentInfo[];
|
|
@@ -35,22 +157,32 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
35
157
|
private readonly mapper: CodexAgentMapper;
|
|
36
158
|
private readonly codexSessionsDir: string;
|
|
37
159
|
private readonly sessionMappingPath: string;
|
|
160
|
+
private locator?: CodexSessionLocator;
|
|
38
161
|
|
|
39
162
|
constructor(registry: AgentRegistry = AgentRegistry.default()) {
|
|
40
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
41
163
|
this.registry = registry;
|
|
42
164
|
this.parser = new CodexSessionParser();
|
|
43
165
|
this.mapper = new CodexAgentMapper(this.parser);
|
|
44
|
-
this.codexSessionsDir = path.join(homeDir, ".codex", "sessions");
|
|
45
|
-
this.sessionMappingPath = path.join(homeDir, ".codex", "ai-devkit", "sessions.json");
|
|
166
|
+
this.codexSessionsDir = path.join(homeDir(), ".codex", "sessions");
|
|
167
|
+
this.sessionMappingPath = path.join(homeDir(), ".codex", "ai-devkit", "sessions.json");
|
|
46
168
|
}
|
|
47
169
|
|
|
48
170
|
canHandle(processInfo: ProcessInfo): boolean {
|
|
49
|
-
|
|
50
|
-
|
|
171
|
+
return (
|
|
172
|
+
matchesExecutable(processInfo.command, "codex") && !isCodexHelperCommand(processInfo.command)
|
|
173
|
+
);
|
|
51
174
|
}
|
|
52
175
|
|
|
53
176
|
async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
|
|
177
|
+
try {
|
|
178
|
+
return await this.detectRunningAgents(context);
|
|
179
|
+
} finally {
|
|
180
|
+
// Drop cached summaries for sessions that were not part of this refresh
|
|
181
|
+
this.parser.pruneSessionCache();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
|
|
54
186
|
const processes = await this.getCodexProcesses(context);
|
|
55
187
|
if (processes.length === 0) return [];
|
|
56
188
|
|
|
@@ -59,10 +191,7 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
59
191
|
const locatorResult = this.createLocator().matchRunningProcesses(cacheResult.fallback);
|
|
60
192
|
|
|
61
193
|
const directResult = this.mapDirectMatches(locatorResult.direct);
|
|
62
|
-
const legacyResult = this.mapLegacyMatches(
|
|
63
|
-
locatorResult.legacyMatches,
|
|
64
|
-
locatorResult.contentCache,
|
|
65
|
-
);
|
|
194
|
+
const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches);
|
|
66
195
|
const unmatchedProcesses = this.findUnmatchedProcesses(locatorResult.fallback, [
|
|
67
196
|
...directResult.agents,
|
|
68
197
|
...legacyResult.agents,
|
|
@@ -78,7 +207,7 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
78
207
|
];
|
|
79
208
|
}
|
|
80
209
|
|
|
81
|
-
getConversation(sessionFilePath: string, options?:
|
|
210
|
+
getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {
|
|
82
211
|
return this.parser.getConversation(sessionFilePath, options);
|
|
83
212
|
}
|
|
84
213
|
|
|
@@ -104,13 +233,13 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
104
233
|
}
|
|
105
234
|
|
|
106
235
|
private async getCodexProcesses(context?: AgentDetectionContext): Promise<ProcessInfo[]> {
|
|
107
|
-
|
|
108
|
-
const relevant = filterByProcessNames(snapshot, this.processNames);
|
|
109
|
-
return relevant.filter((processInfo) => this.canHandle(processInfo));
|
|
236
|
+
return (await findHarnessProcesses(this, context)).processes;
|
|
110
237
|
}
|
|
111
238
|
|
|
239
|
+
/** Reused across refreshes so the locator's session_meta and negative caches persist. */
|
|
112
240
|
private createLocator(): CodexSessionLocator {
|
|
113
|
-
|
|
241
|
+
this.locator ??= new CodexSessionLocator({ sessionsDir: this.codexSessionsDir }, this.parser);
|
|
242
|
+
return this.locator;
|
|
114
243
|
}
|
|
115
244
|
|
|
116
245
|
private createSessionMapping(): CodexSessionMapping {
|
|
@@ -125,7 +254,7 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
125
254
|
const agents: AgentInfo[] = [];
|
|
126
255
|
|
|
127
256
|
for (const match of matches) {
|
|
128
|
-
const session = this.parser.
|
|
257
|
+
const session = this.parser.readSessionIncremental(match.filePath);
|
|
129
258
|
if (session) {
|
|
130
259
|
agents.push(this.mapper.mapSessionToAgent(session, match.process, match.filePath));
|
|
131
260
|
} else {
|
|
@@ -153,8 +282,7 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
153
282
|
continue;
|
|
154
283
|
}
|
|
155
284
|
|
|
156
|
-
const
|
|
157
|
-
const session = this.parser.readSession(entry.sessionFilePath, content);
|
|
285
|
+
const session = this.parser.readSessionIncremental(entry.sessionFilePath);
|
|
158
286
|
if (!session) {
|
|
159
287
|
fallback.push(processInfo);
|
|
160
288
|
continue;
|
|
@@ -171,7 +299,7 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
171
299
|
const fallback: ProcessInfo[] = [];
|
|
172
300
|
|
|
173
301
|
for (const match of matches) {
|
|
174
|
-
const session = this.parser.
|
|
302
|
+
const session = this.parser.readSessionIncremental(match.sessionFile.filePath);
|
|
175
303
|
if (session) {
|
|
176
304
|
agents.push(
|
|
177
305
|
this.mapper.mapSessionToAgent(session, match.process, match.sessionFile.filePath),
|
|
@@ -186,16 +314,12 @@ export class CodexAdapter implements AgentAdapter {
|
|
|
186
314
|
|
|
187
315
|
private mapLegacyMatches(
|
|
188
316
|
matches: Array<{ process: ProcessInfo; session: { filePath: string } }>,
|
|
189
|
-
contentCache: Map<string, string>,
|
|
190
317
|
): MappedAgentResult {
|
|
191
318
|
const agents: AgentInfo[] = [];
|
|
192
319
|
const fallback: ProcessInfo[] = [];
|
|
193
320
|
|
|
194
321
|
for (const match of matches) {
|
|
195
|
-
const session = this.parser.
|
|
196
|
-
match.session.filePath,
|
|
197
|
-
contentCache.get(match.session.filePath),
|
|
198
|
-
);
|
|
322
|
+
const session = this.parser.readSessionIncremental(match.session.filePath);
|
|
199
323
|
if (session) {
|
|
200
324
|
agents.push(this.mapper.mapSessionToAgent(session, match.process, match.session.filePath));
|
|
201
325
|
} else {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
-
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
2
|
import { generateAgentName } from "../../utils/matching.js";
|
|
4
3
|
import type { CodexSessionParser, CodexSession } from "./CodexSessionParser.js";
|
|
4
|
+
import { processOnlyAgent } from "../shared.js";
|
|
5
5
|
|
|
6
6
|
export class CodexAgentMapper {
|
|
7
7
|
constructor(private readonly parser: CodexSessionParser) {}
|
|
@@ -21,15 +21,6 @@ export class CodexAgentMapper {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {
|
|
24
|
-
return {
|
|
25
|
-
name: generateAgentName(processInfo.cwd || "", processInfo.pid),
|
|
26
|
-
type: "codex",
|
|
27
|
-
status: AgentStatus.RUNNING,
|
|
28
|
-
summary: "Codex process running",
|
|
29
|
-
pid: processInfo.pid,
|
|
30
|
-
projectPath: processInfo.cwd || "",
|
|
31
|
-
sessionId: `pid-${processInfo.pid}`,
|
|
32
|
-
lastActive: new Date(),
|
|
33
|
-
};
|
|
24
|
+
return processOnlyAgent("codex", processInfo, { summary: "Codex process running" });
|
|
34
25
|
}
|
|
35
26
|
}
|