@ai-devkit/agent-manager 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +9 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -2
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +151 -3
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +485 -0
- package/dist/__tests__/capacity/claude.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +670 -0
- package/dist/__tests__/capacity/openai.test.js.map +1 -0
- package/dist/__tests__/capacity/wham.test.js +144 -0
- package/dist/__tests__/capacity/wham.test.js.map +1 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/agents.test.js +72 -2
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
- package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
- package/dist/__tests__/utils/jsonlTail.test.js +360 -0
- package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
- package/dist/__tests__/utils/matchingConstants.test.js +35 -0
- package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
- package/dist/__tests__/utils/process.test.js +436 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +25 -6
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +12 -3
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/claude.d.ts +17 -0
- package/dist/capacity/claude.d.ts.map +1 -0
- package/dist/capacity/claude.js +271 -0
- package/dist/capacity/claude.js.map +1 -0
- package/dist/capacity/codex.d.ts +1 -2
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +5 -47
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +17 -0
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/openai.d.ts +47 -0
- package/dist/capacity/openai.d.ts.map +1 -0
- package/dist/capacity/openai.js +307 -0
- package/dist/capacity/openai.js.map +1 -0
- package/dist/capacity/wham.d.ts +16 -0
- package/dist/capacity/wham.d.ts.map +1 -0
- package/dist/capacity/wham.js +66 -0
- package/dist/capacity/wham.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
- package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
- package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
- package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
- package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
- package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
- package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
- package/dist/harnesses/gemini/fileSignature.js +9 -0
- package/dist/harnesses/gemini/fileSignature.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
- package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.js +185 -0
- package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
- package/dist/harnesses/index.d.ts +7 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +27 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.js +125 -0
- package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
- package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
- package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.js +212 -0
- package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.js +318 -0
- package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/harnesses/shared.d.ts +41 -0
- package/dist/harnesses/shared.d.ts.map +1 -0
- package/dist/harnesses/shared.js +71 -0
- package/dist/harnesses/shared.js.map +1 -0
- package/dist/index.d.ts +28 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +1 -1
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +3 -1
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.js +209 -0
- package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
- package/dist/utils/agents.d.ts +3 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +61 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jsonlTail.d.ts +73 -0
- package/dist/utils/jsonlTail.d.ts.map +1 -0
- package/dist/utils/jsonlTail.js +238 -0
- package/dist/utils/jsonlTail.js.map +1 -0
- package/dist/utils/matching.d.ts +2 -0
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +3 -2
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/matchingConstants.d.ts +15 -0
- package/dist/utils/matchingConstants.d.ts.map +1 -0
- package/dist/utils/matchingConstants.js +14 -0
- package/dist/utils/matchingConstants.js.map +1 -0
- package/dist/utils/process.d.ts +38 -2
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +131 -43
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -1
- package/scripts/benchmark-cold-start.mjs +350 -0
- package/src/AgentManager.ts +26 -5
- package/src/__tests__/AgentManager.test.ts +141 -3
- package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
- package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
- package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
- package/src/__tests__/capacity/claude.test.ts +467 -0
- package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
- package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
- package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
- package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
- package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
- package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
- package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
- package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
- package/src/__tests__/capacity/openai.test.ts +560 -0
- package/src/__tests__/capacity/wham.test.ts +104 -0
- package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
- package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
- package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
- package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
- package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
- package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
- package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
- package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
- package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
- package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/agents.test.ts +83 -2
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -12
- package/src/capacity/claude.ts +313 -0
- package/src/capacity/codex.ts +25 -134
- package/src/capacity/index.ts +33 -4
- package/src/capacity/openai.ts +355 -0
- package/src/capacity/wham.ts +84 -0
- package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
- package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
- package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
- package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
- package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
- package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
- package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
- package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
- package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
- package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
- package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
- package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
- package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
- package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
- package/src/harnesses/grok/GrokSessionParser.ts +251 -0
- package/src/harnesses/index.ts +28 -0
- package/src/harnesses/kiro/KiroAdapter.ts +143 -0
- package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
- package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
- package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
- package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
- package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
- package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
- package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
- package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
- package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +34 -23
- package/src/readiness/AgentReadiness.ts +4 -1
- package/src/runtime/ManagedAgentRuntime.ts +2 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +62 -20
- package/src/utils/index.ts +2 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -10
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -10
- package/dist/adapters/index.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.js +0 -207
- package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
- package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
- package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
- package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.js +0 -181
- package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
- package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.js +0 -166
- package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
- package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
- package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionParser.js +0 -122
- package/dist/providers/grok/GrokSessionParser.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js.map +0 -1
- package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
- package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionLocator.js +0 -86
- package/dist/providers/pi/PiSessionLocator.js.map +0 -1
- package/dist/providers/pi/PiSessionParser.d.ts +0 -36
- package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionParser.js +0 -191
- package/dist/providers/pi/PiSessionParser.js.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/adapters/index.ts +0 -15
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from "vitest";
|
|
2
2
|
describe("CodexCliProbe", ()=>{
|
|
3
3
|
it("validates version, exec JSON/stdin, and resume capabilities without a model call", async ()=>{
|
|
4
|
-
const api = await import("
|
|
4
|
+
const api = await import("../../../../index.js");
|
|
5
5
|
expect(api).toHaveProperty("CodexCliProbe");
|
|
6
6
|
const exec = vi.fn().mockResolvedValueOnce({
|
|
7
7
|
stdout: "codex-cli 0.147.0",
|
|
@@ -46,7 +46,7 @@ describe("CodexCliProbe", ()=>{
|
|
|
46
46
|
]);
|
|
47
47
|
});
|
|
48
48
|
it("rejects unsupported and unavailable CLIs with bounded sanitized errors", async ()=>{
|
|
49
|
-
const api = await import("
|
|
49
|
+
const api = await import("../../../../index.js");
|
|
50
50
|
const Probe = api.CodexCliProbe;
|
|
51
51
|
const unsupported = new Probe({
|
|
52
52
|
exec: vi.fn().mockResolvedValueOnce({
|
|
@@ -87,7 +87,7 @@ describe("CodexCliProbe", ()=>{
|
|
|
87
87
|
expect(error.message.length).toBeLessThan(600);
|
|
88
88
|
});
|
|
89
89
|
it("reports an empty version response as unknown", async ()=>{
|
|
90
|
-
const api = await import("
|
|
90
|
+
const api = await import("../../../../index.js");
|
|
91
91
|
const Probe = api.CodexCliProbe;
|
|
92
92
|
const exec = vi.fn().mockResolvedValueOnce({
|
|
93
93
|
stdout: " \n",
|
|
@@ -106,7 +106,7 @@ describe("CodexCliProbe", ()=>{
|
|
|
106
106
|
});
|
|
107
107
|
});
|
|
108
108
|
it("requires a standalone stdin dash rather than accepting flag hyphens", async ()=>{
|
|
109
|
-
const api = await import("
|
|
109
|
+
const api = await import("../../../../index.js");
|
|
110
110
|
const Probe = api.CodexCliProbe;
|
|
111
111
|
const exec = vi.fn().mockResolvedValueOnce({
|
|
112
112
|
stdout: "version",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\n\ndescribe(\"CodexCliProbe\", () => {\n it(\"validates version, exec JSON/stdin, and resume capabilities without a model call\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexCliProbe\");\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"codex-cli 0.147.0\", stderr: \"\" })\n .mockResolvedValueOnce({\n stdout: \"Usage: codex exec [PROMPT]\\n--json\\n- read from stdin\\nresume\",\n stderr: \"\",\n })\n .mockResolvedValueOnce({\n stdout: \"Usage: codex exec resume [SESSION_ID] [PROMPT]\\n--json\\n- stdin\",\n stderr: \"\",\n });\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n\n await expect(new Probe({ executable: \"fake-codex\", exec }).validate()).resolves.toEqual({\n executable: \"fake-codex\",\n version: \"codex-cli 0.147.0\",\n });\n expect(exec.mock.calls).toEqual([\n [\"fake-codex\", [\"--version\"]],\n [\"fake-codex\", [\"exec\", \"--help\"]],\n [\"fake-codex\", [\"exec\", \"resume\", \"--help\"]],\n ]);\n });\n\n it(\"rejects unsupported and unavailable CLIs with bounded sanitized errors\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const unsupported = new Probe({\n exec: vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume\", stderr: \"\" }),\n });\n await expect(unsupported.validate()).rejects.toMatchObject({ code: \"CODEX_CLI_UNSUPPORTED\" });\n const missingCommands = new Probe({\n exec: vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"\", stderr: \"\" }),\n });\n await expect(missingCommands.validate()).rejects.toMatchObject({\n code: \"CODEX_CLI_UNSUPPORTED\",\n });\n\n const unavailable = new Probe({\n exec: vi.fn().mockRejectedValue(new Error(`bad\\0${\"x\".repeat(1000)}`)),\n });\n const error = await unavailable.validate().catch((value: Error & { code: string }) => value);\n expect(error.code).toBe(\"CODEX_CLI_UNAVAILABLE\");\n expect(error.message).not.toContain(\"\\0\");\n expect(error.message.length).toBeLessThan(600);\n });\n\n it(\"reports an empty version response as unknown\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \" \\n\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec --json -\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume --json -\", stderr: \"\" });\n await expect(new Probe({ exec }).validate()).resolves.toMatchObject({ version: \"unknown\" });\n });\n\n it(\"requires a standalone stdin dash rather than accepting flag hyphens\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec --json\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume --json\", stderr: \"\" });\n await expect(new Probe({ exec }).validate()).rejects.toMatchObject({\n code: \"CODEX_CLI_UNSUPPORTED\",\n });\n });\n});\n"],"names":["describe","expect","it","vi","api","toHaveProperty","exec","fn","mockResolvedValueOnce","stdout","stderr","Probe","CodexCliProbe","executable","validate","resolves","toEqual","version","mock","calls","unsupported","rejects","toMatchObject","code","missingCommands","unavailable","mockRejectedValue","Error","repeat","error","catch","value","toBe","message","not","toContain","length","toBeLessThan"],"mappings":"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"}
|
package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js
RENAMED
|
@@ -2,7 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { afterEach, describe, expect, it } from "vitest";
|
|
5
|
-
import { DurableAgentRepository } from "
|
|
5
|
+
import { DurableAgentRepository } from "../../../../durable/DurableAgentRepository.js";
|
|
6
6
|
const SESSION = "22222222-2222-4222-8222-222222222222";
|
|
7
7
|
const OTHER_SESSION = "33333333-3333-4333-8333-333333333333";
|
|
8
8
|
const roots = [];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { DurableAgentRepository } from \"../../../../durable/DurableAgentRepository.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst OTHER_SESSION = \"33333333-3333-4333-8333-333333333333\";\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction fixture() {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-durable-repository-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: \"owner-start\" }) };\n return {\n cwd,\n repository: new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n }),\n };\n}\n\ndescribe(\"Codex durable-agent repository binding\", () => {\n it(\"creates Codex agents unbound and binds during the owned run\", async () => {\n const { cwd, repository } = fixture();\n const agent = await repository.create({ name: \"reviewer\", cwd, provider: \"codex\" });\n expect(agent).toMatchObject({ provider: \"codex\", mode: \"durable\", providerSessionId: null });\n\n const run = await repository.acquireRun(agent.id);\n const bound = await repository.bindProviderSession(agent.id, run.token, SESSION);\n expect(bound.providerSessionId).toBe(SESSION);\n await expect(\n repository.bindProviderSession(agent.id, run.token, SESSION),\n ).resolves.toMatchObject({ providerSessionId: SESSION });\n });\n\n it(\"rejects invalid, stale, replacement, and duplicate bindings\", async () => {\n const { cwd, repository } = fixture();\n const first = await repository.create({ name: \"first\", cwd, provider: \"codex\" });\n const second = await repository.create({ name: \"second\", cwd, provider: \"codex\" });\n const firstRun = await repository.acquireRun(first.id);\n const secondRun = await repository.acquireRun(second.id);\n\n await expect(repository.bindProviderSession(first.id, \"stale\", SESSION)).rejects.toMatchObject({\n code: \"DURABLE_AGENT_REPOSITORY\",\n });\n await expect(\n repository.bindProviderSession(first.id, firstRun.token, \"invalid\"),\n ).rejects.toMatchObject({ code: \"DURABLE_AGENT_REPOSITORY\" });\n await repository.bindProviderSession(first.id, firstRun.token, SESSION);\n await expect(\n repository.bindProviderSession(first.id, firstRun.token, OTHER_SESSION),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n await expect(\n repository.bindProviderSession(second.id, secondRun.token, SESSION),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","DurableAgentRepository","SESSION","OTHER_SESSION","roots","root","splice","rmSync","recursive","force","fixture","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","agent","create","name","provider","toMatchObject","mode","providerSessionId","run","acquireRun","id","bound","bindProviderSession","token","toBe","resolves","first","second","firstRun","secondRun","rejects","code"],"mappings":"AAAA,OAAOA,QAAQ,UAAU;AACzB,OAAOC,QAAQ,UAAU;AACzB,OAAOC,UAAU,YAAY;AAC7B,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AACzD,SAASC,sBAAsB,QAAQ,gDAAgD;AAEvF,MAAMC,UAAU;AAChB,MAAMC,gBAAgB;AACtB,MAAMC,QAAkB,EAAE;AAE1BP,UAAU;IACR,KAAK,MAAMQ,QAAQD,MAAME,MAAM,CAAC,GAAIZ,GAAGa,MAAM,CAACF,MAAM;QAAEG,WAAW;QAAMC,OAAO;IAAK;AACrF;AAEA,SAASC;IACP,MAAML,OAAOX,GAAGiB,WAAW,CAACf,KAAKgB,IAAI,CAACjB,GAAGkB,MAAM,IAAI;IACnDT,MAAMU,IAAI,CAACT;IACX,MAAMU,MAAMnB,KAAKgB,IAAI,CAACP,MAAM;IAC5BX,GAAGsB,SAAS,CAACD;IACb,MAAME,mBAAmB;QAAEC,aAAa,CAACC,MAAiB,CAAA;gBAAEA;gBAAKC,WAAW;YAAc,CAAA;IAAG;IAC7F,OAAO;QACLL;QACAM,YAAY,IAAIpB,uBAAuB;YACrCqB,QAAQ1B,KAAKgB,IAAI,CAACP,MAAM;YACxBY;QACF;IACF;AACF;AAEAnB,SAAS,0CAA0C;IACjDE,GAAG,+DAA+D;QAChE,MAAM,EAAEe,GAAG,EAAEM,UAAU,EAAE,GAAGX;QAC5B,MAAMa,QAAQ,MAAMF,WAAWG,MAAM,CAAC;YAAEC,MAAM;YAAYV;YAAKW,UAAU;QAAQ;QACjF3B,OAAOwB,OAAOI,aAAa,CAAC;YAAED,UAAU;YAASE,MAAM;YAAWC,mBAAmB;QAAK;QAE1F,MAAMC,MAAM,MAAMT,WAAWU,UAAU,CAACR,MAAMS,EAAE;QAChD,MAAMC,QAAQ,MAAMZ,WAAWa,mBAAmB,CAACX,MAAMS,EAAE,EAAEF,IAAIK,KAAK,EAAEjC;QACxEH,OAAOkC,MAAMJ,iBAAiB,EAAEO,IAAI,CAAClC;QACrC,MAAMH,OACJsB,WAAWa,mBAAmB,CAACX,MAAMS,EAAE,EAAEF,IAAIK,KAAK,EAAEjC,UACpDmC,QAAQ,CAACV,aAAa,CAAC;YAAEE,mBAAmB3B;QAAQ;IACxD;IAEAF,GAAG,+DAA+D;QAChE,MAAM,EAAEe,GAAG,EAAEM,UAAU,EAAE,GAAGX;QAC5B,MAAM4B,QAAQ,MAAMjB,WAAWG,MAAM,CAAC;YAAEC,MAAM;YAASV;YAAKW,UAAU;QAAQ;QAC9E,MAAMa,SAAS,MAAMlB,WAAWG,MAAM,CAAC;YAAEC,MAAM;YAAUV;YAAKW,UAAU;QAAQ;QAChF,MAAMc,WAAW,MAAMnB,WAAWU,UAAU,CAACO,MAAMN,EAAE;QACrD,MAAMS,YAAY,MAAMpB,WAAWU,UAAU,CAACQ,OAAOP,EAAE;QAEvD,MAAMjC,OAAOsB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAE,SAAS9B,UAAUwC,OAAO,CAACf,aAAa,CAAC;YAC7FgB,MAAM;QACR;QACA,MAAM5C,OACJsB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAEQ,SAASL,KAAK,EAAE,YACzDO,OAAO,CAACf,aAAa,CAAC;YAAEgB,MAAM;QAA2B;QAC3D,MAAMtB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAEQ,SAASL,KAAK,EAAEjC;QAC/D,MAAMH,OACJsB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAEQ,SAASL,KAAK,EAAEhC,gBACzDuC,OAAO,CAACf,aAAa,CAAC;YAAEgB,MAAM;QAAyB;QACzD,MAAM5C,OACJsB,WAAWa,mBAAmB,CAACK,OAAOP,EAAE,EAAES,UAAUN,KAAK,EAAEjC,UAC3DwC,OAAO,CAACf,aAAa,CAAC;YAAEgB,MAAM;QAAyB;IAC3D;AACF"}
|
package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js
RENAMED
|
@@ -2,7 +2,7 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
5
|
-
import { CodexPrintError, CodexPrintAgentService, DurableAgentRepository } from "
|
|
5
|
+
import { CodexPrintError, CodexPrintAgentService, DurableAgentRepository } from "../../../../index.js";
|
|
6
6
|
const SESSION = "22222222-2222-4222-8222-222222222222";
|
|
7
7
|
const roots = [];
|
|
8
8
|
afterEach(()=>{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n CodexPrintError,\n CodexPrintAgentService,\n DurableAgentRepository,\n type ProcessInspector,\n} from \"../../../../index.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\ndescribe(\"Codex print-agent fake-provider journey\", () => {\n it(\"creates unbound, then binds and explicitly resumes the provider-minted session\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-print-integration-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n await request.onSession(SESSION);\n return {\n sessionId: SESSION,\n result: `answer:${request.prompt}`,\n messages: [`answer:${request.prompt}`],\n exitCode: 0,\n };\n }),\n };\n const service = new CodexPrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n\n const created = await service.create({ name: \"reviewer\", cwd });\n expect(created).toMatchObject({\n provider: \"codex\",\n providerSessionId: null,\n sessionHealth: \"uninitialized\",\n });\n\n const first = await service.send(created.id, \"first secret\");\n expect(first).toMatchObject({ result: \"answer:first secret\" });\n const bound = await repository.getById(created.id);\n expect(bound?.providerSessionId).toBe(first.sessionId);\n await expect(service.send(created.id, \"follow up\")).resolves.toMatchObject({\n result: \"answer:follow up\",\n });\n\n expect(runner.run.mock.calls[0][0].agent).toMatchObject({ providerSessionId: null });\n expect(runner.run.mock.calls[1][0].agent).toMatchObject({ providerSessionId: SESSION });\n });\n\n it(\"retains a first-run binding when the provider fails after thread start\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-print-bind-failure-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n await request.onSession(SESSION);\n throw new CodexPrintError(\"Codex print run failed.\", \"CODEX_PROCESS\");\n }),\n };\n const service = new CodexPrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n const created = await service.create({ name: \"reviewer\", cwd });\n\n await expect(service.send(created.id, \"secret\")).rejects.toMatchObject({\n code: \"CODEX_PROCESS\",\n });\n expect(await repository.getById(created.id)).toMatchObject({\n providerSessionId: SESSION,\n state: \"degraded\",\n sessionHealth: \"unknown\",\n });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","vi","CodexPrintError","CodexPrintAgentService","DurableAgentRepository","SESSION","roots","root","splice","rmSync","recursive","force","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","runner","run","fn","mockImplementation","request","onSpawn","onSession","sessionId","result","prompt","messages","exitCode","service","probe","validate","created","create","name","toMatchObject","provider","providerSessionId","sessionHealth","first","send","id","bound","getById","toBe","resolves","mock","calls","agent","rejects","code","state"],"mappings":"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"}
|
|
@@ -8,13 +8,8 @@ const base = {
|
|
|
8
8
|
sessionHealth: "uninitialized"
|
|
9
9
|
};
|
|
10
10
|
describe("CodexPrintAgentService", ()=>{
|
|
11
|
-
it("constructs default non-billable dependencies without invoking them", async ()=>{
|
|
12
|
-
const api = await import("../../index.js");
|
|
13
|
-
const Service = api.CodexPrintAgentService;
|
|
14
|
-
expect(new Service().repository).toBeDefined();
|
|
15
|
-
});
|
|
16
11
|
it("validates before provider-aware create and never runs Codex", async ()=>{
|
|
17
|
-
const api = await import("
|
|
12
|
+
const api = await import("../../../../index.js");
|
|
18
13
|
expect(api).toHaveProperty("CodexPrintAgentService");
|
|
19
14
|
const probe = {
|
|
20
15
|
validate: vi.fn().mockResolvedValue({
|
|
@@ -23,8 +18,7 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
23
18
|
})
|
|
24
19
|
};
|
|
25
20
|
const repository = {
|
|
26
|
-
create: vi.fn().mockResolvedValue(base)
|
|
27
|
-
list: vi.fn()
|
|
21
|
+
create: vi.fn().mockResolvedValue(base)
|
|
28
22
|
};
|
|
29
23
|
const runner = {
|
|
30
24
|
run: vi.fn()
|
|
@@ -46,9 +40,8 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
46
40
|
expect(runner.run).not.toHaveBeenCalled();
|
|
47
41
|
});
|
|
48
42
|
it("binds during first send and explicitly resumes later sends", async ()=>{
|
|
49
|
-
const api = await import("
|
|
43
|
+
const api = await import("../../../../index.js");
|
|
50
44
|
const repository = {
|
|
51
|
-
list: vi.fn(),
|
|
52
45
|
resolve: vi.fn().mockResolvedValue(base),
|
|
53
46
|
acquireRun: vi.fn().mockResolvedValueOnce({
|
|
54
47
|
agent: base,
|
|
@@ -101,11 +94,10 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
101
94
|
}));
|
|
102
95
|
});
|
|
103
96
|
it("records mismatch separately from unknown failures", async ()=>{
|
|
104
|
-
const api = await import("
|
|
97
|
+
const api = await import("../../../../index.js");
|
|
105
98
|
const ErrorType = api.CodexPrintError;
|
|
106
99
|
const completeRun = vi.fn();
|
|
107
100
|
const repository = {
|
|
108
|
-
list: vi.fn(),
|
|
109
101
|
resolve: vi.fn().mockResolvedValue(base),
|
|
110
102
|
acquireRun: vi.fn().mockResolvedValue({
|
|
111
103
|
agent: base,
|
|
@@ -133,7 +125,7 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
133
125
|
}));
|
|
134
126
|
});
|
|
135
127
|
it("rejects a non-Codex target without acquiring or mutating it", async ()=>{
|
|
136
|
-
const api = await import("
|
|
128
|
+
const api = await import("../../../../index.js");
|
|
137
129
|
const Service = api.CodexPrintAgentService;
|
|
138
130
|
const repository = {
|
|
139
131
|
resolve: vi.fn().mockResolvedValue({
|
|
@@ -160,7 +152,7 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
160
152
|
expect(repository.completeRun).not.toHaveBeenCalled();
|
|
161
153
|
});
|
|
162
154
|
it("does not turn a successful completion write failure into a second completion", async ()=>{
|
|
163
|
-
const api = await import("
|
|
155
|
+
const api = await import("../../../../index.js");
|
|
164
156
|
const Service = api.CodexPrintAgentService;
|
|
165
157
|
const completionFailure = new Error("completion failed");
|
|
166
158
|
const repository = {
|
|
@@ -193,11 +185,10 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
193
185
|
expect(repository.completeRun).toHaveBeenCalledOnce();
|
|
194
186
|
});
|
|
195
187
|
it("records a repository binding conflict as a session mismatch", async ()=>{
|
|
196
|
-
const api = await import("
|
|
188
|
+
const api = await import("../../../../index.js");
|
|
197
189
|
const BindingError = api.CodexPrintError;
|
|
198
190
|
const completeRun = vi.fn();
|
|
199
191
|
const repository = {
|
|
200
|
-
list: vi.fn(),
|
|
201
192
|
resolve: vi.fn().mockResolvedValue(base),
|
|
202
193
|
acquireRun: vi.fn().mockResolvedValue({
|
|
203
194
|
agent: base,
|
|
@@ -235,10 +226,9 @@ describe("CodexPrintAgentService", ()=>{
|
|
|
235
226
|
}));
|
|
236
227
|
});
|
|
237
228
|
it("rejects missing and ambiguous records before acquiring a run", async ()=>{
|
|
238
|
-
const api = await import("
|
|
229
|
+
const api = await import("../../../../index.js");
|
|
239
230
|
const Service = api.CodexPrintAgentService;
|
|
240
231
|
const repository = {
|
|
241
|
-
list: vi.fn(),
|
|
242
232
|
create: vi.fn(),
|
|
243
233
|
resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([
|
|
244
234
|
base,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst base = {\n id: \"id\",\n name: \"reviewer\",\n provider: \"codex\",\n providerSessionId: null,\n sessionHealth: \"uninitialized\",\n};\n\ndescribe(\"CodexPrintAgentService\", () => {\n it(\"validates before provider-aware create and never runs Codex\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexPrintAgentService\");\n const probe = {\n validate: vi.fn().mockResolvedValue({ executable: \"codex\", version: \"0.147.0\" }),\n };\n const repository = { create: vi.fn().mockResolvedValue(base) };\n const runner = { run: vi.fn() };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n await new Service({ repository, probe, runner }).create({ name: \"reviewer\", cwd: \"/project\" });\n expect(repository.create).toHaveBeenCalledWith({\n name: \"reviewer\",\n cwd: \"/project\",\n provider: \"codex\",\n });\n expect(runner.run).not.toHaveBeenCalled();\n });\n\n it(\"binds during first send and explicitly resumes later sends\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi\n .fn()\n .mockResolvedValueOnce({ agent: base, token: \"one\" })\n .mockResolvedValueOnce({\n agent: { ...base, providerSessionId: SESSION, sessionHealth: \"healthy\" },\n token: \"two\",\n }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"start\" });\n await request.onSession(SESSION);\n return { sessionId: SESSION, result: \"answer\", messages: [\"answer\"], exitCode: 0 };\n }),\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner,\n executable: \"fake-codex\",\n });\n\n await service.send(\"reviewer\", \"first\");\n await service.send(\"reviewer\", \"later\");\n\n expect(repository.bindProviderSession).toHaveBeenNthCalledWith(1, \"id\", \"one\", SESSION);\n expect(repository.bindProviderSession).toHaveBeenNthCalledWith(2, \"id\", \"two\", SESSION);\n expect(repository.completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({\n status: \"succeeded\",\n sessionHealth: \"healthy\",\n }),\n );\n });\n\n it(\"records mismatch separately from unknown failures\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const ErrorType = api.CodexPrintError as new (message: string, code: string) => Error;\n const completeRun = vi.fn();\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun,\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner: {\n run: vi.fn().mockRejectedValue(new ErrorType(\"mismatch\", \"CODEX_SESSION_MISMATCH\")),\n },\n });\n await expect(service.send(\"reviewer\", \"x\")).rejects.toMatchObject({\n code: \"CODEX_SESSION_MISMATCH\",\n });\n expect(completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({ sessionHealth: \"mismatch\" }),\n );\n });\n\n it(\"rejects a non-Codex target without acquiring or mutating it\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const repository = {\n resolve: vi.fn().mockResolvedValue({ ...base, provider: \"claude\" }),\n acquireRun: vi.fn(),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner: { run: vi.fn() } }).send(\n \"reviewer\",\n \"x\",\n ),\n ).rejects.toMatchObject({ code: \"CODEX_UNSUPPORTED\" });\n expect(repository.acquireRun).not.toHaveBeenCalled();\n expect(repository.completeRun).not.toHaveBeenCalled();\n });\n\n it(\"does not turn a successful completion write failure into a second completion\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const completionFailure = new Error(\"completion failed\");\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn().mockRejectedValue(completionFailure),\n };\n const runner = {\n run: vi.fn().mockResolvedValue({\n sessionId: SESSION,\n result: \"answer\",\n messages: [\"answer\"],\n exitCode: 0,\n }),\n };\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner }).send(\"reviewer\", \"x\"),\n ).rejects.toBe(completionFailure);\n expect(repository.completeRun).toHaveBeenCalledOnce();\n });\n\n it(\"records a repository binding conflict as a session mismatch\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const BindingError = api.CodexPrintError as new (message: string, code: string) => Error;\n const completeRun = vi.fn();\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi\n .fn()\n .mockRejectedValue(new BindingError(\"binding mismatch\", \"CODEX_SESSION_MISMATCH\")),\n completeRun,\n };\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSession(SESSION);\n return { sessionId: SESSION, result: \"x\", messages: [\"x\"], exitCode: 0 };\n }),\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner }).send(\"reviewer\", \"x\"),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n expect(completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({ sessionHealth: \"mismatch\" }),\n );\n });\n\n it(\"rejects missing and ambiguous records before acquiring a run\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const repository = {\n create: vi.fn(),\n resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([base, base]),\n acquireRun: vi.fn(),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner: { run: vi.fn() },\n });\n await expect(service.send(\"missing\", \"x\")).rejects.toMatchObject({\n code: \"DURABLE_AGENT_NOT_FOUND\",\n });\n await expect(service.send(\"ambiguous\", \"x\")).rejects.toMatchObject({\n code: \"CODEX_UNSUPPORTED\",\n });\n expect(repository.acquireRun).not.toHaveBeenCalled();\n });\n});\n"],"names":["describe","expect","it","vi","SESSION","base","id","name","provider","providerSessionId","sessionHealth","api","toHaveProperty","probe","validate","fn","mockResolvedValue","executable","version","repository","create","runner","run","Service","CodexPrintAgentService","cwd","toHaveBeenCalledWith","not","toHaveBeenCalled","resolve","acquireRun","mockResolvedValueOnce","agent","token","recordProviderProcess","bindProviderSession","completeRun","mockImplementation","request","onSpawn","pid","startedAt","onSession","sessionId","result","messages","exitCode","service","send","toHaveBeenNthCalledWith","objectContaining","status","ErrorType","CodexPrintError","mockRejectedValue","rejects","toMatchObject","code","completionFailure","Error","toBe","toHaveBeenCalledOnce","BindingError"],"mappings":"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"}
|
|
@@ -84,7 +84,7 @@ function events(session = SESSION) {
|
|
|
84
84
|
];
|
|
85
85
|
}
|
|
86
86
|
async function runner(fixture, maxLineBytes) {
|
|
87
|
-
const api = await import("
|
|
87
|
+
const api = await import("../../../../index.js");
|
|
88
88
|
expect(api).toHaveProperty("CodexPrintRunner");
|
|
89
89
|
const Runner = api.CodexPrintRunner;
|
|
90
90
|
return new Runner({
|
|
@@ -99,11 +99,6 @@ async function runner(fixture, maxLineBytes) {
|
|
|
99
99
|
});
|
|
100
100
|
}
|
|
101
101
|
describe("CodexPrintRunner", ()=>{
|
|
102
|
-
it("constructs default process dependencies without spawning", async ()=>{
|
|
103
|
-
const api = await import("../../index.js");
|
|
104
|
-
const Runner = api.CodexPrintRunner;
|
|
105
|
-
expect(new Runner()).toBeDefined();
|
|
106
|
-
});
|
|
107
102
|
it("binds an initial thread before returning ordered assistant output", async ()=>{
|
|
108
103
|
const fixture = fakeSpawn(events(), 0, true);
|
|
109
104
|
const instance = await runner(fixture);
|
|
@@ -349,7 +344,7 @@ describe("CodexPrintRunner", ()=>{
|
|
|
349
344
|
expect(spawnFailure.child.kill).toHaveBeenCalledOnce();
|
|
350
345
|
});
|
|
351
346
|
it("rejects an unverifiable positive PID", async ()=>{
|
|
352
|
-
const api = await import("
|
|
347
|
+
const api = await import("../../../../index.js");
|
|
353
348
|
const fixture = fakeSpawn([]);
|
|
354
349
|
const Runner = api.CodexPrintRunner;
|
|
355
350
|
const instance = new Runner({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { PassThrough, Writable } from \"node:stream\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport type { CodexDurableAgent } from \"../../../../index.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\n\nfunction agent(providerSessionId: string | null = null): CodexDurableAgent {\n return {\n id: \"11111111-1111-4111-8111-111111111111\",\n name: \"reviewer\",\n provider: \"codex\",\n mode: \"durable\",\n cwd: \"/project\",\n providerSessionId,\n state: \"running\",\n sessionHealth: \"uninitialized\",\n createdAt: \"\",\n updatedAt: \"\",\n lastActiveAt: null,\n lastResult: null,\n activeRun: null,\n };\n}\n\nfunction fakeSpawn(lines: string[], exitCode = 0, chunks = false) {\n const promptChunks: Buffer[] = [];\n const child = new EventEmitter() as any;\n child.pid = 4242;\n child.stdout = new PassThrough();\n child.stderr = new PassThrough();\n child.kill = vi.fn();\n child.stdin = new Writable({\n write(chunk, _encoding, callback) {\n promptChunks.push(Buffer.from(chunk));\n callback();\n },\n final(callback) {\n const output = lines.join(\"\\n\");\n if (chunks) {\n const bytes = Buffer.from(output);\n child.stdout.write(bytes.subarray(0, 7));\n child.stdout.write(bytes.subarray(7));\n } else child.stdout.write(output);\n child.stdout.end();\n queueMicrotask(() => child.emit(\"close\", exitCode, null));\n callback();\n },\n });\n const spawn = vi.fn(() => child);\n return { child, spawn, promptChunks };\n}\n\nfunction events(session = SESSION): string[] {\n return [\n JSON.stringify({ type: \"thread.started\", thread_id: session }),\n JSON.stringify({ type: \"turn.started\" }),\n JSON.stringify({ type: \"future.event\", anything: true }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"first\" } }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"final\" } }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ];\n}\n\nasync function runner(fixture: ReturnType<typeof fakeSpawn>, maxLineBytes?: number) {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexPrintRunner\");\n const Runner = api.CodexPrintRunner as new (options: unknown) => any;\n return new Runner({\n spawn: fixture.spawn,\n maxLineBytes,\n processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: \"provider-start\" }),\n },\n });\n}\n\ndescribe(\"CodexPrintRunner\", () => {\n it(\"binds an initial thread before returning ordered assistant output\", async () => {\n const fixture = fakeSpawn(events(), 0, true);\n const instance = await runner(fixture);\n const order: string[] = [];\n const result = await instance.run({\n agent: agent(),\n prompt: \"secret prompt\",\n executable: \"fake-codex\",\n onSpawn: async () => {\n expect(fixture.promptChunks).toHaveLength(0);\n order.push(\"spawn\");\n },\n onSession: async (id: string) => {\n expect(id).toBe(SESSION);\n order.push(\"session\");\n },\n });\n\n expect(order).toEqual([\"spawn\", \"session\"]);\n expect(fixture.spawn).toHaveBeenCalledWith(\n \"fake-codex\",\n [\"exec\", \"--json\", \"-\"],\n expect.objectContaining({\n cwd: \"/project\",\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }),\n );\n expect(JSON.stringify(fixture.spawn.mock.calls)).not.toContain(\"secret prompt\");\n expect(Buffer.concat(fixture.promptChunks).toString()).toBe(\"secret prompt\");\n expect(result).toEqual({\n sessionId: SESSION,\n result: \"final\",\n messages: [\"first\", \"final\"],\n exitCode: 0,\n });\n });\n\n it(\"resumes the exact stored UUID and rejects a mismatch\", async () => {\n const mismatch = \"33333333-3333-4333-8333-333333333333\";\n const fixture = fakeSpawn(events(mismatch));\n const instance = await runner(fixture);\n await expect(\n instance.run({\n agent: agent(SESSION),\n prompt: \"later\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n expect(fixture.spawn.mock.calls[0]![1]).toEqual([\"exec\", \"resume\", \"--json\", SESSION, \"-\"]);\n });\n\n it.each([\n [\"malformed JSON\", [\"{bad\\n\"], \"CODEX_PROTOCOL\"],\n [\"non-object JSON\", [\"[]\\n\"], \"CODEX_PROTOCOL\"],\n [\"truncated JSON\", [\"{}\"], \"CODEX_PROTOCOL\"],\n [\n \"missing thread\",\n [\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"x\" } }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ],\n \"CODEX_PROTOCOL\",\n ],\n [\n \"missing assistant\",\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ],\n \"CODEX_RESULT_MISSING\",\n ],\n [\n \"missing completion\",\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"x\" } }),\n \"\",\n ],\n \"CODEX_PROTOCOL\",\n ],\n ])(\"rejects %s\", async (_name, lines, code) => {\n const fixture = fakeSpawn(lines as string[]);\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code });\n });\n\n it(\"rejects oversized output, non-zero exit, and missing process identity without leaking stderr\", async () => {\n const oversized = fakeSpawn([`${\"x\".repeat(20)}\\n`]);\n await expect(\n (await runner(oversized, 10)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n const oversizedWithoutNewline = fakeSpawn([\"x\".repeat(20)]);\n await expect(\n (await runner(oversizedWithoutNewline, 10)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n\n const failed = fakeSpawn(events(), 1);\n failed.child.stderr.end(\"secret-looking provider diagnostic\");\n await expect(\n (await runner(failed)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n\n const missing = fakeSpawn([]);\n missing.child.pid = undefined;\n await expect(\n (await runner(missing)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n });\n\n it(\"rejects invalid or duplicate thread identities\", async () => {\n for (const lines of [\n [JSON.stringify({ type: \"thread.started\", thread_id: \"bad\" }), \"\"],\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n \"\",\n ],\n ]) {\n const fixture = fakeSpawn(lines);\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n }\n });\n\n it(\"classifies callback processing failure and kills when spawn persistence fails\", async () => {\n const callbackFailure = fakeSpawn(events());\n await expect(\n (await runner(callbackFailure)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn().mockRejectedValue(new Error(\"storage unavailable\")),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n\n const spawnFailure = fakeSpawn([]);\n const failure = new Error(\"cannot persist process\");\n await expect(\n (await runner(spawnFailure)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn().mockRejectedValue(failure),\n onSession: vi.fn(),\n }),\n ).rejects.toBe(failure);\n expect(spawnFailure.child.kill).toHaveBeenCalledOnce();\n });\n\n it(\"rejects an unverifiable positive PID\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const fixture = fakeSpawn([]);\n const Runner = api.CodexPrintRunner as new (options: unknown) => any;\n const instance = new Runner({\n spawn: fixture.spawn,\n processInspector: { getIdentity: () => null },\n });\n await expect(\n instance.run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n expect(fixture.child.kill).toHaveBeenCalledOnce();\n });\n\n it(\"classifies a child spawn error as a process failure\", async () => {\n const fixture = fakeSpawn([]);\n fixture.child.stdin = new Writable({\n write(_chunk, _encoding, callback) {\n callback();\n },\n final(callback) {\n queueMicrotask(() => fixture.child.emit(\"error\", new Error(\"spawn failed\")));\n callback();\n },\n });\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n });\n});\n"],"names":["EventEmitter","PassThrough","Writable","describe","expect","it","vi","SESSION","agent","providerSessionId","id","name","provider","mode","cwd","state","sessionHealth","createdAt","updatedAt","lastActiveAt","lastResult","activeRun","fakeSpawn","lines","exitCode","chunks","promptChunks","child","pid","stdout","stderr","kill","fn","stdin","write","chunk","_encoding","callback","push","Buffer","from","final","output","join","bytes","subarray","end","queueMicrotask","emit","spawn","events","session","JSON","stringify","type","thread_id","anything","item","text","runner","fixture","maxLineBytes","api","toHaveProperty","Runner","CodexPrintRunner","processInspector","getIdentity","startedAt","instance","order","result","run","prompt","executable","onSpawn","toHaveLength","onSession","toBe","toEqual","toHaveBeenCalledWith","objectContaining","shell","stdio","mock","calls","not","toContain","concat","toString","sessionId","messages","mismatch","rejects","toMatchObject","code","each","_name","oversized","repeat","oversizedWithoutNewline","failed","missing","undefined","callbackFailure","mockRejectedValue","Error","spawnFailure","failure","toHaveBeenCalledOnce","_chunk"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/ import * as fs from "fs";
|
|
4
4
|
import * as os from "os";
|
|
5
5
|
import * as path from "path";
|
|
6
|
-
import { CopilotAdapter } from "../../../
|
|
6
|
+
import { CopilotAdapter } from "../../../harnesses/copilot/CopilotAdapter.js";
|
|
7
7
|
import { AgentStatus } from "../../../adapters/AgentAdapter.js";
|
|
8
8
|
import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from "../../../utils/process.js";
|
|
9
9
|
import { generateAgentName } from "../../../utils/matching.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/__tests__/providers/copilot/CopilotAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CopilotAdapter\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CopilotAdapter } from \"../../../providers/copilot/CopilotAdapter.js\";\nimport type { ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../../utils/process.js\";\nimport { generateAgentName } from \"../../../utils/matching.js\";\nimport { AgentRegistry } from \"../../../utils/AgentRegistry.js\";\n\nvi.mock(\"../../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../../utils/matching.js\", () => ({\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CopilotAdapter\", () => {\n let adapter: CopilotAdapter;\n let tmpDir: string;\n let sessionStateDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilot-test-\"));\n sessionStateDir = path.join(tmpDir, \"session-state\");\n fs.mkdirSync(sessionStateDir, { recursive: true });\n adapter = new CopilotAdapter(undefined, { sessionStateDir });\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeSession(\n sessionId: string,\n options: {\n events?: Array<object | string>;\n workspace?: Record<string, string>;\n lockPid?: number | string;\n },\n ): string {\n const sessionDir = path.join(sessionStateDir, sessionId);\n fs.mkdirSync(sessionDir, { recursive: true });\n\n if (options.events) {\n const lines = options.events.map((entry) =>\n typeof entry === \"string\" ? entry : JSON.stringify(entry),\n );\n fs.writeFileSync(path.join(sessionDir, \"events.jsonl\"), lines.join(\"\\n\"));\n }\n\n if (options.workspace) {\n const lines = Object.entries(options.workspace).map(([key, value]) => `${key}: ${value}`);\n fs.writeFileSync(path.join(sessionDir, \"workspace.yaml\"), lines.join(\"\\n\"));\n }\n\n if (options.lockPid !== undefined) {\n fs.writeFileSync(path.join(sessionDir, `inuse.${options.lockPid}.lock`), \"\");\n }\n\n return sessionDir;\n }\n\n function sessionStart(\n sessionId: string,\n cwd: string,\n startTime = \"2026-06-09T09:50:00.000Z\",\n ): object {\n return {\n type: \"session.start\",\n data: {\n sessionId,\n startTime,\n context: {\n cwd,\n gitRoot: cwd,\n branch: \"main\",\n },\n },\n timestamp: startTime,\n };\n }\n\n describe(\"initialization\", () => {\n it(\"exposes copilot type\", () => {\n expect(adapter.type).toBe(\"copilot\");\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"returns true for copilot commands\", () => {\n expect(adapter.canHandle({ pid: 1, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n });\n\n it(\"returns true for full-path Homebrew copilot commands\", () => {\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n });\n\n it(\"returns true for copilot.exe commands\", () => {\n expect(\n adapter.canHandle({\n pid: 3,\n command: \"/usr/bin/copilot.exe\",\n cwd: \"/repo\",\n tty: \"ttys003\",\n }),\n ).toBe(true);\n });\n\n it(\"returns false when copilot appears only in an argument\", () => {\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /repo/copilot-plugin/index.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"returns empty list when no copilot process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"copilot\");\n });\n\n it(\"maps matching inuse lock and events to an active agent\", async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-a\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-a\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"Build the Copilot adapter\" },\n timestamp: new Date().toISOString(),\n },\n {\n type: \"assistant.message\",\n data: { content: \"I will inspect the code.\" },\n timestamp: new Date().toISOString(),\n },\n ],\n workspace: {\n id: \"sess-a\",\n cwd: \"/fallback\",\n name: \"Fallback Name\",\n created_at: \"2026-06-09T09:49:00.000Z\",\n updated_at: \"2026-06-09T09:51:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.WAITING,\n pid: 14096,\n projectPath: \"/repo\",\n sessionId: \"sess-a\",\n summary: \"Build the Copilot adapter\",\n sessionFilePath: path.join(sessionStateDir, \"sess-a\", \"events.jsonl\"),\n });\n });\n\n it(\"ignores invalid and unmatched lock PIDs\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"invalid\", {\n lockPid: \"not-a-pid\",\n events: [sessionStart(\"invalid\", \"/invalid\")],\n });\n writeSession(\"unmatched\", {\n lockPid: 999999,\n events: [sessionStart(\"unmatched\", \"/unmatched\")],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"pid-100\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"falls back to process-only agent when no session lock matches\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 200, command: \"copilot\", cwd: \"/repo-b\", tty: \"ttys002\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.RUNNING,\n pid: 200,\n projectPath: \"/repo-b\",\n sessionId: \"pid-200\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"suppresses wrapper process-only agents before the session lock exists\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 86810,\n sessionId: \"pid-86810\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"carries the managed wrapper name to a process-only child before the session lock exists\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 86800,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-86800\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 86810,\n sessionId: \"pid-86810\",\n });\n });\n\n it(\"does not add duplicate process-only agent for wrapper process in the same terminal\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"carries the managed wrapper name to a lock-backed child process\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 14095,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 14095,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-14095\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"uses workspace metadata when events are missing\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 300, command: \"copilot\", cwd: \"/proc-cwd\", tty: \"ttys003\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"workspace-only\", {\n lockPid: 300,\n workspace: {\n id: \"workspace-only\",\n cwd: \"/workspace-cwd\",\n name: \"Workspace Session\",\n created_at: \"2026-06-09T09:00:00.000Z\",\n updated_at: \"2026-06-09T09:10:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 300,\n projectPath: \"/workspace-cwd\",\n sessionId: \"workspace-only\",\n summary: \"Workspace Session\",\n });\n });\n });\n\n describe(\"getConversation\", () => {\n it(\"parses user and assistant message events\", () => {\n const sessionDir = writeSession(\"conv\", {\n events: [\n sessionStart(\"conv\", \"/repo\"),\n {\n type: \"user.message\",\n data: { content: \"hello\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"Hi there\" },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"hello\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"assistant\", content: \"Hi there\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"includes system/info/warning messages only in verbose mode\", () => {\n const sessionDir = writeSession(\"verbose\", {\n events: [\n {\n type: \"session.warning\",\n data: { message: \"MCP failed\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"tool.execution_complete\",\n data: { result: { content: \"Tool result\" } },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n const filePath = path.join(sessionDir, \"events.jsonl\");\n\n expect(adapter.getConversation(filePath)).toEqual([]);\n expect(adapter.getConversation(filePath, { verbose: true })).toEqual([\n { role: \"system\", content: \"MCP failed\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"system\", content: \"Tool result\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"skips malformed JSONL lines and missing text\", () => {\n const sessionDir = writeSession(\"malformed\", {\n events: [\n \"not json\",\n {\n type: \"user.message\",\n data: { content: \"valid\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n { type: \"assistant.message\", data: {}, timestamp: \"2026-06-09T09:50:02.000Z\" },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"valid\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n ]);\n });\n\n it(\"returns empty array for missing file\", () => {\n expect(adapter.getConversation(path.join(tmpDir, \"missing.jsonl\"))).toEqual([]);\n });\n });\n\n describe(\"listSessions\", () => {\n it(\"returns historical sessions without active locks\", async () => {\n writeSession(\"history-a\", {\n events: [\n sessionStart(\"history-a\", \"/repo-a\", \"2026-06-09T09:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"first user\" },\n timestamp: \"2026-06-09T09:00:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"answer\" },\n timestamp: \"2026-06-09T09:00:02.000Z\",\n },\n ],\n });\n writeSession(\"history-b\", {\n events: [\n sessionStart(\"history-b\", \"/repo-b\", \"2026-06-09T10:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"other user\" },\n timestamp: \"2026-06-09T10:00:01.000Z\",\n },\n ],\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(2);\n const byId = Object.fromEntries(sessions.map((session) => [session.sessionId, session]));\n expect(byId[\"history-a\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-a\",\n firstUserMessage: \"first user\",\n sessionFilePath: path.join(sessionStateDir, \"history-a\", \"events.jsonl\"),\n });\n expect(byId[\"history-b\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-b\",\n firstUserMessage: \"other user\",\n });\n });\n\n it(\"finds an exact session ID from its session directory\", async () => {\n writeSession(\"wanted\", { events: [sessionStart(\"wanted\", \"/repo\")] });\n writeSession(\"other\", { events: [sessionStart(\"other\", \"/other\")] });\n\n await expect(adapter.findSessionsById(\"wanted\")).resolves.toEqual([\n expect.objectContaining({\n sessionId: \"wanted\",\n sessionFilePath: path.join(sessionStateDir, \"wanted\", \"events.jsonl\"),\n }),\n ]);\n });\n\n it(\"applies strict cwd filter\", async () => {\n writeSession(\"keep\", { events: [sessionStart(\"keep\", \"/repo\")] });\n writeSession(\"drop\", { events: [sessionStart(\"drop\", \"/other\")] });\n\n const sessions = await adapter.listSessions({ cwd: \"/repo\" });\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0].sessionId).toBe(\"keep\");\n });\n\n it(\"uses workspace fallback for historical sessions without events\", async () => {\n writeSession(\"workspace-history\", {\n workspace: {\n id: \"workspace-history\",\n cwd: \"/workspace-repo\",\n name: \"Workspace History\",\n created_at: \"2026-06-09T08:00:00.000Z\",\n updated_at: \"2026-06-09T08:10:00.000Z\",\n },\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0]).toMatchObject({\n type: \"copilot\",\n sessionId: \"workspace-history\",\n cwd: \"/workspace-repo\",\n firstUserMessage: \"\",\n sessionFilePath: path.join(sessionStateDir, \"workspace-history\", \"events.jsonl\"),\n });\n });\n\n it(\"skips session directories without events or workspace metadata\", async () => {\n fs.mkdirSync(path.join(sessionStateDir, \"empty\"), { recursive: true });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toEqual([]);\n });\n\n it(\"returns empty when session-state directory does not exist\", async () => {\n adapter = new CopilotAdapter(undefined, { sessionStateDir: path.join(tmpDir, \"missing\") });\n\n await expect(adapter.listSessions()).resolves.toEqual([]);\n });\n });\n});\n"],"names":["fs","os","path","CopilotAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","AgentRegistry","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","describe","adapter","tmpDir","sessionStateDir","beforeEach","mkdtempSync","join","tmpdir","mkdirSync","recursive","undefined","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","force","writeSession","sessionId","options","sessionDir","events","lines","map","entry","JSON","stringify","writeFileSync","workspace","Object","entries","key","value","lockPid","sessionStart","startTime","type","data","context","gitRoot","branch","timestamp","it","expect","toBe","canHandle","command","tty","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","content","Date","toISOString","id","created_at","updated_at","toHaveLength","toMatchObject","status","WAITING","projectPath","summary","sessionFilePath","RUNNING","ppid","registry","register","runtime","runtimeRef","session","startedAt","messages","getConversation","role","message","result","filePath","verbose","sessions","listSessions","byId","fromEntries","firstUserMessage","findSessionsById","resolves","objectContaining"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/__tests__/harnesses/copilot/CopilotAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CopilotAdapter\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CopilotAdapter } from \"../../../harnesses/copilot/CopilotAdapter.js\";\nimport type { ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../../utils/process.js\";\nimport { generateAgentName } from \"../../../utils/matching.js\";\nimport { AgentRegistry } from \"../../../utils/AgentRegistry.js\";\n\nvi.mock(\"../../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../../utils/matching.js\", () => ({\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CopilotAdapter\", () => {\n let adapter: CopilotAdapter;\n let tmpDir: string;\n let sessionStateDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilot-test-\"));\n sessionStateDir = path.join(tmpDir, \"session-state\");\n fs.mkdirSync(sessionStateDir, { recursive: true });\n adapter = new CopilotAdapter(undefined, { sessionStateDir });\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeSession(\n sessionId: string,\n options: {\n events?: Array<object | string>;\n workspace?: Record<string, string>;\n lockPid?: number | string;\n },\n ): string {\n const sessionDir = path.join(sessionStateDir, sessionId);\n fs.mkdirSync(sessionDir, { recursive: true });\n\n if (options.events) {\n const lines = options.events.map((entry) =>\n typeof entry === \"string\" ? entry : JSON.stringify(entry),\n );\n fs.writeFileSync(path.join(sessionDir, \"events.jsonl\"), lines.join(\"\\n\"));\n }\n\n if (options.workspace) {\n const lines = Object.entries(options.workspace).map(([key, value]) => `${key}: ${value}`);\n fs.writeFileSync(path.join(sessionDir, \"workspace.yaml\"), lines.join(\"\\n\"));\n }\n\n if (options.lockPid !== undefined) {\n fs.writeFileSync(path.join(sessionDir, `inuse.${options.lockPid}.lock`), \"\");\n }\n\n return sessionDir;\n }\n\n function sessionStart(\n sessionId: string,\n cwd: string,\n startTime = \"2026-06-09T09:50:00.000Z\",\n ): object {\n return {\n type: \"session.start\",\n data: {\n sessionId,\n startTime,\n context: {\n cwd,\n gitRoot: cwd,\n branch: \"main\",\n },\n },\n timestamp: startTime,\n };\n }\n\n describe(\"initialization\", () => {\n it(\"exposes copilot type\", () => {\n expect(adapter.type).toBe(\"copilot\");\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"returns true for copilot commands\", () => {\n expect(adapter.canHandle({ pid: 1, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n });\n\n it(\"returns true for full-path Homebrew copilot commands\", () => {\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n });\n\n it(\"returns true for copilot.exe commands\", () => {\n expect(\n adapter.canHandle({\n pid: 3,\n command: \"/usr/bin/copilot.exe\",\n cwd: \"/repo\",\n tty: \"ttys003\",\n }),\n ).toBe(true);\n });\n\n it(\"returns false when copilot appears only in an argument\", () => {\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /repo/copilot-plugin/index.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"returns empty list when no copilot process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"copilot\");\n });\n\n it(\"maps matching inuse lock and events to an active agent\", async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-a\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-a\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"Build the Copilot adapter\" },\n timestamp: new Date().toISOString(),\n },\n {\n type: \"assistant.message\",\n data: { content: \"I will inspect the code.\" },\n timestamp: new Date().toISOString(),\n },\n ],\n workspace: {\n id: \"sess-a\",\n cwd: \"/fallback\",\n name: \"Fallback Name\",\n created_at: \"2026-06-09T09:49:00.000Z\",\n updated_at: \"2026-06-09T09:51:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.WAITING,\n pid: 14096,\n projectPath: \"/repo\",\n sessionId: \"sess-a\",\n summary: \"Build the Copilot adapter\",\n sessionFilePath: path.join(sessionStateDir, \"sess-a\", \"events.jsonl\"),\n });\n });\n\n it(\"ignores invalid and unmatched lock PIDs\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"invalid\", {\n lockPid: \"not-a-pid\",\n events: [sessionStart(\"invalid\", \"/invalid\")],\n });\n writeSession(\"unmatched\", {\n lockPid: 999999,\n events: [sessionStart(\"unmatched\", \"/unmatched\")],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"pid-100\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"falls back to process-only agent when no session lock matches\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 200, command: \"copilot\", cwd: \"/repo-b\", tty: \"ttys002\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.RUNNING,\n pid: 200,\n projectPath: \"/repo-b\",\n sessionId: \"pid-200\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"suppresses wrapper process-only agents before the session lock exists\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 86810,\n sessionId: \"pid-86810\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"carries the managed wrapper name to a process-only child before the session lock exists\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 86800,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-86800\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 86810,\n sessionId: \"pid-86810\",\n });\n });\n\n it(\"does not add duplicate process-only agent for wrapper process in the same terminal\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"carries the managed wrapper name to a lock-backed child process\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 14095,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 14095,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-14095\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"uses workspace metadata when events are missing\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 300, command: \"copilot\", cwd: \"/proc-cwd\", tty: \"ttys003\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"workspace-only\", {\n lockPid: 300,\n workspace: {\n id: \"workspace-only\",\n cwd: \"/workspace-cwd\",\n name: \"Workspace Session\",\n created_at: \"2026-06-09T09:00:00.000Z\",\n updated_at: \"2026-06-09T09:10:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 300,\n projectPath: \"/workspace-cwd\",\n sessionId: \"workspace-only\",\n summary: \"Workspace Session\",\n });\n });\n });\n\n describe(\"getConversation\", () => {\n it(\"parses user and assistant message events\", () => {\n const sessionDir = writeSession(\"conv\", {\n events: [\n sessionStart(\"conv\", \"/repo\"),\n {\n type: \"user.message\",\n data: { content: \"hello\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"Hi there\" },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"hello\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"assistant\", content: \"Hi there\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"includes system/info/warning messages only in verbose mode\", () => {\n const sessionDir = writeSession(\"verbose\", {\n events: [\n {\n type: \"session.warning\",\n data: { message: \"MCP failed\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"tool.execution_complete\",\n data: { result: { content: \"Tool result\" } },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n const filePath = path.join(sessionDir, \"events.jsonl\");\n\n expect(adapter.getConversation(filePath)).toEqual([]);\n expect(adapter.getConversation(filePath, { verbose: true })).toEqual([\n { role: \"system\", content: \"MCP failed\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"system\", content: \"Tool result\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"skips malformed JSONL lines and missing text\", () => {\n const sessionDir = writeSession(\"malformed\", {\n events: [\n \"not json\",\n {\n type: \"user.message\",\n data: { content: \"valid\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n { type: \"assistant.message\", data: {}, timestamp: \"2026-06-09T09:50:02.000Z\" },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"valid\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n ]);\n });\n\n it(\"returns empty array for missing file\", () => {\n expect(adapter.getConversation(path.join(tmpDir, \"missing.jsonl\"))).toEqual([]);\n });\n });\n\n describe(\"listSessions\", () => {\n it(\"returns historical sessions without active locks\", async () => {\n writeSession(\"history-a\", {\n events: [\n sessionStart(\"history-a\", \"/repo-a\", \"2026-06-09T09:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"first user\" },\n timestamp: \"2026-06-09T09:00:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"answer\" },\n timestamp: \"2026-06-09T09:00:02.000Z\",\n },\n ],\n });\n writeSession(\"history-b\", {\n events: [\n sessionStart(\"history-b\", \"/repo-b\", \"2026-06-09T10:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"other user\" },\n timestamp: \"2026-06-09T10:00:01.000Z\",\n },\n ],\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(2);\n const byId = Object.fromEntries(sessions.map((session) => [session.sessionId, session]));\n expect(byId[\"history-a\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-a\",\n firstUserMessage: \"first user\",\n sessionFilePath: path.join(sessionStateDir, \"history-a\", \"events.jsonl\"),\n });\n expect(byId[\"history-b\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-b\",\n firstUserMessage: \"other user\",\n });\n });\n\n it(\"finds an exact session ID from its session directory\", async () => {\n writeSession(\"wanted\", { events: [sessionStart(\"wanted\", \"/repo\")] });\n writeSession(\"other\", { events: [sessionStart(\"other\", \"/other\")] });\n\n await expect(adapter.findSessionsById(\"wanted\")).resolves.toEqual([\n expect.objectContaining({\n sessionId: \"wanted\",\n sessionFilePath: path.join(sessionStateDir, \"wanted\", \"events.jsonl\"),\n }),\n ]);\n });\n\n it(\"applies strict cwd filter\", async () => {\n writeSession(\"keep\", { events: [sessionStart(\"keep\", \"/repo\")] });\n writeSession(\"drop\", { events: [sessionStart(\"drop\", \"/other\")] });\n\n const sessions = await adapter.listSessions({ cwd: \"/repo\" });\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0].sessionId).toBe(\"keep\");\n });\n\n it(\"uses workspace fallback for historical sessions without events\", async () => {\n writeSession(\"workspace-history\", {\n workspace: {\n id: \"workspace-history\",\n cwd: \"/workspace-repo\",\n name: \"Workspace History\",\n created_at: \"2026-06-09T08:00:00.000Z\",\n updated_at: \"2026-06-09T08:10:00.000Z\",\n },\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0]).toMatchObject({\n type: \"copilot\",\n sessionId: \"workspace-history\",\n cwd: \"/workspace-repo\",\n firstUserMessage: \"\",\n sessionFilePath: path.join(sessionStateDir, \"workspace-history\", \"events.jsonl\"),\n });\n });\n\n it(\"skips session directories without events or workspace metadata\", async () => {\n fs.mkdirSync(path.join(sessionStateDir, \"empty\"), { recursive: true });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toEqual([]);\n });\n\n it(\"returns empty when session-state directory does not exist\", async () => {\n adapter = new CopilotAdapter(undefined, { sessionStateDir: path.join(tmpDir, \"missing\") });\n\n await expect(adapter.listSessions()).resolves.toEqual([]);\n });\n });\n});\n"],"names":["fs","os","path","CopilotAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","AgentRegistry","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","describe","adapter","tmpDir","sessionStateDir","beforeEach","mkdtempSync","join","tmpdir","mkdirSync","recursive","undefined","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","force","writeSession","sessionId","options","sessionDir","events","lines","map","entry","JSON","stringify","writeFileSync","workspace","Object","entries","key","value","lockPid","sessionStart","startTime","type","data","context","gitRoot","branch","timestamp","it","expect","toBe","canHandle","command","tty","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","content","Date","toISOString","id","created_at","updated_at","toHaveLength","toMatchObject","status","WAITING","projectPath","summary","sessionFilePath","RUNNING","ppid","registry","register","runtime","runtimeRef","session","startedAt","messages","getConversation","role","message","result","filePath","verbose","sessions","listSessions","byId","fromEntries","firstUserMessage","findSessionsById","resolves","objectContaining"],"mappings":"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"}
|