@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/copilot/CopilotAdapter.ts"],"sourcesContent":["/**\n * Copilot Adapter\n *\n * Detects running GitHub Copilot CLI agents by:\n * 1. Filtering Copilot processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes\n * (only directories modified since the process started are listed, and a\n * known lock is re-validated with one stat on later refreshes)\n * 4. Reading events.jsonl as the primary session/conversation source (incrementally\n * cached across refreshes, so unchanged files are not re-read)\n * 5. Reading workspace.yaml as a flat fallback metadata source\n */\n\nimport * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ConversationMessage,\n ConversationOptions,\n ListSessionsOptions,\n ProcessInfo,\n SessionSummary,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport { findWrapperProcess, findWrapperProcessPids } from \"../../utils/process.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../../utils/AgentRegistry.js\";\nimport { CopilotAgentMapper } from \"./CopilotAgentMapper.js\";\nimport { CopilotSessionLocator } from \"./CopilotSessionLocator.js\";\nimport { CopilotSessionParser, type CopilotSession } from \"./CopilotSessionParser.js\";\nimport { findHarnessProcesses, homeDir, matchesExecutable } from \"../shared.js\";\n\nexport interface CopilotAdapterOptions {\n sessionStateDir?: string;\n}\n\nexport class CopilotAdapter implements AgentAdapter {\n readonly type = \"copilot\" as const;\n readonly processNames = [\"copilot\"] as const;\n\n private readonly registry: AgentRegistry;\n private readonly parser: CopilotSessionParser;\n private readonly mapper: CopilotAgentMapper;\n private readonly locator: CopilotSessionLocator;\n\n constructor(\n registry: AgentRegistry = AgentRegistry.default(),\n options: CopilotAdapterOptions = {},\n ) {\n this.registry = registry;\n this.parser = new CopilotSessionParser();\n this.mapper = new CopilotAgentMapper(this.parser);\n this.locator = new CopilotSessionLocator({\n sessionStateDir: options.sessionStateDir ?? path.join(homeDir(), \".copilot\", \"session-state\"),\n });\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return matchesExecutable(processInfo.command, \"copilot\");\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached event summaries for sessions that were not part of this refresh\n this.parser.pruneSessionCache();\n }\n }\n\n private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const { processes } = await findHarnessProcesses(this, context);\n if (processes.length === 0) return [];\n\n const processByPid = new Map(processes.map((proc) => [proc.pid, proc]));\n const registryEntriesByPid = new Map(this.registry.list().map((entry) => [entry.pid, entry]));\n const matchedPids = new Set<number>();\n const matchedProcesses: ProcessInfo[] = [];\n const agents: AgentInfo[] = [];\n\n for (const lock of this.locator.discoverActiveLocks(processes)) {\n const proc = processByPid.get(lock.pid);\n if (!proc) continue;\n\n const session = this.parser.readSessionDirIncremental(lock.sessionDir, lock.sessionId);\n if (!session) continue;\n\n const agent = this.mapper.mapSessionToAgent(session, proc);\n this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);\n agents.push(agent);\n matchedPids.add(proc.pid);\n matchedProcesses.push(proc);\n }\n\n const wrapperPids = findWrapperProcessPids(processes, matchedProcesses);\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid) && !wrapperPids.has(proc.pid)) {\n const agent = this.mapper.mapProcessOnlyAgent(proc);\n this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);\n agents.push(agent);\n }\n }\n\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n\n for (const { sessionDir, sessionId } of this.locator.listSessionDirs()) {\n const session = this.parser.readSessionDir(sessionDir, sessionId);\n if (!session) continue;\n if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const match = this.locator.findSessionDirById(sessionId);\n if (match) {\n const session = this.parser.readSessionDir(match.sessionDir, match.sessionId);\n if (session?.sessionId === sessionId) {\n return [this.toSessionSummary(session)];\n }\n }\n\n return (await this.listSessions()).filter((session) => session.sessionId === sessionId);\n }\n\n private toSessionSummary(session: CopilotSession): SessionSummary {\n return {\n type: this.type,\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: session.firstUserMessage,\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: session.eventsFilePath,\n };\n }\n\n private applyWrapperRegistryName(\n agent: AgentInfo,\n processInfo: ProcessInfo,\n processes: ProcessInfo[],\n registryEntriesByPid: Map<number, RegistryEntry>,\n ): void {\n const wrapper = findWrapperProcess(processes, processInfo);\n const wrapperEntry = wrapper ? registryEntriesByPid.get(wrapper.pid) : undefined;\n if (wrapperEntry?.type === this.type) {\n agent.name = wrapperEntry.name;\n }\n }\n}\n"],"names":["path","findWrapperProcess","findWrapperProcessPids","AgentRegistry","CopilotAgentMapper","CopilotSessionLocator","CopilotSessionParser","findHarnessProcesses","homeDir","matchesExecutable","CopilotAdapter","type","processNames","registry","parser","mapper","locator","default","options","sessionStateDir","join","canHandle","processInfo","command","detectAgents","context","detectRunningAgents","pruneSessionCache","processes","length","processByPid","Map","map","proc","pid","registryEntriesByPid","list","entry","matchedPids","Set","matchedProcesses","agents","lock","discoverActiveLocks","get","session","readSessionDirIncremental","sessionDir","sessionId","agent","mapSessionToAgent","applyWrapperRegistryName","push","add","wrapperPids","has","mapProcessOnlyAgent","getConversation","sessionFilePath","listSessions","opts","summaries","listSessionDirs","readSessionDir","cwd","undefined","projectPath","toSessionSummary","findSessionsById","match","findSessionDirById","filter","firstUserMessage","lastActive","startedAt","sessionStart","eventsFilePath","wrapper","wrapperEntry","name"],"mappings":"AAAA;;;;;;;;;;;;CAYC,GAED,YAAYA,UAAU,OAAO;AAW7B,SAASC,kBAAkB,EAAEC,sBAAsB,QAAQ,yBAAyB;AACpF,SAASC,aAAa,QAA4B,+BAA+B;AACjF,SAASC,kBAAkB,QAAQ,0BAA0B;AAC7D,SAASC,qBAAqB,QAAQ,6BAA6B;AACnE,SAASC,oBAAoB,QAA6B,4BAA4B;AACtF,SAASC,oBAAoB,EAAEC,OAAO,EAAEC,iBAAiB,QAAQ,eAAe;AAMhF,OAAO,MAAMC;IACFC,OAAO,UAAmB;IAC1BC,eAAe;QAAC;KAAU,CAAU;IAE5BC,SAAwB;IACxBC,OAA6B;IAC7BC,OAA2B;IAC3BC,QAA+B;IAEhD,YACEH,WAA0BV,cAAcc,OAAO,EAAE,EACjDC,UAAiC,CAAC,CAAC,CACnC;QACA,IAAI,CAACL,QAAQ,GAAGA;QAChB,IAAI,CAACC,MAAM,GAAG,IAAIR;QAClB,IAAI,CAACS,MAAM,GAAG,IAAIX,mBAAmB,IAAI,CAACU,MAAM;QAChD,IAAI,CAACE,OAAO,GAAG,IAAIX,sBAAsB;YACvCc,iBAAiBD,QAAQC,eAAe,IAAInB,KAAKoB,IAAI,CAACZ,WAAW,YAAY;QAC/E;IACF;IAEAa,UAAUC,WAAwB,EAAW;QAC3C,OAAOb,kBAAkBa,YAAYC,OAAO,EAAE;IAChD;IAEA,MAAMC,aAAaC,OAA+B,EAAwB;QACxE,IAAI;YACF,OAAO,MAAM,IAAI,CAACC,mBAAmB,CAACD;QACxC,SAAU;YACR,8EAA8E;YAC9E,IAAI,CAACX,MAAM,CAACa,iBAAiB;QAC/B;IACF;IAEA,MAAcD,oBAAoBD,OAA+B,EAAwB;QACvF,MAAM,EAAEG,SAAS,EAAE,GAAG,MAAMrB,qBAAqB,IAAI,EAAEkB;QACvD,IAAIG,UAAUC,MAAM,KAAK,GAAG,OAAO,EAAE;QAErC,MAAMC,eAAe,IAAIC,IAAIH,UAAUI,GAAG,CAAC,CAACC,OAAS;gBAACA,KAAKC,GAAG;gBAAED;aAAK;QACrE,MAAME,uBAAuB,IAAIJ,IAAI,IAAI,CAAClB,QAAQ,CAACuB,IAAI,GAAGJ,GAAG,CAAC,CAACK,QAAU;gBAACA,MAAMH,GAAG;gBAAEG;aAAM;QAC3F,MAAMC,cAAc,IAAIC;QACxB,MAAMC,mBAAkC,EAAE;QAC1C,MAAMC,SAAsB,EAAE;QAE9B,KAAK,MAAMC,QAAQ,IAAI,CAAC1B,OAAO,CAAC2B,mBAAmB,CAACf,WAAY;YAC9D,MAAMK,OAAOH,aAAac,GAAG,CAACF,KAAKR,GAAG;YACtC,IAAI,CAACD,MAAM;YAEX,MAAMY,UAAU,IAAI,CAAC/B,MAAM,CAACgC,yBAAyB,CAACJ,KAAKK,UAAU,EAAEL,KAAKM,SAAS;YACrF,IAAI,CAACH,SAAS;YAEd,MAAMI,QAAQ,IAAI,CAAClC,MAAM,CAACmC,iBAAiB,CAACL,SAASZ;YACrD,IAAI,CAACkB,wBAAwB,CAACF,OAAOhB,MAAML,WAAWO;YACtDM,OAAOW,IAAI,CAACH;YACZX,YAAYe,GAAG,CAACpB,KAAKC,GAAG;YACxBM,iBAAiBY,IAAI,CAACnB;QACxB;QAEA,MAAMqB,cAAcpD,uBAAuB0B,WAAWY;QACtD,KAAK,MAAMP,QAAQL,UAAW;YAC5B,IAAI,CAACU,YAAYiB,GAAG,CAACtB,KAAKC,GAAG,KAAK,CAACoB,YAAYC,GAAG,CAACtB,KAAKC,GAAG,GAAG;gBAC5D,MAAMe,QAAQ,IAAI,CAAClC,MAAM,CAACyC,mBAAmB,CAACvB;gBAC9C,IAAI,CAACkB,wBAAwB,CAACF,OAAOhB,MAAML,WAAWO;gBACtDM,OAAOW,IAAI,CAACH;YACd;QACF;QAEA,OAAOR;IACT;IAEAgB,gBAAgBC,eAAuB,EAAExC,OAA6B,EAAyB;QAC7F,OAAO,IAAI,CAACJ,MAAM,CAAC2C,eAAe,CAACC,iBAAiBxC;IACtD;IAEA,MAAMyC,aAAaC,IAA0B,EAA6B;QACxE,MAAMC,YAA8B,EAAE;QAEtC,KAAK,MAAM,EAAEd,UAAU,EAAEC,SAAS,EAAE,IAAI,IAAI,CAAChC,OAAO,CAAC8C,eAAe,GAAI;YACtE,MAAMjB,UAAU,IAAI,CAAC/B,MAAM,CAACiD,cAAc,CAAChB,YAAYC;YACvD,IAAI,CAACH,SAAS;YACd,IAAIe,MAAMI,QAAQC,aAAapB,QAAQqB,WAAW,KAAKN,KAAKI,GAAG,EAAE;YAEjEH,UAAUT,IAAI,CAAC,IAAI,CAACe,gBAAgB,CAACtB;QACvC;QAEA,OAAOgB;IACT;IAEA,MAAMO,iBAAiBpB,SAAiB,EAA6B;QACnE,MAAMqB,QAAQ,IAAI,CAACrD,OAAO,CAACsD,kBAAkB,CAACtB;QAC9C,IAAIqB,OAAO;YACT,MAAMxB,UAAU,IAAI,CAAC/B,MAAM,CAACiD,cAAc,CAACM,MAAMtB,UAAU,EAAEsB,MAAMrB,SAAS;YAC5E,IAAIH,SAASG,cAAcA,WAAW;gBACpC,OAAO;oBAAC,IAAI,CAACmB,gBAAgB,CAACtB;iBAAS;YACzC;QACF;QAEA,OAAO,AAAC,CAAA,MAAM,IAAI,CAACc,YAAY,EAAC,EAAGY,MAAM,CAAC,CAAC1B,UAAYA,QAAQG,SAAS,KAAKA;IAC/E;IAEQmB,iBAAiBtB,OAAuB,EAAkB;QAChE,OAAO;YACLlC,MAAM,IAAI,CAACA,IAAI;YACfqC,WAAWH,QAAQG,SAAS;YAC5BgB,KAAKnB,QAAQqB,WAAW;YACxBM,kBAAkB3B,QAAQ2B,gBAAgB;YAC1CC,YAAY5B,QAAQ4B,UAAU;YAC9BC,WAAW7B,QAAQ8B,YAAY;YAC/BjB,iBAAiBb,QAAQ+B,cAAc;QACzC;IACF;IAEQzB,yBACNF,KAAgB,EAChB3B,WAAwB,EACxBM,SAAwB,EACxBO,oBAAgD,EAC1C;QACN,MAAM0C,UAAU5E,mBAAmB2B,WAAWN;QAC9C,MAAMwD,eAAeD,UAAU1C,qBAAqBS,GAAG,CAACiC,QAAQ3C,GAAG,IAAI+B;QACvE,IAAIa,cAAcnE,SAAS,IAAI,CAACA,IAAI,EAAE;YACpCsC,MAAM8B,IAAI,GAAGD,aAAaC,IAAI;QAChC;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CopilotAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/
|
|
1
|
+
{"version":3,"file":"CopilotAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGtF,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,oBAAiD;IAEtF,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS;IAe/E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
2
1
|
import { generateAgentName } from "../../utils/matching.js";
|
|
3
2
|
import { CopilotSessionParser } from "./CopilotSessionParser.js";
|
|
3
|
+
import { processOnlyAgent } from "../shared.js";
|
|
4
4
|
export class CopilotAgentMapper {
|
|
5
5
|
parser;
|
|
6
6
|
constructor(parser = new CopilotSessionParser()){
|
|
@@ -21,16 +21,9 @@ export class CopilotAgentMapper {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
mapProcessOnlyAgent(processInfo) {
|
|
24
|
-
return {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
status: AgentStatus.RUNNING,
|
|
28
|
-
summary: "Copilot process running",
|
|
29
|
-
pid: processInfo.pid,
|
|
30
|
-
projectPath: processInfo.cwd || "",
|
|
31
|
-
sessionId: `pid-${processInfo.pid}`,
|
|
32
|
-
lastActive: new Date()
|
|
33
|
-
};
|
|
24
|
+
return processOnlyAgent("copilot", processInfo, {
|
|
25
|
+
summary: "Copilot process running"
|
|
26
|
+
});
|
|
34
27
|
}
|
|
35
28
|
}
|
|
36
29
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/copilot/CopilotAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { CopilotSessionParser, type CopilotSession } from \"./CopilotSessionParser.js\";\nimport { processOnlyAgent } from \"../shared.js\";\n\nexport class CopilotAgentMapper {\n constructor(private readonly parser: CopilotSessionParser = new CopilotSessionParser()) {}\n\n mapSessionToAgent(session: CopilotSession, processInfo: ProcessInfo): AgentInfo {\n const projectPath = session.projectPath || processInfo.cwd || \"\";\n return {\n name: generateAgentName(projectPath, processInfo.pid),\n type: \"copilot\",\n status: this.parser.determineStatus(session),\n summary: session.summary || \"Copilot session active\",\n pid: processInfo.pid,\n projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.eventsFilePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return processOnlyAgent(\"copilot\", processInfo, { summary: \"Copilot process running\" });\n }\n}\n"],"names":["generateAgentName","CopilotSessionParser","processOnlyAgent","CopilotAgentMapper","parser","mapSessionToAgent","session","processInfo","projectPath","cwd","name","pid","type","status","determineStatus","summary","sessionId","lastActive","sessionFilePath","eventsFilePath","mapProcessOnlyAgent"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAC5D,SAASC,oBAAoB,QAA6B,4BAA4B;AACtF,SAASC,gBAAgB,QAAQ,eAAe;AAEhD,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA+B,IAAIH,sBAAsB,CAAE;aAA3DG,SAAAA;IAA4D;IAEzFC,kBAAkBC,OAAuB,EAAEC,WAAwB,EAAa;QAC9E,MAAMC,cAAcF,QAAQE,WAAW,IAAID,YAAYE,GAAG,IAAI;QAC9D,OAAO;YACLC,MAAMV,kBAAkBQ,aAAaD,YAAYI,GAAG;YACpDC,MAAM;YACNC,QAAQ,IAAI,CAACT,MAAM,CAACU,eAAe,CAACR;YACpCS,SAAST,QAAQS,OAAO,IAAI;YAC5BJ,KAAKJ,YAAYI,GAAG;YACpBH;YACAQ,WAAWV,QAAQU,SAAS;YAC5BC,YAAYX,QAAQW,UAAU;YAC9BC,iBAAiBZ,QAAQa,cAAc;QACzC;IACF;IAEAC,oBAAoBb,WAAwB,EAAa;QACvD,OAAOL,iBAAiB,WAAWK,aAAa;YAAEQ,SAAS;QAA0B;IACvF;AACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface CopilotLock {
|
|
2
|
+
sessionDir: string;
|
|
3
|
+
sessionId: string;
|
|
4
|
+
pid: number;
|
|
5
|
+
}
|
|
6
|
+
export interface CopilotSessionDir {
|
|
7
|
+
sessionDir: string;
|
|
8
|
+
sessionId: string;
|
|
9
|
+
}
|
|
10
|
+
/** A live Copilot process whose `inuse.<pid>.lock` file should be located. */
|
|
11
|
+
export interface CopilotLockProcess {
|
|
12
|
+
pid: number;
|
|
13
|
+
startTime?: Date;
|
|
14
|
+
}
|
|
15
|
+
export interface CopilotSessionLocatorOptions {
|
|
16
|
+
sessionStateDir?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class CopilotSessionLocator {
|
|
19
|
+
private readonly sessionStateDir;
|
|
20
|
+
/** Lock location per PID, trusted only while that PID's start time is unchanged. */
|
|
21
|
+
private readonly knownLocks;
|
|
22
|
+
constructor(options?: CopilotSessionLocatorOptions);
|
|
23
|
+
listSessionDirs(): CopilotSessionDir[];
|
|
24
|
+
findSessionDirById(sessionId: string): CopilotSessionDir | null;
|
|
25
|
+
/**
|
|
26
|
+
* Find `inuse.<pid>.lock` files.
|
|
27
|
+
*
|
|
28
|
+
* Without `processes`, every session directory is scanned and all locks are
|
|
29
|
+
* returned. With `processes`, only locks of those PIDs are returned and the
|
|
30
|
+
* search is bounded:
|
|
31
|
+
* - a lock found earlier for the same (pid, startTime) is re-validated with
|
|
32
|
+
* a single `stat` (a reused PID has a different start time and misses);
|
|
33
|
+
* - otherwise only session directories whose mtime is at or after the
|
|
34
|
+
* earliest unresolved process start time (minus slack) are listed, since
|
|
35
|
+
* creating the lock file bumps its directory's mtime;
|
|
36
|
+
* - if an unresolved process has no start time, every directory is listed.
|
|
37
|
+
*/
|
|
38
|
+
discoverActiveLocks(processes?: readonly CopilotLockProcess[]): CopilotLock[];
|
|
39
|
+
/** List lock files in session directories with mtime >= `minMtimeMs` (all when undefined). */
|
|
40
|
+
private scanLocks;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=CopilotSessionLocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopilotSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotSessionLocator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;gBAE/C,OAAO,GAAE,4BAAiC;IAKtD,eAAe,IAAI,iBAAiB,EAAE;IActC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAM/D;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,GAAG,WAAW,EAAE;IAmD7E,8FAA8F;IAC9F,OAAO,CAAC,SAAS;CAuBlB"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { isDirectory, isSafePathSegment, safeReaddir, safeStat } from "../../utils/session.js";
|
|
3
|
+
import { homeDir } from "../shared.js";
|
|
4
|
+
/**
|
|
5
|
+
* Tolerance between a reported process start time and its lock directory's
|
|
6
|
+
* mtime: `ps lstart` has 1 s resolution, Linux start times derive from an
|
|
7
|
+
* estimated boot time, and some filesystems store coarse mtimes.
|
|
8
|
+
*/ const START_TIME_SLACK_MS = 5 * 60 * 1000;
|
|
9
|
+
const LOCK_FILE_PATTERN = /^inuse\.(\d+)\.lock$/;
|
|
10
|
+
export class CopilotSessionLocator {
|
|
11
|
+
sessionStateDir;
|
|
12
|
+
/** Lock location per PID, trusted only while that PID's start time is unchanged. */ knownLocks = new Map();
|
|
13
|
+
constructor(options = {}){
|
|
14
|
+
this.sessionStateDir = options.sessionStateDir ?? path.join(homeDir(), ".copilot", "session-state");
|
|
15
|
+
}
|
|
16
|
+
listSessionDirs() {
|
|
17
|
+
if (!isDirectory(this.sessionStateDir)) return [];
|
|
18
|
+
const sessionDirs = [];
|
|
19
|
+
for (const sessionId of safeReaddir(this.sessionStateDir)){
|
|
20
|
+
const sessionDir = path.join(this.sessionStateDir, sessionId);
|
|
21
|
+
if (!isDirectory(sessionDir)) continue;
|
|
22
|
+
sessionDirs.push({
|
|
23
|
+
sessionDir,
|
|
24
|
+
sessionId
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return sessionDirs;
|
|
28
|
+
}
|
|
29
|
+
findSessionDirById(sessionId) {
|
|
30
|
+
if (!isSafePathSegment(sessionId)) return null;
|
|
31
|
+
const sessionDir = path.join(this.sessionStateDir, sessionId);
|
|
32
|
+
return isDirectory(sessionDir) ? {
|
|
33
|
+
sessionDir,
|
|
34
|
+
sessionId
|
|
35
|
+
} : null;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Find `inuse.<pid>.lock` files.
|
|
39
|
+
*
|
|
40
|
+
* Without `processes`, every session directory is scanned and all locks are
|
|
41
|
+
* returned. With `processes`, only locks of those PIDs are returned and the
|
|
42
|
+
* search is bounded:
|
|
43
|
+
* - a lock found earlier for the same (pid, startTime) is re-validated with
|
|
44
|
+
* a single `stat` (a reused PID has a different start time and misses);
|
|
45
|
+
* - otherwise only session directories whose mtime is at or after the
|
|
46
|
+
* earliest unresolved process start time (minus slack) are listed, since
|
|
47
|
+
* creating the lock file bumps its directory's mtime;
|
|
48
|
+
* - if an unresolved process has no start time, every directory is listed.
|
|
49
|
+
*/ discoverActiveLocks(processes) {
|
|
50
|
+
if (!processes) {
|
|
51
|
+
return this.scanLocks(undefined, ()=>true);
|
|
52
|
+
}
|
|
53
|
+
const startTimes = new Map(processes.map((proc)=>[
|
|
54
|
+
proc.pid,
|
|
55
|
+
proc.startTime?.getTime()
|
|
56
|
+
]));
|
|
57
|
+
for (const [pid, known] of this.knownLocks){
|
|
58
|
+
if (startTimes.get(pid) !== known.startTimeMs) {
|
|
59
|
+
this.knownLocks.delete(pid);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const locks = [];
|
|
63
|
+
const unresolved = new Set();
|
|
64
|
+
for (const pid of startTimes.keys()){
|
|
65
|
+
const known = this.knownLocks.get(pid);
|
|
66
|
+
if (known && safeStat(path.join(known.sessionDir, lockFileName(pid)))?.isFile()) {
|
|
67
|
+
locks.push({
|
|
68
|
+
sessionDir: known.sessionDir,
|
|
69
|
+
sessionId: known.sessionId,
|
|
70
|
+
pid
|
|
71
|
+
});
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
this.knownLocks.delete(pid);
|
|
75
|
+
unresolved.add(pid);
|
|
76
|
+
}
|
|
77
|
+
if (unresolved.size === 0) return locks;
|
|
78
|
+
const unresolvedStarts = [
|
|
79
|
+
...unresolved
|
|
80
|
+
].map((pid)=>startTimes.get(pid));
|
|
81
|
+
const minMtimeMs = unresolvedStarts.every((start)=>start !== undefined) ? Math.min(...unresolvedStarts) - START_TIME_SLACK_MS : undefined;
|
|
82
|
+
const found = this.scanLocks(minMtimeMs, (pid)=>unresolved.has(pid));
|
|
83
|
+
const lockCounts = new Map();
|
|
84
|
+
for (const lock of found){
|
|
85
|
+
lockCounts.set(lock.pid, (lockCounts.get(lock.pid) ?? 0) + 1);
|
|
86
|
+
}
|
|
87
|
+
for (const lock of found){
|
|
88
|
+
const startTimeMs = startTimes.get(lock.pid);
|
|
89
|
+
// Only remember unambiguous locks of processes with a known start time
|
|
90
|
+
if (startTimeMs !== undefined && lockCounts.get(lock.pid) === 1) {
|
|
91
|
+
this.knownLocks.set(lock.pid, {
|
|
92
|
+
sessionDir: lock.sessionDir,
|
|
93
|
+
sessionId: lock.sessionId,
|
|
94
|
+
startTimeMs
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return locks.concat(found);
|
|
99
|
+
}
|
|
100
|
+
/** List lock files in session directories with mtime >= `minMtimeMs` (all when undefined). */ scanLocks(minMtimeMs, includePid) {
|
|
101
|
+
const locks = [];
|
|
102
|
+
for (const sessionId of safeReaddir(this.sessionStateDir)){
|
|
103
|
+
const sessionDir = path.join(this.sessionStateDir, sessionId);
|
|
104
|
+
const stat = safeStat(sessionDir);
|
|
105
|
+
if (!stat?.isDirectory()) continue;
|
|
106
|
+
if (minMtimeMs !== undefined && stat.mtimeMs < minMtimeMs) continue;
|
|
107
|
+
for (const entry of safeReaddir(sessionDir)){
|
|
108
|
+
const match = entry.match(LOCK_FILE_PATTERN);
|
|
109
|
+
if (!match) continue;
|
|
110
|
+
const pid = Number.parseInt(match[1], 10);
|
|
111
|
+
if (!Number.isFinite(pid) || !includePid(pid)) continue;
|
|
112
|
+
locks.push({
|
|
113
|
+
sessionDir,
|
|
114
|
+
sessionId,
|
|
115
|
+
pid
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return locks;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function lockFileName(pid) {
|
|
123
|
+
return `inuse.${pid}.lock`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
//# sourceMappingURL=CopilotSessionLocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/copilot/CopilotSessionLocator.ts"],"sourcesContent":["import * as path from \"path\";\nimport { isDirectory, isSafePathSegment, safeReaddir, safeStat } from \"../../utils/session.js\";\nimport { homeDir } from \"../shared.js\";\n\nexport interface CopilotLock {\n sessionDir: string;\n sessionId: string;\n pid: number;\n}\n\nexport interface CopilotSessionDir {\n sessionDir: string;\n sessionId: string;\n}\n\n/** A live Copilot process whose `inuse.<pid>.lock` file should be located. */\nexport interface CopilotLockProcess {\n pid: number;\n startTime?: Date;\n}\n\nexport interface CopilotSessionLocatorOptions {\n sessionStateDir?: string;\n}\n\ninterface KnownLock extends CopilotSessionDir {\n startTimeMs: number;\n}\n\n/**\n * Tolerance between a reported process start time and its lock directory's\n * mtime: `ps lstart` has 1 s resolution, Linux start times derive from an\n * estimated boot time, and some filesystems store coarse mtimes.\n */\nconst START_TIME_SLACK_MS = 5 * 60 * 1000;\n\nconst LOCK_FILE_PATTERN = /^inuse\\.(\\d+)\\.lock$/;\n\nexport class CopilotSessionLocator {\n private readonly sessionStateDir: string;\n /** Lock location per PID, trusted only while that PID's start time is unchanged. */\n private readonly knownLocks = new Map<number, KnownLock>();\n\n constructor(options: CopilotSessionLocatorOptions = {}) {\n this.sessionStateDir =\n options.sessionStateDir ?? path.join(homeDir(), \".copilot\", \"session-state\");\n }\n\n listSessionDirs(): CopilotSessionDir[] {\n if (!isDirectory(this.sessionStateDir)) return [];\n\n const sessionDirs: CopilotSessionDir[] = [];\n for (const sessionId of safeReaddir(this.sessionStateDir)) {\n const sessionDir = path.join(this.sessionStateDir, sessionId);\n if (!isDirectory(sessionDir)) continue;\n\n sessionDirs.push({ sessionDir, sessionId });\n }\n\n return sessionDirs;\n }\n\n findSessionDirById(sessionId: string): CopilotSessionDir | null {\n if (!isSafePathSegment(sessionId)) return null;\n const sessionDir = path.join(this.sessionStateDir, sessionId);\n return isDirectory(sessionDir) ? { sessionDir, sessionId } : null;\n }\n\n /**\n * Find `inuse.<pid>.lock` files.\n *\n * Without `processes`, every session directory is scanned and all locks are\n * returned. With `processes`, only locks of those PIDs are returned and the\n * search is bounded:\n * - a lock found earlier for the same (pid, startTime) is re-validated with\n * a single `stat` (a reused PID has a different start time and misses);\n * - otherwise only session directories whose mtime is at or after the\n * earliest unresolved process start time (minus slack) are listed, since\n * creating the lock file bumps its directory's mtime;\n * - if an unresolved process has no start time, every directory is listed.\n */\n discoverActiveLocks(processes?: readonly CopilotLockProcess[]): CopilotLock[] {\n if (!processes) {\n return this.scanLocks(undefined, () => true);\n }\n\n const startTimes = new Map(processes.map((proc) => [proc.pid, proc.startTime?.getTime()]));\n for (const [pid, known] of this.knownLocks) {\n if (startTimes.get(pid) !== known.startTimeMs) {\n this.knownLocks.delete(pid);\n }\n }\n\n const locks: CopilotLock[] = [];\n const unresolved = new Set<number>();\n for (const pid of startTimes.keys()) {\n const known = this.knownLocks.get(pid);\n if (known && safeStat(path.join(known.sessionDir, lockFileName(pid)))?.isFile()) {\n locks.push({ sessionDir: known.sessionDir, sessionId: known.sessionId, pid });\n continue;\n }\n this.knownLocks.delete(pid);\n unresolved.add(pid);\n }\n if (unresolved.size === 0) return locks;\n\n const unresolvedStarts = [...unresolved].map((pid) => startTimes.get(pid));\n const minMtimeMs = unresolvedStarts.every((start): start is number => start !== undefined)\n ? Math.min(...unresolvedStarts) - START_TIME_SLACK_MS\n : undefined;\n\n const found = this.scanLocks(minMtimeMs, (pid) => unresolved.has(pid));\n\n const lockCounts = new Map<number, number>();\n for (const lock of found) {\n lockCounts.set(lock.pid, (lockCounts.get(lock.pid) ?? 0) + 1);\n }\n for (const lock of found) {\n const startTimeMs = startTimes.get(lock.pid);\n // Only remember unambiguous locks of processes with a known start time\n if (startTimeMs !== undefined && lockCounts.get(lock.pid) === 1) {\n this.knownLocks.set(lock.pid, {\n sessionDir: lock.sessionDir,\n sessionId: lock.sessionId,\n startTimeMs,\n });\n }\n }\n\n return locks.concat(found);\n }\n\n /** List lock files in session directories with mtime >= `minMtimeMs` (all when undefined). */\n private scanLocks(\n minMtimeMs: number | undefined,\n includePid: (pid: number) => boolean,\n ): CopilotLock[] {\n const locks: CopilotLock[] = [];\n for (const sessionId of safeReaddir(this.sessionStateDir)) {\n const sessionDir = path.join(this.sessionStateDir, sessionId);\n const stat = safeStat(sessionDir);\n if (!stat?.isDirectory()) continue;\n if (minMtimeMs !== undefined && stat.mtimeMs < minMtimeMs) continue;\n\n for (const entry of safeReaddir(sessionDir)) {\n const match = entry.match(LOCK_FILE_PATTERN);\n if (!match) continue;\n\n const pid = Number.parseInt(match[1], 10);\n if (!Number.isFinite(pid) || !includePid(pid)) continue;\n locks.push({ sessionDir, sessionId, pid });\n }\n }\n\n return locks;\n }\n}\n\nfunction lockFileName(pid: number): string {\n return `inuse.${pid}.lock`;\n}\n"],"names":["path","isDirectory","isSafePathSegment","safeReaddir","safeStat","homeDir","START_TIME_SLACK_MS","LOCK_FILE_PATTERN","CopilotSessionLocator","sessionStateDir","knownLocks","Map","options","join","listSessionDirs","sessionDirs","sessionId","sessionDir","push","findSessionDirById","discoverActiveLocks","processes","scanLocks","undefined","startTimes","map","proc","pid","startTime","getTime","known","get","startTimeMs","delete","locks","unresolved","Set","keys","lockFileName","isFile","add","size","unresolvedStarts","minMtimeMs","every","start","Math","min","found","has","lockCounts","lock","set","concat","includePid","stat","mtimeMs","entry","match","Number","parseInt","isFinite"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import { type JsonlSummaryBounds } from "../../utils/IncrementalJsonlSummary.js";
|
|
4
|
+
export interface CopilotSession {
|
|
5
|
+
sessionId: string;
|
|
6
|
+
projectPath: string;
|
|
7
|
+
summary: string;
|
|
8
|
+
sessionStart: Date;
|
|
9
|
+
lastActive: Date;
|
|
10
|
+
lastEventType?: string;
|
|
11
|
+
firstUserMessage: string;
|
|
12
|
+
eventsFilePath: string;
|
|
13
|
+
}
|
|
14
|
+
export interface CopilotSessionParserOptions {
|
|
15
|
+
/** Cold-start scan bounds for `readSessionDirIncremental` (see IncrementalJsonlSummary). */
|
|
16
|
+
summaryBounds?: JsonlSummaryBounds | false;
|
|
17
|
+
}
|
|
18
|
+
export declare class CopilotSessionParser {
|
|
19
|
+
/** Incremental reader backing `getConversation({ tail })`. */
|
|
20
|
+
private readonly tailReader;
|
|
21
|
+
private readonly eventCache;
|
|
22
|
+
constructor(options?: CopilotSessionParserOptions);
|
|
23
|
+
/**
|
|
24
|
+
* Fold one events.jsonl entry into the O(1) event summary. Mirrors the
|
|
25
|
+
* original whole-file pass: the latest valid timestamp and event type win,
|
|
26
|
+
* `session.start` overrides id/cwd/start, and user/assistant text is tracked.
|
|
27
|
+
*
|
|
28
|
+
* `skip` (bounded cold start) keeps the head's first user message and clears
|
|
29
|
+
* the latest timestamp, event type and text, so those come from the tail
|
|
30
|
+
* only. Tail entries never fill the first user message: beyond the head it
|
|
31
|
+
* stays "" and the summary falls back to the tail's latest text. The
|
|
32
|
+
* `session.start` fields (id, cwd, start) are kept from the head and, as in
|
|
33
|
+
* a full scan, a later `session.start` in the tail still overrides them; one
|
|
34
|
+
* only in the skipped middle is not seen.
|
|
35
|
+
*/
|
|
36
|
+
private readonly eventReducer;
|
|
37
|
+
readSessionDir(sessionDir: string, fallbackSessionId: string): CopilotSession | null;
|
|
38
|
+
/**
|
|
39
|
+
* Same result as `readSessionDir`, but events.jsonl is summarized through a
|
|
40
|
+
* per-instance incremental cache so repeated refreshes only parse appended
|
|
41
|
+
* bytes. Call `pruneSessionCache()` once per refresh.
|
|
42
|
+
*
|
|
43
|
+
* The first read of a large events.jsonl is a bounded head + tail scan (see
|
|
44
|
+
* `eventReducer.skip`); fields whose entries lie only in the skipped middle
|
|
45
|
+
* fall back to their defaults instead of forcing a full parse.
|
|
46
|
+
*/
|
|
47
|
+
readSessionDirIncremental(sessionDir: string, fallbackSessionId: string): CopilotSession | null;
|
|
48
|
+
/** Evict cached event summaries for files not read since the previous prune. */
|
|
49
|
+
pruneSessionCache(): void;
|
|
50
|
+
private toSession;
|
|
51
|
+
getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
|
|
52
|
+
private eventToMessage;
|
|
53
|
+
determineStatus(session: CopilotSession): AgentStatus;
|
|
54
|
+
private hasWorkspaceMetadata;
|
|
55
|
+
private readWorkspaceMetadata;
|
|
56
|
+
private stripYamlScalar;
|
|
57
|
+
private parseEventLines;
|
|
58
|
+
private parseEventLine;
|
|
59
|
+
private roleForEvent;
|
|
60
|
+
private extractEventText;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=CopilotSessionParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CopilotSessionParser.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotSessionParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,wCAAwC,CAAC;AAoChD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAoCD,MAAM,WAAW,2BAA2B;IAC1C,4FAA4F;IAC5F,aAAa,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CAC5C;AAED,qBAAa,oBAAoB;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6C;gBAE5D,OAAO,GAAE,2BAAgC;IAMrD;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CA4C3B;IAEF,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAUpF;;;;;;;;OAQG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAS/F,gFAAgF;IAChF,iBAAiB,IAAI,IAAI;IAIzB,OAAO,CAAC,SAAS;IAmCjB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IA8B9F,OAAO,CAAC,cAAc;IActB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW;IAYrD,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
|
|
4
|
+
import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
|
|
5
|
+
import { safeReadFile, safeStat } from "../../utils/session.js";
|
|
6
|
+
import { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
|
|
7
|
+
const VERBOSE_SYSTEM_EVENTS = new Set([
|
|
8
|
+
"system.message",
|
|
9
|
+
"session.info",
|
|
10
|
+
"session.warning",
|
|
11
|
+
"tool.execution_start",
|
|
12
|
+
"tool.execution_complete",
|
|
13
|
+
"function",
|
|
14
|
+
"abort"
|
|
15
|
+
]);
|
|
16
|
+
const WAITING_EVENTS = new Set([
|
|
17
|
+
"assistant.message",
|
|
18
|
+
"assistant.turn_end",
|
|
19
|
+
"session.shutdown",
|
|
20
|
+
"abort"
|
|
21
|
+
]);
|
|
22
|
+
export class CopilotSessionParser {
|
|
23
|
+
/** Incremental reader backing `getConversation({ tail })`. */ tailReader = new JsonlTailReader();
|
|
24
|
+
eventCache;
|
|
25
|
+
constructor(options = {}){
|
|
26
|
+
this.eventCache = new IncrementalJsonlSummary(this.eventReducer, {
|
|
27
|
+
bounds: options.summaryBounds
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Fold one events.jsonl entry into the O(1) event summary. Mirrors the
|
|
32
|
+
* original whole-file pass: the latest valid timestamp and event type win,
|
|
33
|
+
* `session.start` overrides id/cwd/start, and user/assistant text is tracked.
|
|
34
|
+
*
|
|
35
|
+
* `skip` (bounded cold start) keeps the head's first user message and clears
|
|
36
|
+
* the latest timestamp, event type and text, so those come from the tail
|
|
37
|
+
* only. Tail entries never fill the first user message: beyond the head it
|
|
38
|
+
* stays "" and the summary falls back to the tail's latest text. The
|
|
39
|
+
* `session.start` fields (id, cwd, start) are kept from the head and, as in
|
|
40
|
+
* a full scan, a later `session.start` in the tail still overrides them; one
|
|
41
|
+
* only in the skipped middle is not seen.
|
|
42
|
+
*/ eventReducer = {
|
|
43
|
+
initial: ()=>({
|
|
44
|
+
entryCount: 0,
|
|
45
|
+
firstUserMessage: "",
|
|
46
|
+
lastText: ""
|
|
47
|
+
}),
|
|
48
|
+
reduce: (state, value)=>{
|
|
49
|
+
if (value === undefined) return state;
|
|
50
|
+
const next = {
|
|
51
|
+
...state,
|
|
52
|
+
entryCount: state.entryCount + 1
|
|
53
|
+
};
|
|
54
|
+
if (!value || typeof value !== "object") return next;
|
|
55
|
+
const entry = value;
|
|
56
|
+
const timestampMs = parseTimestamp(entry.timestamp)?.getTime();
|
|
57
|
+
if (timestampMs !== undefined) {
|
|
58
|
+
next.lastActiveMs = timestampMs;
|
|
59
|
+
}
|
|
60
|
+
if (entry.type) {
|
|
61
|
+
next.lastEventType = entry.type;
|
|
62
|
+
}
|
|
63
|
+
if (entry.type === "session.start") {
|
|
64
|
+
next.sessionId = entry.data?.sessionId || next.sessionId;
|
|
65
|
+
next.projectPath = entry.data?.context?.cwd || next.projectPath;
|
|
66
|
+
next.sessionStartMs = parseTimestamp(entry.data?.startTime)?.getTime() ?? timestampMs ?? next.sessionStartMs;
|
|
67
|
+
return next;
|
|
68
|
+
}
|
|
69
|
+
const text = this.extractEventText(entry, false);
|
|
70
|
+
if (!text) return next;
|
|
71
|
+
if (!next.firstUserMessage && !state.pastHead && entry.type === "user.message") {
|
|
72
|
+
next.firstUserMessage = text;
|
|
73
|
+
}
|
|
74
|
+
if (entry.type === "user.message" || entry.type === "assistant.message") {
|
|
75
|
+
next.lastText = text;
|
|
76
|
+
}
|
|
77
|
+
return next;
|
|
78
|
+
},
|
|
79
|
+
skip: (state)=>({
|
|
80
|
+
entryCount: state.entryCount,
|
|
81
|
+
pastHead: true,
|
|
82
|
+
sessionId: state.sessionId,
|
|
83
|
+
projectPath: state.projectPath,
|
|
84
|
+
sessionStartMs: state.sessionStartMs,
|
|
85
|
+
firstUserMessage: state.firstUserMessage,
|
|
86
|
+
lastText: ""
|
|
87
|
+
})
|
|
88
|
+
};
|
|
89
|
+
readSessionDir(sessionDir, fallbackSessionId) {
|
|
90
|
+
const eventsFilePath = path.join(sessionDir, "events.jsonl");
|
|
91
|
+
const content = safeReadFile(eventsFilePath);
|
|
92
|
+
const events = content === undefined ? this.eventReducer.initial() : reduceJsonlContent(this.eventReducer, content);
|
|
93
|
+
return this.toSession(sessionDir, fallbackSessionId, events);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Same result as `readSessionDir`, but events.jsonl is summarized through a
|
|
97
|
+
* per-instance incremental cache so repeated refreshes only parse appended
|
|
98
|
+
* bytes. Call `pruneSessionCache()` once per refresh.
|
|
99
|
+
*
|
|
100
|
+
* The first read of a large events.jsonl is a bounded head + tail scan (see
|
|
101
|
+
* `eventReducer.skip`); fields whose entries lie only in the skipped middle
|
|
102
|
+
* fall back to their defaults instead of forcing a full parse.
|
|
103
|
+
*/ readSessionDirIncremental(sessionDir, fallbackSessionId) {
|
|
104
|
+
const result = this.eventCache.read(path.join(sessionDir, "events.jsonl"));
|
|
105
|
+
return this.toSession(sessionDir, fallbackSessionId, result?.state ?? this.eventReducer.initial());
|
|
106
|
+
}
|
|
107
|
+
/** Evict cached event summaries for files not read since the previous prune. */ pruneSessionCache() {
|
|
108
|
+
this.eventCache.prune();
|
|
109
|
+
}
|
|
110
|
+
toSession(sessionDir, fallbackSessionId, events) {
|
|
111
|
+
const eventsFilePath = path.join(sessionDir, "events.jsonl");
|
|
112
|
+
const workspace = this.readWorkspaceMetadata(path.join(sessionDir, "workspace.yaml"));
|
|
113
|
+
if (events.entryCount === 0 && !this.hasWorkspaceMetadata(workspace)) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const fileStat = safeStat(eventsFilePath);
|
|
117
|
+
const defaultStart = workspace.createdAt || fileStat?.birthtime || new Date();
|
|
118
|
+
const sessionStart = events.sessionStartMs !== undefined ? new Date(events.sessionStartMs) : defaultStart;
|
|
119
|
+
const lastActive = events.lastActiveMs !== undefined ? new Date(events.lastActiveMs) : workspace.updatedAt || fileStat?.mtime || defaultStart;
|
|
120
|
+
const summary = events.firstUserMessage || events.lastText || workspace.name || "Copilot session active";
|
|
121
|
+
return {
|
|
122
|
+
sessionId: events.sessionId || workspace.id || fallbackSessionId,
|
|
123
|
+
projectPath: events.projectPath || workspace.cwd || "",
|
|
124
|
+
summary: truncate(summary, SUMMARY_MAX_LENGTH),
|
|
125
|
+
sessionStart,
|
|
126
|
+
lastActive,
|
|
127
|
+
lastEventType: events.lastEventType,
|
|
128
|
+
firstUserMessage: events.firstUserMessage,
|
|
129
|
+
eventsFilePath
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
getConversation(sessionFilePath, options) {
|
|
133
|
+
const verbose = options?.verbose ?? false;
|
|
134
|
+
const tail = normalizeTail(options?.tail);
|
|
135
|
+
if (tail !== undefined) {
|
|
136
|
+
return this.tailReader.read(sessionFilePath, tail, {
|
|
137
|
+
parseLine: (line)=>{
|
|
138
|
+
const entry = this.parseEventLine(line);
|
|
139
|
+
return entry ? this.eventToMessage(entry, verbose) : null;
|
|
140
|
+
}
|
|
141
|
+
}, String(verbose));
|
|
142
|
+
}
|
|
143
|
+
const content = safeReadFile(sessionFilePath);
|
|
144
|
+
if (content === undefined) return [];
|
|
145
|
+
const messages = [];
|
|
146
|
+
for (const entry of this.parseEventLines(content)){
|
|
147
|
+
const message = this.eventToMessage(entry, verbose);
|
|
148
|
+
if (message) messages.push(message);
|
|
149
|
+
}
|
|
150
|
+
return messages;
|
|
151
|
+
}
|
|
152
|
+
eventToMessage(entry, verbose) {
|
|
153
|
+
const role = this.roleForEvent(entry.type, verbose);
|
|
154
|
+
if (!role) return null;
|
|
155
|
+
const text = this.extractEventText(entry, verbose);
|
|
156
|
+
if (!text) return null;
|
|
157
|
+
return {
|
|
158
|
+
role,
|
|
159
|
+
content: text,
|
|
160
|
+
timestamp: entry.timestamp
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
determineStatus(session) {
|
|
164
|
+
if (isIdle(session.lastActive)) {
|
|
165
|
+
return AgentStatus.IDLE;
|
|
166
|
+
}
|
|
167
|
+
if (session.lastEventType !== undefined && WAITING_EVENTS.has(session.lastEventType)) {
|
|
168
|
+
return AgentStatus.WAITING;
|
|
169
|
+
}
|
|
170
|
+
return AgentStatus.RUNNING;
|
|
171
|
+
}
|
|
172
|
+
hasWorkspaceMetadata(workspace) {
|
|
173
|
+
return Boolean(workspace.id || workspace.cwd || workspace.name || workspace.createdAt || workspace.updatedAt);
|
|
174
|
+
}
|
|
175
|
+
readWorkspaceMetadata(filePath) {
|
|
176
|
+
const content = safeReadFile(filePath);
|
|
177
|
+
if (content === undefined) return {};
|
|
178
|
+
const values = new Map();
|
|
179
|
+
for (const rawLine of content.split("\n")){
|
|
180
|
+
const line = rawLine.trim();
|
|
181
|
+
if (!line || line.startsWith("#")) continue;
|
|
182
|
+
const idx = line.indexOf(":");
|
|
183
|
+
if (idx === -1) continue;
|
|
184
|
+
const key = line.slice(0, idx).trim();
|
|
185
|
+
const value = this.stripYamlScalar(line.slice(idx + 1).trim());
|
|
186
|
+
values.set(key, value);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
id: values.get("id"),
|
|
190
|
+
cwd: values.get("cwd"),
|
|
191
|
+
name: values.get("name"),
|
|
192
|
+
createdAt: parseTimestamp(values.get("created_at")) || undefined,
|
|
193
|
+
updatedAt: parseTimestamp(values.get("updated_at")) || undefined
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
stripYamlScalar(value) {
|
|
197
|
+
if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
|
|
198
|
+
return value.slice(1, -1);
|
|
199
|
+
}
|
|
200
|
+
return value;
|
|
201
|
+
}
|
|
202
|
+
parseEventLines(content) {
|
|
203
|
+
const entries = [];
|
|
204
|
+
for (const line of content.trim().split("\n")){
|
|
205
|
+
const entry = this.parseEventLine(line);
|
|
206
|
+
if (entry) entries.push(entry);
|
|
207
|
+
}
|
|
208
|
+
return entries;
|
|
209
|
+
}
|
|
210
|
+
parseEventLine(line) {
|
|
211
|
+
const trimmed = line.trim();
|
|
212
|
+
if (!trimmed) return null;
|
|
213
|
+
try {
|
|
214
|
+
return JSON.parse(trimmed);
|
|
215
|
+
} catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
roleForEvent(type, verbose) {
|
|
220
|
+
if (type === "user.message") return "user";
|
|
221
|
+
if (type === "assistant.message") return "assistant";
|
|
222
|
+
if (verbose && type !== undefined && VERBOSE_SYSTEM_EVENTS.has(type)) {
|
|
223
|
+
return "system";
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
extractEventText(entry, verbose) {
|
|
228
|
+
const data = entry.data;
|
|
229
|
+
if (!data) return "";
|
|
230
|
+
const raw = data.content || data.message || data.text || data.result?.content || data.result?.detailedContent || (verbose ? data.output : "") || "";
|
|
231
|
+
if (typeof raw !== "string") return "";
|
|
232
|
+
return raw.trim();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
//# sourceMappingURL=CopilotSessionParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/copilot/CopilotSessionParser.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\n\ninterface CopilotEventEntry {\n type?: string;\n data?: {\n sessionId?: string;\n startTime?: string;\n context?: {\n cwd?: string;\n gitRoot?: string;\n branch?: string;\n };\n content?: string;\n transformedContent?: string;\n message?: string;\n text?: string;\n result?: {\n content?: string;\n detailedContent?: string;\n };\n output?: string;\n };\n timestamp?: string;\n}\n\ninterface CopilotWorkspace {\n id?: string;\n cwd?: string;\n name?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface CopilotSession {\n sessionId: string;\n projectPath: string;\n summary: string;\n sessionStart: Date;\n lastActive: Date;\n lastEventType?: string;\n firstUserMessage: string;\n eventsFilePath: string;\n}\n\n/**\n * O(1) running summary of events.jsonl. Timestamps are epoch ms so cached\n * state stays immutable; unset fields fall back to workspace.yaml metadata.\n */\ninterface CopilotEventState {\n /** Number of lines that parsed as JSON. */\n entryCount: number;\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n sessionId?: string;\n projectPath?: string;\n sessionStartMs?: number;\n lastActiveMs?: number;\n firstUserMessage: string;\n lastText: string;\n lastEventType?: string;\n}\n\nconst VERBOSE_SYSTEM_EVENTS = new Set([\n \"system.message\",\n \"session.info\",\n \"session.warning\",\n \"tool.execution_start\",\n \"tool.execution_complete\",\n \"function\",\n \"abort\",\n]);\nconst WAITING_EVENTS = new Set([\n \"assistant.message\",\n \"assistant.turn_end\",\n \"session.shutdown\",\n \"abort\",\n]);\n\nexport interface CopilotSessionParserOptions {\n /** Cold-start scan bounds for `readSessionDirIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class CopilotSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly eventCache: IncrementalJsonlSummary<CopilotEventState>;\n\n constructor(options: CopilotSessionParserOptions = {}) {\n this.eventCache = new IncrementalJsonlSummary(this.eventReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n /**\n * Fold one events.jsonl entry into the O(1) event summary. Mirrors the\n * original whole-file pass: the latest valid timestamp and event type win,\n * `session.start` overrides id/cwd/start, and user/assistant text is tracked.\n *\n * `skip` (bounded cold start) keeps the head's first user message and clears\n * the latest timestamp, event type and text, so those come from the tail\n * only. Tail entries never fill the first user message: beyond the head it\n * stays \"\" and the summary falls back to the tail's latest text. The\n * `session.start` fields (id, cwd, start) are kept from the head and, as in\n * a full scan, a later `session.start` in the tail still overrides them; one\n * only in the skipped middle is not seen.\n */\n private readonly eventReducer: JsonlSummaryReducer<CopilotEventState> = {\n initial: () => ({ entryCount: 0, firstUserMessage: \"\", lastText: \"\" }),\n reduce: (state, value) => {\n if (value === undefined) return state;\n const next: CopilotEventState = { ...state, entryCount: state.entryCount + 1 };\n if (!value || typeof value !== \"object\") return next;\n\n const entry = value as CopilotEventEntry;\n const timestampMs = parseTimestamp(entry.timestamp)?.getTime();\n if (timestampMs !== undefined) {\n next.lastActiveMs = timestampMs;\n }\n if (entry.type) {\n next.lastEventType = entry.type;\n }\n\n if (entry.type === \"session.start\") {\n next.sessionId = entry.data?.sessionId || next.sessionId;\n next.projectPath = entry.data?.context?.cwd || next.projectPath;\n next.sessionStartMs =\n parseTimestamp(entry.data?.startTime)?.getTime() ?? timestampMs ?? next.sessionStartMs;\n return next;\n }\n\n const text = this.extractEventText(entry, false);\n if (!text) return next;\n\n if (!next.firstUserMessage && !state.pastHead && entry.type === \"user.message\") {\n next.firstUserMessage = text;\n }\n if (entry.type === \"user.message\" || entry.type === \"assistant.message\") {\n next.lastText = text;\n }\n return next;\n },\n skip: (state) => ({\n entryCount: state.entryCount,\n pastHead: true,\n sessionId: state.sessionId,\n projectPath: state.projectPath,\n sessionStartMs: state.sessionStartMs,\n firstUserMessage: state.firstUserMessage,\n lastText: \"\",\n }),\n };\n\n readSessionDir(sessionDir: string, fallbackSessionId: string): CopilotSession | null {\n const eventsFilePath = path.join(sessionDir, \"events.jsonl\");\n const content = safeReadFile(eventsFilePath);\n const events =\n content === undefined\n ? this.eventReducer.initial()\n : reduceJsonlContent(this.eventReducer, content);\n return this.toSession(sessionDir, fallbackSessionId, events);\n }\n\n /**\n * Same result as `readSessionDir`, but events.jsonl is summarized through a\n * per-instance incremental cache so repeated refreshes only parse appended\n * bytes. Call `pruneSessionCache()` once per refresh.\n *\n * The first read of a large events.jsonl is a bounded head + tail scan (see\n * `eventReducer.skip`); fields whose entries lie only in the skipped middle\n * fall back to their defaults instead of forcing a full parse.\n */\n readSessionDirIncremental(sessionDir: string, fallbackSessionId: string): CopilotSession | null {\n const result = this.eventCache.read(path.join(sessionDir, \"events.jsonl\"));\n return this.toSession(\n sessionDir,\n fallbackSessionId,\n result?.state ?? this.eventReducer.initial(),\n );\n }\n\n /** Evict cached event summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.eventCache.prune();\n }\n\n private toSession(\n sessionDir: string,\n fallbackSessionId: string,\n events: CopilotEventState,\n ): CopilotSession | null {\n const eventsFilePath = path.join(sessionDir, \"events.jsonl\");\n const workspace = this.readWorkspaceMetadata(path.join(sessionDir, \"workspace.yaml\"));\n if (events.entryCount === 0 && !this.hasWorkspaceMetadata(workspace)) {\n return null;\n }\n\n const fileStat = safeStat(eventsFilePath);\n const defaultStart = workspace.createdAt || fileStat?.birthtime || new Date();\n const sessionStart =\n events.sessionStartMs !== undefined ? new Date(events.sessionStartMs) : defaultStart;\n const lastActive =\n events.lastActiveMs !== undefined\n ? new Date(events.lastActiveMs)\n : workspace.updatedAt || fileStat?.mtime || defaultStart;\n\n const summary =\n events.firstUserMessage || events.lastText || workspace.name || \"Copilot session active\";\n\n return {\n sessionId: events.sessionId || workspace.id || fallbackSessionId,\n projectPath: events.projectPath || workspace.cwd || \"\",\n summary: truncate(summary, SUMMARY_MAX_LENGTH),\n sessionStart,\n lastActive,\n lastEventType: events.lastEventType,\n firstUserMessage: events.firstUserMessage,\n eventsFilePath,\n };\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n sessionFilePath,\n tail,\n {\n parseLine: (line) => {\n const entry = this.parseEventLine(line);\n return entry ? this.eventToMessage(entry, verbose) : null;\n },\n },\n String(verbose),\n );\n }\n\n const content = safeReadFile(sessionFilePath);\n if (content === undefined) return [];\n\n const messages: ConversationMessage[] = [];\n\n for (const entry of this.parseEventLines(content)) {\n const message = this.eventToMessage(entry, verbose);\n if (message) messages.push(message);\n }\n\n return messages;\n }\n\n private eventToMessage(entry: CopilotEventEntry, verbose: boolean): ConversationMessage | null {\n const role = this.roleForEvent(entry.type, verbose);\n if (!role) return null;\n\n const text = this.extractEventText(entry, verbose);\n if (!text) return null;\n\n return {\n role,\n content: text,\n timestamp: entry.timestamp,\n };\n }\n\n determineStatus(session: CopilotSession): AgentStatus {\n if (isIdle(session.lastActive)) {\n return AgentStatus.IDLE;\n }\n\n if (session.lastEventType !== undefined && WAITING_EVENTS.has(session.lastEventType)) {\n return AgentStatus.WAITING;\n }\n\n return AgentStatus.RUNNING;\n }\n\n private hasWorkspaceMetadata(workspace: CopilotWorkspace): boolean {\n return Boolean(\n workspace.id || workspace.cwd || workspace.name || workspace.createdAt || workspace.updatedAt,\n );\n }\n\n private readWorkspaceMetadata(filePath: string): CopilotWorkspace {\n const content = safeReadFile(filePath);\n if (content === undefined) return {};\n\n const values = new Map<string, string>();\n for (const rawLine of content.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n\n const key = line.slice(0, idx).trim();\n const value = this.stripYamlScalar(line.slice(idx + 1).trim());\n values.set(key, value);\n }\n\n return {\n id: values.get(\"id\"),\n cwd: values.get(\"cwd\"),\n name: values.get(\"name\"),\n createdAt: parseTimestamp(values.get(\"created_at\")) || undefined,\n updatedAt: parseTimestamp(values.get(\"updated_at\")) || undefined,\n };\n }\n\n private stripYamlScalar(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n private parseEventLines(content: string): CopilotEventEntry[] {\n const entries: CopilotEventEntry[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const entry = this.parseEventLine(line);\n if (entry) entries.push(entry);\n }\n return entries;\n }\n\n private parseEventLine(line: string): CopilotEventEntry | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n\n try {\n return JSON.parse(trimmed) as CopilotEventEntry;\n } catch {\n return null;\n }\n }\n\n private roleForEvent(\n type: string | undefined,\n verbose: boolean,\n ): ConversationMessage[\"role\"] | null {\n if (type === \"user.message\") return \"user\";\n if (type === \"assistant.message\") return \"assistant\";\n if (verbose && type !== undefined && VERBOSE_SYSTEM_EVENTS.has(type)) {\n return \"system\";\n }\n return null;\n }\n\n private extractEventText(entry: CopilotEventEntry, verbose: boolean): string {\n const data = entry.data;\n if (!data) return \"\";\n\n const raw =\n data.content ||\n data.message ||\n data.text ||\n data.result?.content ||\n data.result?.detailedContent ||\n (verbose ? data.output : \"\") ||\n \"\";\n\n if (typeof raw !== \"string\") return \"\";\n return raw.trim();\n }\n}\n"],"names":["path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","safeReadFile","safeStat","isIdle","parseTimestamp","SUMMARY_MAX_LENGTH","truncate","VERBOSE_SYSTEM_EVENTS","Set","WAITING_EVENTS","CopilotSessionParser","tailReader","eventCache","options","eventReducer","bounds","summaryBounds","initial","entryCount","firstUserMessage","lastText","reduce","state","value","undefined","next","entry","timestampMs","timestamp","getTime","lastActiveMs","type","lastEventType","sessionId","data","projectPath","context","cwd","sessionStartMs","startTime","text","extractEventText","pastHead","skip","readSessionDir","sessionDir","fallbackSessionId","eventsFilePath","join","content","events","toSession","readSessionDirIncremental","result","read","pruneSessionCache","prune","workspace","readWorkspaceMetadata","hasWorkspaceMetadata","fileStat","defaultStart","createdAt","birthtime","Date","sessionStart","lastActive","updatedAt","mtime","summary","name","id","getConversation","sessionFilePath","verbose","tail","parseLine","line","parseEventLine","eventToMessage","String","messages","parseEventLines","message","push","role","roleForEvent","determineStatus","session","IDLE","has","WAITING","RUNNING","Boolean","filePath","values","Map","rawLine","split","trim","startsWith","idx","indexOf","key","slice","stripYamlScalar","set","get","endsWith","entries","trimmed","JSON","parse","raw","detailedContent","output"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/
|
|
1
|
+
{"version":3,"file":"GeminiAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/gemini/GeminiAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGnF,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAehG,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
|