@ai-devkit/agent-manager 0.36.0 → 0.38.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 -8
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +23 -4
- 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/anthropic.test.js +115 -0
- package/dist/__tests__/capacity/anthropic.test.js.map +1 -0
- package/dist/__tests__/capacity/boundaries.test.js +45 -0
- package/dist/__tests__/capacity/boundaries.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +3 -3
- package/dist/__tests__/capacity/claude.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +3 -1
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/openai.test.js +32 -25
- package/dist/__tests__/capacity/openai.test.js.map +1 -1
- package/dist/__tests__/capacity/wham.test.js +1 -1
- package/dist/__tests__/capacity/wham.test.js.map +1 -1
- package/dist/__tests__/capacity/zai.test.js +7 -8
- package/dist/__tests__/capacity/zai.test.js.map +1 -1
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/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__/harnesses/claude/ClaudeAgentMapper.test.js +79 -0
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js +1881 -0
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionLocator.test.js +425 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js +314 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js +49 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js +76 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js +173 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js +181 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js +685 -0
- 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__/harnesses/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/harnesses/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/harnesses/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js +121 -0
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js +84 -0
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js +128 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js +246 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js +384 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/harnesses/copilot/CopilotAdapter.test.js +659 -0
- package/dist/__tests__/harnesses/copilot/CopilotAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js +1443 -0
- 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__/harnesses/grok/GrokAgentMapper.test.js +56 -0
- package/dist/__tests__/harnesses/grok/GrokAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokCliAdapter.test.js +421 -0
- package/dist/__tests__/harnesses/grok/GrokCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokSessionLocator.test.js +133 -0
- package/dist/__tests__/harnesses/grok/GrokSessionLocator.test.js.map +1 -0
- 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__/harnesses/opencode/OpenCodeAdapter.test.js +213 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.js +89 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.js +94 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js +147 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiAdapter.test.js +367 -0
- package/dist/__tests__/harnesses/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js +416 -0
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/harnesses/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js +70 -0
- package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js +192 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintProtocol.test.js +119 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintProtocol.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js +382 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiStreamParser.test.js +34 -0
- package/dist/__tests__/harnesses/pi/durable/PiStreamParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js +342 -0
- package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/__tests__/harnesses/runtimeProfiles.test.js +89 -0
- package/dist/__tests__/harnesses/runtimeProfiles.test.js.map +1 -0
- package/dist/__tests__/print/DurableAgent.test.js +4 -6
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +1 -12
- package/dist/__tests__/print/DurableAgentRepository.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__/terminal/TmuxManager.test.js +1 -1
- package/dist/__tests__/terminal/TmuxManager.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/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/index.d.ts +9 -19
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +11 -4
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/providers/anthropic.d.ts +9 -0
- package/dist/capacity/providers/anthropic.d.ts.map +1 -0
- package/dist/capacity/providers/anthropic.js +153 -0
- package/dist/capacity/providers/anthropic.js.map +1 -0
- package/dist/capacity/providers/openai-platform.d.ts +14 -0
- package/dist/capacity/providers/openai-platform.d.ts.map +1 -0
- package/dist/capacity/providers/openai-platform.js +120 -0
- package/dist/capacity/providers/openai-platform.js.map +1 -0
- package/dist/capacity/providers/openai-subscription.d.ts +20 -0
- package/dist/capacity/providers/openai-subscription.d.ts.map +1 -0
- package/dist/capacity/providers/openai-subscription.js +129 -0
- package/dist/capacity/providers/openai-subscription.js.map +1 -0
- package/dist/capacity/providers/zai.d.ts +8 -0
- package/dist/capacity/providers/zai.d.ts.map +1 -0
- package/dist/capacity/providers/zai.js +158 -0
- package/dist/capacity/providers/zai.js.map +1 -0
- package/dist/capacity/sources/claude.d.ts +9 -0
- package/dist/capacity/sources/claude.d.ts.map +1 -0
- package/dist/capacity/sources/claude.js +17 -0
- package/dist/capacity/sources/claude.js.map +1 -0
- package/dist/capacity/sources/codex.d.ts +32 -0
- package/dist/capacity/sources/codex.d.ts.map +1 -0
- package/dist/capacity/sources/codex.js +227 -0
- package/dist/capacity/sources/codex.js.map +1 -0
- package/dist/capacity/sources/pi.d.ts +30 -0
- package/dist/capacity/sources/pi.d.ts.map +1 -0
- package/dist/capacity/sources/pi.js +81 -0
- package/dist/capacity/sources/pi.js.map +1 -0
- package/dist/capacity/types.d.ts +2 -0
- package/dist/capacity/types.d.ts.map +1 -1
- package/dist/capacity/types.js +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/harnesses/claude/ClaudeAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeAgentMapper.js +36 -0
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts +30 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.js +134 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionLocator.js +260 -0
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts +148 -0
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionParser.js +365 -0
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/harnesses/claude/credentials.d.ts +10 -0
- package/dist/harnesses/claude/credentials.d.ts.map +1 -0
- package/dist/harnesses/claude/credentials.js +112 -0
- package/dist/harnesses/claude/credentials.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeCliProbe.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeCliProbe.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintAgentService.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintAgentService.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintRunner.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintRunner.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeStreamParser.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeStreamParser.js.map +1 -0
- package/dist/harnesses/claude/readiness.d.ts +3 -0
- package/dist/harnesses/claude/readiness.d.ts.map +1 -0
- package/dist/harnesses/claude/readiness.js +63 -0
- package/dist/harnesses/claude/readiness.js.map +1 -0
- package/dist/harnesses/codex/CodexAdapter.d.ts +29 -0
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexAdapter.js +290 -0
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/harnesses/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexAgentMapper.js +28 -0
- 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/harnesses/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionMapping.js +68 -0
- 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/harnesses/codex/CodexSessionParser.js +308 -0
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/harnesses/codex/credentials.d.ts +15 -0
- package/dist/harnesses/codex/credentials.d.ts.map +1 -0
- package/dist/harnesses/codex/credentials.js +58 -0
- package/dist/harnesses/codex/credentials.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexCliProbe.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexCliProbe.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintAgentService.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintAgentService.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintRunner.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintRunner.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexStreamParser.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexStreamParser.js.map +1 -0
- package/dist/harnesses/codex/readiness.d.ts +3 -0
- package/dist/harnesses/codex/readiness.d.ts.map +1 -0
- package/dist/harnesses/codex/readiness.js +60 -0
- package/dist/harnesses/codex/readiness.js.map +1 -0
- package/dist/harnesses/copilot/CopilotAdapter.d.ts +36 -0
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotAdapter.js +128 -0
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/harnesses/copilot/CopilotAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotAgentMapper.js +30 -0
- 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/harnesses/copilot/readiness.d.ts +3 -0
- package/dist/harnesses/copilot/readiness.d.ts.map +1 -0
- package/dist/harnesses/copilot/readiness.js +39 -0
- package/dist/harnesses/copilot/readiness.js.map +1 -0
- package/dist/harnesses/gemini/GeminiAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiAgentMapper.js +30 -0
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts +52 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.js +196 -0
- 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/harnesses/gemini/GeminiSessionParser.d.ts +121 -0
- 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/harnesses/grok/GrokAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokAgentMapper.js +30 -0
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/harnesses/grok/GrokCliAdapter.d.ts +36 -0
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokCliAdapter.js +102 -0
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionLocator.js +140 -0
- 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/harnesses/opencode/OpenCodeAdapter.d.ts +29 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.js +86 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js +42 -0
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js +118 -0
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts +16 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.js +105 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/harnesses/opencode/readiness.d.ts +3 -0
- package/dist/harnesses/opencode/readiness.d.ts.map +1 -0
- package/dist/harnesses/opencode/readiness.js +50 -0
- package/dist/harnesses/opencode/readiness.js.map +1 -0
- package/dist/harnesses/pi/PiAdapter.d.ts +30 -0
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/harnesses/pi/PiAdapter.js +167 -0
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/harnesses/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/pi/PiAgentMapper.js +30 -0
- 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/harnesses/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionTracker.js +69 -0
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/harnesses/pi/credentials.d.ts +22 -0
- package/dist/harnesses/pi/credentials.d.ts.map +1 -0
- package/dist/harnesses/pi/credentials.js +98 -0
- package/dist/harnesses/pi/credentials.js.map +1 -0
- package/dist/harnesses/pi/durable/PiCliProbe.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiCliProbe.js.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintAgentService.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintAgentService.js.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintProtocol.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintProtocol.js.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintRunner.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintRunner.js.map +1 -0
- package/dist/harnesses/pi/durable/PiStreamParser.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiStreamParser.js.map +1 -0
- package/dist/harnesses/pi/readiness.d.ts +3 -0
- package/dist/harnesses/pi/readiness.d.ts.map +1 -0
- package/dist/harnesses/pi/readiness.js +96 -0
- package/dist/harnesses/pi/readiness.js.map +1 -0
- package/dist/harnesses/readiness/AgentReadiness.d.ts +6 -0
- package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/harnesses/readiness/AgentReadiness.js +68 -0
- package/dist/harnesses/readiness/AgentReadiness.js.map +1 -0
- package/dist/harnesses/readiness/checks.d.ts +31 -0
- package/dist/harnesses/readiness/checks.d.ts.map +1 -0
- package/dist/harnesses/readiness/checks.js +270 -0
- package/dist/harnesses/readiness/checks.js.map +1 -0
- package/dist/harnesses/readiness/types.d.ts +76 -0
- package/dist/harnesses/readiness/types.d.ts.map +1 -0
- package/dist/harnesses/readiness/types.js +4 -0
- package/dist/harnesses/readiness/types.js.map +1 -0
- package/dist/harnesses/runtimeProfiles.d.ts +11 -0
- package/dist/harnesses/runtimeProfiles.d.ts.map +1 -0
- package/dist/harnesses/runtimeProfiles.js +99 -0
- package/dist/harnesses/runtimeProfiles.js.map +1 -0
- 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 +21 -46
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -27
- package/dist/index.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +3 -3
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +6 -20
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +2 -43
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/runtime/tmux/PidPolling.d.ts +1 -1
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -1
- package/dist/runtime/tmux/PidPolling.js.map +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.js +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -1
- package/dist/runtime/tmux/TmuxManager.d.ts +12 -0
- package/dist/runtime/tmux/TmuxManager.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxManager.js +116 -0
- package/dist/runtime/tmux/TmuxManager.js.map +1 -0
- package/dist/runtime/types.d.ts +1 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/terminal/TerminalFocusManager.d.ts +4 -32
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +17 -267
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -44
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +11 -347
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/backends/index.d.ts +5 -0
- package/dist/terminal/backends/index.d.ts.map +1 -0
- package/dist/terminal/backends/index.js +19 -0
- package/dist/terminal/backends/index.js.map +1 -0
- package/dist/terminal/backends/iterm2.d.ts +3 -0
- package/dist/terminal/backends/iterm2.d.ts.map +1 -0
- package/dist/terminal/backends/iterm2.js +135 -0
- package/dist/terminal/backends/iterm2.js.map +1 -0
- package/dist/terminal/backends/shared.d.ts +7 -0
- package/dist/terminal/backends/shared.d.ts.map +1 -0
- package/dist/terminal/backends/shared.js +35 -0
- package/dist/terminal/backends/shared.js.map +1 -0
- package/dist/terminal/backends/terminal-app.d.ts +3 -0
- package/dist/terminal/backends/terminal-app.d.ts.map +1 -0
- package/dist/terminal/backends/terminal-app.js +129 -0
- package/dist/terminal/backends/terminal-app.js.map +1 -0
- package/dist/terminal/backends/tmux.d.ts +3 -0
- package/dist/terminal/backends/tmux.d.ts.map +1 -0
- package/dist/terminal/backends/tmux.js +76 -0
- package/dist/terminal/backends/tmux.js.map +1 -0
- package/dist/terminal/backends/wezterm.d.ts +3 -0
- package/dist/terminal/backends/wezterm.d.ts.map +1 -0
- package/dist/terminal/backends/wezterm.js +71 -0
- package/dist/terminal/backends/wezterm.js.map +1 -0
- package/dist/terminal/types.d.ts +21 -0
- package/dist/terminal/types.d.ts.map +1 -0
- package/dist/terminal/types.js +10 -0
- package/dist/terminal/types.js.map +1 -0
- 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/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 +27 -6
- 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/anthropic.test.ts +105 -0
- package/src/__tests__/capacity/boundaries.test.ts +36 -0
- package/src/__tests__/capacity/claude.test.ts +3 -8
- package/src/__tests__/capacity/codex.test.ts +12 -35
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +1 -1
- package/src/__tests__/capacity/openai.test.ts +20 -30
- package/src/__tests__/capacity/wham.test.ts +1 -1
- package/src/__tests__/capacity/zai.test.ts +27 -62
- 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__/harnesses/claude/ClaudeAgentMapper.test.ts +84 -0
- package/src/__tests__/harnesses/claude/ClaudeCodeAdapter.test.ts +1793 -0
- package/src/__tests__/harnesses/claude/ClaudeSessionLocator.test.ts +423 -0
- package/src/__tests__/harnesses/claude/ClaudeSessionParser.test.ts +300 -0
- package/src/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.ts +34 -0
- package/src/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.ts +61 -0
- package/src/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.ts +129 -0
- package/src/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.ts +152 -0
- package/src/__tests__/harnesses/codex/CodexAdapter.test.ts +652 -0
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/harnesses/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/harnesses/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts +80 -0
- package/src/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.ts +65 -0
- package/src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts +104 -0
- package/src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts +201 -0
- package/src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts +299 -0
- package/src/__tests__/harnesses/copilot/CopilotAdapter.test.ts +614 -0
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/harnesses/gemini/GeminiCliAdapter.test.ts +1324 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/harnesses/grok/GrokAgentMapper.test.ts +57 -0
- package/src/__tests__/harnesses/grok/GrokCliAdapter.test.ts +376 -0
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/harnesses/grok/GrokSessionLocator.test.ts +106 -0
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/harnesses/opencode/OpenCodeAdapter.test.ts +215 -0
- package/src/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.ts +83 -0
- package/src/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.ts +84 -0
- package/src/__tests__/harnesses/opencode/OpenCodeSessionParser.test.ts +148 -0
- package/src/__tests__/harnesses/pi/PiAdapter.test.ts +325 -0
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/harnesses/pi/PiSessionParser.test.ts +280 -0
- package/src/__tests__/harnesses/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/harnesses/pi/durable/PiCliProbe.test.ts +50 -0
- package/src/__tests__/harnesses/pi/durable/PiPrintAgentService.test.ts +138 -0
- package/src/__tests__/harnesses/pi/durable/PiPrintProtocol.test.ts +71 -0
- package/src/__tests__/harnesses/pi/durable/PiPrintRunner.test.ts +252 -0
- package/src/__tests__/harnesses/pi/durable/PiStreamParser.test.ts +26 -0
- package/src/__tests__/harnesses/readiness/AgentReadiness.test.ts +285 -0
- package/src/__tests__/harnesses/runtimeProfiles.test.ts +110 -0
- package/src/__tests__/print/DurableAgent.test.ts +4 -13
- package/src/__tests__/print/DurableAgentRepository.test.ts +1 -13
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +31 -1
- package/src/__tests__/terminal/TmuxManager.test.ts +1 -1
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -14
- package/src/capacity/index.ts +29 -23
- package/src/capacity/providers/anthropic.ts +198 -0
- package/src/capacity/providers/openai-platform.ts +150 -0
- package/src/capacity/providers/openai-subscription.ts +162 -0
- package/src/capacity/providers/zai.ts +155 -0
- package/src/capacity/sources/claude.ts +30 -0
- package/src/capacity/sources/codex.ts +262 -0
- package/src/capacity/sources/pi.ts +131 -0
- package/src/capacity/types.ts +3 -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/harnesses/claude/ClaudeAgentMapper.ts +55 -0
- package/src/harnesses/claude/ClaudeCodeAdapter.ts +175 -0
- package/src/harnesses/claude/ClaudeSessionLocator.ts +358 -0
- package/src/harnesses/claude/ClaudeSessionParser.ts +524 -0
- package/src/harnesses/claude/credentials.ts +122 -0
- package/src/harnesses/claude/readiness.ts +69 -0
- package/src/harnesses/codex/CodexAdapter.ts +337 -0
- package/src/harnesses/codex/CodexAgentMapper.ts +26 -0
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/harnesses/codex/CodexSessionMapping.ts +89 -0
- package/src/harnesses/codex/CodexSessionParser.ts +462 -0
- package/src/harnesses/codex/credentials.ts +81 -0
- package/src/harnesses/codex/readiness.ts +72 -0
- package/src/harnesses/copilot/CopilotAdapter.ts +161 -0
- package/src/harnesses/copilot/CopilotAgentMapper.ts +27 -0
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/harnesses/copilot/readiness.ts +33 -0
- package/src/harnesses/gemini/GeminiAgentMapper.ts +27 -0
- package/src/harnesses/gemini/GeminiCliAdapter.ts +272 -0
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/harnesses/gemini/GeminiSessionParser.ts +395 -0
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/harnesses/grok/GrokAgentMapper.ts +32 -0
- package/src/harnesses/grok/GrokCliAdapter.ts +126 -0
- package/src/harnesses/grok/GrokSessionLocator.ts +179 -0
- 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/harnesses/opencode/OpenCodeAdapter.ts +110 -0
- package/src/harnesses/opencode/OpenCodeAgentMapper.ts +51 -0
- package/src/harnesses/opencode/OpenCodeSessionLocator.ts +151 -0
- package/src/harnesses/opencode/OpenCodeSessionParser.ts +146 -0
- package/src/harnesses/opencode/readiness.ts +48 -0
- package/src/harnesses/pi/PiAdapter.ts +197 -0
- package/src/harnesses/pi/PiAgentMapper.ts +27 -0
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/harnesses/pi/PiSessionTracker.ts +87 -0
- package/src/harnesses/pi/credentials.ts +129 -0
- package/src/harnesses/pi/readiness.ts +104 -0
- package/src/harnesses/readiness/AgentReadiness.ts +87 -0
- package/src/harnesses/readiness/checks.ts +336 -0
- package/src/harnesses/readiness/types.ts +90 -0
- package/src/harnesses/runtimeProfiles.ts +103 -0
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +20 -131
- package/src/runtime/ManagedAgentRuntime.ts +7 -22
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +3 -19
- package/src/runtime/tmux/PidPolling.ts +1 -1
- package/src/runtime/tmux/TmuxAgentRuntime.ts +1 -1
- package/src/runtime/tmux/TmuxManager.ts +102 -0
- package/src/runtime/types.ts +1 -1
- package/src/terminal/TerminalFocusManager.ts +19 -292
- package/src/terminal/TtyWriter.ts +16 -336
- package/src/terminal/backends/index.ts +21 -0
- package/src/terminal/backends/iterm2.ts +126 -0
- package/src/terminal/backends/shared.ts +42 -0
- package/src/terminal/backends/terminal-app.ts +122 -0
- package/src/terminal/backends/tmux.ts +62 -0
- package/src/terminal/backends/wezterm.ts +65 -0
- package/src/terminal/types.ts +22 -0
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/AntigravityCliAdapter.test.js +0 -381
- package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +0 -1853
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +0 -391
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/KiroAdapter.test.js +0 -607
- package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +0 -129
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +0 -84
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +0 -126
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +0 -271
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +0 -393
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +0 -49
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +0 -75
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +0 -173
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +0 -181
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +0 -79
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +0 -436
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.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/codex/CodexSessionMapping.test.js +0 -86
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +0 -254
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +0 -1
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +0 -659
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +0 -1434
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/grok/GrokAgentMapper.test.js +0 -56
- package/dist/__tests__/providers/grok/GrokAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/grok/GrokCliAdapter.test.js +0 -421
- package/dist/__tests__/providers/grok/GrokCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/grok/GrokSessionLocator.test.js +0 -133
- package/dist/__tests__/providers/grok/GrokSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js +0 -213
- package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js +0 -89
- package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js +0 -94
- package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js +0 -147
- package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiAdapter.test.js +0 -367
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +0 -246
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +0 -108
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +0 -76
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +0 -202
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +0 -119
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +0 -386
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +0 -34
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +0 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +0 -301
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +0 -314
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/agents.test.js +0 -29
- package/dist/__tests__/utils/agents.test.js.map +0 -1
- package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
- package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
- package/dist/adapters/AntigravityCliAdapter.js +0 -273
- package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
- package/dist/adapters/KiroAdapter.d.ts +0 -46
- package/dist/adapters/KiroAdapter.d.ts.map +0 -1
- package/dist/adapters/KiroAdapter.js +0 -344
- package/dist/adapters/KiroAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -12
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -12
- package/dist/adapters/index.js.map +0 -1
- package/dist/capacity/claude.d.ts +0 -17
- package/dist/capacity/claude.d.ts.map +0 -1
- package/dist/capacity/claude.js +0 -271
- package/dist/capacity/claude.js.map +0 -1
- package/dist/capacity/codex.d.ts +0 -36
- package/dist/capacity/codex.d.ts.map +0 -1
- package/dist/capacity/codex.js +0 -280
- package/dist/capacity/codex.js.map +0 -1
- package/dist/capacity/openai.d.ts +0 -48
- package/dist/capacity/openai.d.ts.map +0 -1
- package/dist/capacity/openai.js +0 -312
- package/dist/capacity/openai.js.map +0 -1
- package/dist/capacity/wham.d.ts +0 -16
- package/dist/capacity/wham.d.ts.map +0 -1
- package/dist/capacity/wham.js +0 -66
- package/dist/capacity/wham.js.map +0 -1
- package/dist/capacity/zai.d.ts +0 -14
- package/dist/capacity/zai.d.ts.map +0 -1
- package/dist/capacity/zai.js +0 -203
- package/dist/capacity/zai.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +0 -42
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +0 -31
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +0 -132
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +0 -260
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +0 -114
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js +0 -309
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +0 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts +0 -28
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js +0 -170
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js +0 -35
- 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.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js +0 -68
- 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 +0 -262
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexCliProbe.js.map +0 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +0 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +0 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexStreamParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts +0 -35
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js +0 -123
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js +0 -37
- 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.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js +0 -37
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts +0 -53
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js +0 -197
- 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 +0 -94
- 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.d.ts.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js +0 -36
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts +0 -36
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js +0 -98
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js +0 -140
- 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 +0 -31
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js +0 -89
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js +0 -50
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js +0 -118
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts +0 -18
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js +0 -104
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts +0 -29
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js +0 -163
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.d.ts.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js +0 -37
- 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.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js +0 -69
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiCliProbe.js.map +0 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +0 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +0 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiPrintRunner.js.map +0 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiStreamParser.js.map +0 -1
- package/dist/readiness/AgentReadiness.d.ts +0 -67
- package/dist/readiness/AgentReadiness.d.ts.map +0 -1
- package/dist/readiness/AgentReadiness.js +0 -614
- package/dist/readiness/AgentReadiness.js.map +0 -1
- package/dist/terminal/TmuxManager.d.ts +0 -28
- package/dist/terminal/TmuxManager.d.ts.map +0 -1
- package/dist/terminal/TmuxManager.js +0 -135
- package/dist/terminal/TmuxManager.js.map +0 -1
- package/dist/terminal/index.d.ts +0 -5
- package/dist/terminal/index.d.ts.map +0 -1
- package/dist/terminal/index.js +0 -5
- package/dist/terminal/index.js.map +0 -1
- package/dist/utils/agents.d.ts +0 -15
- package/dist/utils/agents.d.ts.map +0 -1
- package/dist/utils/agents.js +0 -82
- package/dist/utils/agents.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/src/__tests__/adapters/AntigravityCliAdapter.test.ts +0 -324
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +0 -1763
- package/src/__tests__/adapters/CodexAdapter.test.ts +0 -387
- package/src/__tests__/adapters/KiroAdapter.test.ts +0 -534
- package/src/__tests__/durable/CodexCliProbe.test.ts +0 -85
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +0 -65
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +0 -104
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +0 -217
- package/src/__tests__/durable/CodexPrintRunner.test.ts +0 -309
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/print/ClaudeCliProbe.test.ts +0 -34
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +0 -61
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +0 -129
- package/src/__tests__/print/ClaudePrintRunner.test.ts +0 -152
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +0 -84
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +0 -434
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +0 -63
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +0 -192
- package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +0 -614
- package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +0 -1320
- package/src/__tests__/providers/grok/GrokAgentMapper.test.ts +0 -57
- package/src/__tests__/providers/grok/GrokCliAdapter.test.ts +0 -376
- package/src/__tests__/providers/grok/GrokSessionLocator.test.ts +0 -106
- package/src/__tests__/providers/opencode/OpenCodeAdapter.test.ts +0 -215
- package/src/__tests__/providers/opencode/OpenCodeAgentMapper.test.ts +0 -83
- package/src/__tests__/providers/opencode/OpenCodeSessionLocator.test.ts +0 -84
- package/src/__tests__/providers/opencode/OpenCodeSessionParser.test.ts +0 -148
- package/src/__tests__/providers/pi/PiAdapter.test.ts +0 -325
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +0 -190
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +0 -79
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +0 -54
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +0 -141
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +0 -71
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +0 -253
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +0 -26
- package/src/__tests__/readiness/AgentReadiness.test.ts +0 -242
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +0 -300
- package/src/__tests__/utils/agents.test.ts +0 -31
- package/src/adapters/AntigravityCliAdapter.ts +0 -356
- package/src/adapters/KiroAdapter.ts +0 -456
- package/src/adapters/index.ts +0 -17
- package/src/capacity/claude.ts +0 -313
- package/src/capacity/codex.ts +0 -332
- package/src/capacity/openai.ts +0 -361
- package/src/capacity/wham.ts +0 -84
- package/src/capacity/zai.ts +0 -237
- package/src/providers/claude/ClaudeAgentMapper.ts +0 -63
- package/src/providers/claude/ClaudeCodeAdapter.ts +0 -173
- package/src/providers/claude/ClaudeSessionLocator.ts +0 -358
- package/src/providers/claude/ClaudeSessionParser.ts +0 -432
- package/src/providers/codex/CodexAdapter.ts +0 -213
- package/src/providers/codex/CodexAgentMapper.ts +0 -35
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/codex/CodexSessionMapping.ts +0 -89
- package/src/providers/codex/CodexSessionParser.ts +0 -385
- package/src/providers/copilot/CopilotAdapter.ts +0 -161
- package/src/providers/copilot/CopilotAgentMapper.ts +0 -36
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiAgentMapper.ts +0 -36
- package/src/providers/gemini/GeminiCliAdapter.ts +0 -274
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/gemini/GeminiSessionParser.ts +0 -271
- package/src/providers/grok/GrokAgentMapper.ts +0 -41
- package/src/providers/grok/GrokCliAdapter.ts +0 -125
- package/src/providers/grok/GrokSessionLocator.ts +0 -179
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/opencode/OpenCodeAdapter.ts +0 -116
- package/src/providers/opencode/OpenCodeAgentMapper.ts +0 -61
- package/src/providers/opencode/OpenCodeSessionLocator.ts +0 -151
- package/src/providers/opencode/OpenCodeSessionParser.ts +0 -145
- package/src/providers/pi/PiAdapter.ts +0 -195
- package/src/providers/pi/PiAgentMapper.ts +0 -36
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- package/src/providers/pi/PiSessionTracker.ts +0 -87
- package/src/readiness/AgentReadiness.ts +0 -730
- package/src/terminal/TmuxManager.ts +0 -123
- package/src/terminal/index.ts +0 -4
- package/src/utils/agents.ts +0 -75
- package/src/utils/index.ts +0 -12
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.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/PiDurableAgentRepository.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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/__tests__/AgentManager.test.ts"],"sourcesContent":["/**\n * Tests for AgentManager\n */\n\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { AgentManager } from \"../AgentManager.js\";\nimport type {\n AgentAdapter,\n AgentInfo,\n AgentType,\n ConversationMessage,\n SessionSummary,\n ProcessInfo,\n} from \"../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../adapters/AgentAdapter.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../utils/AgentRegistry.js\";\nimport type { HerdrAgentPane } from \"../runtime/herdr/HerdrAgentDiscovery.js\";\n\n// Mock adapter for testing\nclass MockAdapter implements AgentAdapter {\n public lastListSessionsOpts: unknown = undefined;\n public findSessionsByIdCalls: string[] = [];\n\n constructor(\n public readonly type: AgentType,\n private mockAgents: AgentInfo[] = [],\n private shouldFail: boolean = false,\n private mockSessions: SessionSummary[] = [],\n private shouldFailListSessions: boolean = false,\n ) {}\n\n async detectAgents(): Promise<AgentInfo[]> {\n if (this.shouldFail) {\n throw new Error(`Mock adapter ${this.type} failed`);\n }\n return this.mockAgents;\n }\n\n canHandle(): boolean {\n return true;\n }\n\n getConversation(): ConversationMessage[] {\n return [];\n }\n\n async listSessions(opts?: unknown): Promise<SessionSummary[]> {\n this.lastListSessionsOpts = opts;\n if (this.shouldFailListSessions) {\n throw new Error(`Mock adapter ${this.type} listSessions failed`);\n }\n return this.mockSessions;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n this.findSessionsByIdCalls.push(sessionId);\n return this.mockSessions.filter((session) => session.sessionId === sessionId);\n }\n\n setAgents(agents: AgentInfo[]): void {\n this.mockAgents = agents;\n }\n\n setFail(shouldFail: boolean): void {\n this.shouldFail = shouldFail;\n }\n\n setSessions(sessions: SessionSummary[]): void {\n this.mockSessions = sessions;\n }\n\n setFailListSessions(shouldFail: boolean): void {\n this.shouldFailListSessions = shouldFail;\n }\n}\n\n// Helper to create mock agent\nfunction createMockAgent(overrides: Partial<AgentInfo> = {}): AgentInfo {\n return {\n name: \"test-agent\",\n type: \"claude\",\n status: AgentStatus.RUNNING,\n summary: \"Test summary\",\n pid: 12345,\n projectPath: \"/test/path\",\n sessionId: \"test-session-id\",\n lastActive: new Date(),\n ...overrides,\n };\n}\n\ndescribe(\"AgentManager\", () => {\n let manager: AgentManager;\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"agent-manager-\"));\n manager = new AgentManager(new AgentRegistry(path.join(tmpDir, \"agents.json\")));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe(\"registerAdapter\", () => {\n it(\"should register a new adapter\", () => {\n const adapter = new MockAdapter(\"claude\");\n\n manager.registerAdapter(adapter);\n\n expect(manager.hasAdapter(\"claude\")).toBe(true);\n expect(manager.getAdapterCount()).toBe(1);\n });\n\n it(\"should throw error when registering duplicate adapter type\", () => {\n const adapter1 = new MockAdapter(\"claude\");\n const adapter2 = new MockAdapter(\"claude\");\n\n manager.registerAdapter(adapter1);\n\n expect(() => manager.registerAdapter(adapter2)).toThrow(\n 'Adapter for type \"claude\" is already registered',\n );\n });\n\n it(\"should allow registering multiple different adapter types\", () => {\n const adapter1 = new MockAdapter(\"claude\");\n const adapter2 = new MockAdapter(\"gemini_cli\");\n\n manager.registerAdapter(adapter1);\n manager.registerAdapter(adapter2);\n\n expect(manager.getAdapterCount()).toBe(2);\n expect(manager.hasAdapter(\"claude\")).toBe(true);\n expect(manager.hasAdapter(\"gemini_cli\")).toBe(true);\n });\n });\n\n describe(\"unregisterAdapter\", () => {\n it(\"should unregister an existing adapter\", () => {\n const adapter = new MockAdapter(\"claude\");\n manager.registerAdapter(adapter);\n\n const removed = manager.unregisterAdapter(\"claude\");\n\n expect(removed).toBe(true);\n expect(manager.hasAdapter(\"claude\")).toBe(false);\n expect(manager.getAdapterCount()).toBe(0);\n });\n\n it(\"should return false when unregistering non-existent adapter\", () => {\n const removed = manager.unregisterAdapter(\"NonExistent\");\n expect(removed).toBe(false);\n });\n });\n\n describe(\"getAdapters\", () => {\n it(\"should return empty array when no adapters registered\", () => {\n const adapters = manager.getAdapters();\n expect(adapters).toEqual([]);\n });\n\n it(\"should return all registered adapters\", () => {\n const adapter1 = new MockAdapter(\"claude\");\n const adapter2 = new MockAdapter(\"gemini_cli\");\n\n manager.registerAdapter(adapter1);\n manager.registerAdapter(adapter2);\n\n const adapters = manager.getAdapters();\n expect(adapters).toHaveLength(2);\n expect(adapters).toContain(adapter1);\n expect(adapters).toContain(adapter2);\n });\n });\n\n describe(\"listAgents\", () => {\n it(\"shares one process capture while giving each adapter only its declared executables\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 101, command: \"claude\", cwd: \"/claude\", tty: \"s001\" },\n { pid: 202, command: \"node /bin/pi\", cwd: \"/pi\", tty: \"s002\" },\n ];\n const captureSnapshot = vi.fn(async () => processes);\n const createSnapshotAdapter = (type: AgentType, processNames: string[]) => ({\n type,\n processNames,\n detectAgents: vi.fn(async () => []),\n canHandle: () => true,\n getConversation: () => [],\n listSessions: async () => [],\n });\n const claude = createSnapshotAdapter(\"claude\", [\"claude\"]);\n const pi = createSnapshotAdapter(\"pi\", [\"pi\", \"node\"]);\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"snapshot-agents.json\")),\n captureSnapshot,\n );\n\n snapshotManager.registerAdapter(claude as AgentAdapter);\n snapshotManager.registerAdapter(pi as AgentAdapter);\n\n await snapshotManager.listAgents();\n\n expect(captureSnapshot).toHaveBeenCalledTimes(1);\n expect(captureSnapshot).toHaveBeenCalledWith([\"claude\", \"pi\", \"node\"]);\n expect(claude.detectAgents).toHaveBeenCalledWith({ processes: [processes[0]] });\n expect(pi.detectAgents).toHaveBeenCalledWith({ processes: [processes[1]] });\n });\n\n it(\"does not expose foreign command arguments to broad Pi and Gemini matchers\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"node /usr/local/lib/gemini.js\", cwd: \"/g\", tty: \"s001\" },\n { pid: 200, command: \"codex exec --cd /Users/x/repos/gemini\", cwd: \"/c\", tty: \"s002\" },\n { pid: 300, command: \"node /usr/local/lib/pi.js\", cwd: \"/p\", tty: \"s003\" },\n { pid: 400, command: \"claude --resume /Users/x/pi/session.jsonl\", cwd: \"/a\", tty: \"s004\" },\n ];\n const captureSnapshot = vi.fn(async () => processes);\n const createSnapshotAdapter = (type: AgentType, processNames: string[]) => ({\n type,\n processNames,\n detectAgents: vi.fn(async () => []),\n canHandle: () => true,\n getConversation: () => [],\n listSessions: async () => [],\n });\n const gemini = createSnapshotAdapter(\"gemini_cli\", [\"node\"]);\n const codex = createSnapshotAdapter(\"codex\", [\"codex\"]);\n const pi = createSnapshotAdapter(\"pi\", [\"pi\", \"node\"]);\n const claude = createSnapshotAdapter(\"claude\", [\"claude\"]);\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"filtered-snapshot-agents.json\")),\n captureSnapshot,\n );\n\n snapshotManager.registerAdapter(gemini as AgentAdapter);\n snapshotManager.registerAdapter(codex as AgentAdapter);\n snapshotManager.registerAdapter(pi as AgentAdapter);\n snapshotManager.registerAdapter(claude as AgentAdapter);\n\n await snapshotManager.listAgents();\n\n expect(captureSnapshot).toHaveBeenCalledTimes(1);\n expect(captureSnapshot).toHaveBeenCalledWith([\"node\", \"codex\", \"pi\", \"claude\"]);\n expect(gemini.detectAgents).toHaveBeenCalledWith({ processes: [processes[0], processes[2]] });\n expect(codex.detectAgents).toHaveBeenCalledWith({ processes: [processes[1]] });\n expect(pi.detectAgents).toHaveBeenCalledWith({ processes: [processes[0], processes[2]] });\n expect(claude.detectAgents).toHaveBeenCalledWith({ processes: [processes[3]] });\n });\n\n it(\"does not pass a snapshot context to legacy adapters\", async () => {\n const captureSnapshot = vi.fn(async () => []);\n const legacy = new MockAdapter(\"claude\");\n const detect = vi.spyOn(legacy, \"detectAgents\");\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"legacy-agents.json\")),\n captureSnapshot,\n );\n snapshotManager.registerAdapter(legacy);\n\n await snapshotManager.listAgents();\n\n expect(captureSnapshot).not.toHaveBeenCalled();\n expect(detect).toHaveBeenCalledWith();\n });\n\n it(\"should return empty array when no adapters registered\", async () => {\n const agents = await manager.listAgents();\n expect(agents).toEqual([]);\n });\n\n it(\"should return agents from single adapter\", async () => {\n const mockAgents = [createMockAgent({ name: \"agent1\" }), createMockAgent({ name: \"agent2\" })];\n const adapter = new MockAdapter(\"claude\", mockAgents);\n\n manager.registerAdapter(adapter);\n const agents = await manager.listAgents();\n\n expect(agents).toHaveLength(2);\n expect(agents[0].name).toBe(\"agent1\");\n expect(agents[1].name).toBe(\"agent2\");\n });\n\n it(\"should aggregate agents from multiple adapters\", async () => {\n const claudeAgents = [createMockAgent({ name: \"claude-agent\", type: \"claude\" })];\n const geminiAgents = [createMockAgent({ name: \"gemini-agent\", type: \"gemini_cli\" })];\n\n manager.registerAdapter(new MockAdapter(\"claude\", claudeAgents));\n manager.registerAdapter(new MockAdapter(\"gemini_cli\", geminiAgents));\n\n const agents = await manager.listAgents();\n\n expect(agents).toHaveLength(2);\n expect(agents.find((a) => a.name === \"claude-agent\")).toBeDefined();\n expect(agents.find((a) => a.name === \"gemini-agent\")).toBeDefined();\n });\n\n it(\"should sort agents by status priority (waiting first)\", async () => {\n const mockAgents = [\n createMockAgent({ name: \"idle-agent\", status: AgentStatus.IDLE }),\n createMockAgent({ name: \"waiting-agent\", status: AgentStatus.WAITING }),\n createMockAgent({ name: \"running-agent\", status: AgentStatus.RUNNING }),\n createMockAgent({ name: \"unknown-agent\", status: AgentStatus.UNKNOWN }),\n ];\n const adapter = new MockAdapter(\"claude\", mockAgents);\n\n manager.registerAdapter(adapter);\n const agents = await manager.listAgents();\n\n expect(agents[0].name).toBe(\"waiting-agent\");\n expect(agents[1].name).toBe(\"running-agent\");\n expect(agents[2].name).toBe(\"idle-agent\");\n expect(agents[3].name).toBe(\"unknown-agent\");\n });\n\n it(\"should handle adapter errors gracefully\", async () => {\n const goodAdapter = new MockAdapter(\"claude\", [createMockAgent({ name: \"good-agent\" })]);\n const badAdapter = new MockAdapter(\"gemini_cli\", [], true); // Will fail\n\n manager.registerAdapter(goodAdapter);\n manager.registerAdapter(badAdapter);\n\n // Should not throw, should return results from working adapter\n const agents = await manager.listAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].name).toBe(\"good-agent\");\n });\n\n it(\"should return empty array when all adapters fail\", async () => {\n const adapter1 = new MockAdapter(\"claude\", [], true);\n const adapter2 = new MockAdapter(\"gemini_cli\", [], true);\n\n manager.registerAdapter(adapter1);\n manager.registerAdapter(adapter2);\n\n const agents = await manager.listAgents();\n expect(agents).toEqual([]);\n });\n });\n\n describe(\"listAgents — registry persistence\", () => {\n let tmpDir: string;\n let regPath: string;\n let registry: AgentRegistry;\n let scopedManager: AgentManager;\n let nowMs: number;\n let databaseOperations: string[];\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"agent-manager-\"));\n regPath = path.join(tmpDir, \"agents.json\");\n nowMs = Date.parse(\"2026-08-14T10:00:00.000Z\");\n databaseOperations = [];\n registry = new AgentRegistry(regPath, {\n now: () => new Date(nowMs),\n pruneIntervalMs: 30_000,\n onDatabaseOperation: (sql) => databaseOperations.push(sql),\n });\n scopedManager = new AgentManager(registry);\n databaseOperations = [];\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function useHerdrPanes(panes: readonly HerdrAgentPane[]): ReturnType<typeof vi.fn> {\n const fetchHerdrPanes = vi.fn().mockResolvedValue(panes);\n scopedManager = new AgentManager(registry, undefined, {\n runtimeProvider: \"herdr\",\n fetchHerdrAgentPanes: fetchHerdrPanes,\n });\n return fetchHerdrPanes;\n }\n\n it(\"persists every detected agent to the registry\", async () => {\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"a\",\n pid: process.pid,\n sessionId: \"sid-a\",\n sessionFilePath: \"/path/a.jsonl\",\n projectPath: \"/cwd/a\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n const entries = registry.list();\n expect(entries).toHaveLength(1);\n expect(entries[0]).toMatchObject({\n name: \"a\",\n type: \"claude\",\n pid: process.pid,\n cwd: \"/cwd/a\",\n sessionId: \"sid-a\",\n sessionFilePath: \"/path/a.jsonl\",\n runtime: \"tmux\",\n runtimeRef: null,\n });\n expect(entries[0].startedAt).toMatch(/^\\d{4}-\\d{2}-\\d{2}T/);\n });\n\n it(\"persists a Herdr runtime ref for manually discovered agents matched by session id\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n agentSessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w31:p1\",\n workspaceId: \"w31\",\n tabId: \"w31:t1\",\n },\n ]);\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n sessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n sessionFilePath: \"/path/codex.jsonl\",\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.list()[0]).toMatchObject({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w31:p1\",\n workspaceId: \"w31\",\n tabId: \"w31:t1\",\n agentName: \"ai-devkit-44290\",\n },\n });\n });\n\n it(\"upgrades an existing tmux fallback row when Herdr later matches by session id\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n agentSessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w31:p1\",\n },\n ]);\n registry.register({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/ai-devkit\",\n startedAt: \"2026-09-14T00:00:00.000Z\",\n sessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n sessionFilePath: \"/path/codex.jsonl\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n sessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n sessionFilePath: \"/path/codex.jsonl\",\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.lookup(\"ai-devkit-44290\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w31:p1\",\n agentName: \"ai-devkit-44290\",\n },\n });\n });\n\n it(\"upgrades an existing tmux fallback row when Herdr matches by foreground pid\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w31:p1\",\n foregroundPids: [44290],\n },\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w32:p1\",\n foregroundPids: [process.pid],\n },\n ]);\n registry.register({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/ai-devkit\",\n startedAt: \"2026-09-14T00:00:00.000Z\",\n sessionId: `pid-${process.pid}`,\n sessionFilePath: \"\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n sessionId: `pid-${process.pid}`,\n sessionFilePath: undefined,\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.lookup(\"ai-devkit-64904\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w32:p1\",\n agentName: \"ai-devkit-64904\",\n },\n });\n });\n\n it(\"fetches Herdr panes automatically when the configured runtime is Herdr\", async () => {\n const fetchHerdrPanes = useHerdrPanes([\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w32:p1\",\n foregroundPids: [process.pid],\n },\n ]);\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n sessionId: `pid-${process.pid}`,\n sessionFilePath: undefined,\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(fetchHerdrPanes).toHaveBeenCalledOnce();\n expect(registry.lookup(\"ai-devkit-64904\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w32:p1\",\n agentName: \"ai-devkit-64904\",\n },\n });\n });\n\n it(\"upgrades an existing tmux row with a malformed runtime ref when Herdr matches\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w32:p1\",\n foregroundPids: [process.pid],\n },\n ]);\n registry.register({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: {},\n cwd: \"/cwd/ai-devkit\",\n startedAt: \"2026-09-14T00:00:00.000Z\",\n sessionId: `pid-${process.pid}`,\n sessionFilePath: \"\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n sessionId: `pid-${process.pid}`,\n sessionFilePath: undefined,\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.lookup(\"ai-devkit-64904\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w32:p1\",\n agentName: \"ai-devkit-64904\",\n },\n });\n });\n\n it(\"prunes entries for dead pids\", async () => {\n registry.register({\n name: \"dead\",\n type: \"claude\",\n pid: 999999,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/dead\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-dead\",\n sessionFilePath: \"/path/dead.jsonl\",\n });\n\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"live\", pid: process.pid })]),\n );\n\n await scopedManager.listAgents();\n\n const entries = registry.list();\n expect(entries.map((e) => e.name)).toEqual([\"live\"]);\n });\n\n it('preserves an existing name (e.g. user-set \"merry\") across cycles', async () => {\n registry.register({\n name: \"merry\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"merry\" },\n cwd: \"/cwd/merry\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-merry\",\n sessionFilePath: \"/path/merry.jsonl\",\n });\n\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"default-name\", pid: process.pid })]),\n );\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].name).toBe(\"merry\");\n expect(registry.list()[0].name).toBe(\"merry\");\n expect(registry.list()[0].runtimeRef).toEqual({ session: \"merry\" });\n expect(registry.list()[0].startedAt).toBe(\"2026-05-30T00:00:00.000Z\");\n });\n\n it(\"preserves custom name and tmux runtime ref across two EPERM refresh cycles\", async () => {\n registry.register({\n name: \"merry\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"merry-tmux\" },\n cwd: \"/cwd/merry\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-merry\",\n sessionFilePath: \"/path/merry.jsonl\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [\n createMockAgent({ name: `ai-devkit-${process.pid}`, pid: process.pid }),\n ]),\n );\n vi.spyOn(process, \"kill\").mockImplementation(() => {\n throw Object.assign(new Error(\"operation not permitted\"), { code: \"EPERM\" });\n });\n\n const firstRefresh = await scopedManager.listAgents();\n const secondRefresh = await scopedManager.listAgents();\n\n expect(firstRefresh[0].name).toBe(\"merry\");\n expect(secondRefresh[0].name).toBe(\"merry\");\n expect(registry.lookup(\"merry\")).toMatchObject({\n name: \"merry\",\n runtimeRef: { session: \"merry-tmux\" },\n });\n });\n\n it(\"preserves a user-managed name when a fallback row was written later for the same pid\", async () => {\n registry.register({\n name: \"agent-list-debug\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"agent-list-debug\" },\n cwd: \"/cwd/debug\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"pid-debug\",\n sessionFilePath: \"\",\n });\n registry.register({\n name: `ai-devkit-${process.pid}`,\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/debug\",\n startedAt: \"2026-05-31T00:00:00.000Z\",\n sessionId: \"pid-debug\",\n sessionFilePath: \"\",\n });\n\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({ name: `ai-devkit-${process.pid}`, type: \"codex\", pid: process.pid }),\n ]),\n );\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].name).toBe(\"agent-list-debug\");\n expect(registry.list()).toHaveLength(1);\n expect(registry.list()[0]).toMatchObject({\n name: \"agent-list-debug\",\n pid: process.pid,\n runtimeRef: { session: \"agent-list-debug\" },\n });\n });\n\n it(\"writes a fresh startedAt for new entries\", async () => {\n const before = new Date().toISOString();\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"new\", pid: process.pid })]),\n );\n\n await scopedManager.listAgents();\n\n const entry = registry.list()[0];\n expect(entry.startedAt >= before).toBe(true);\n });\n\n it(\"batches the write — a single registerBatch call per listAgents\", async () => {\n const spy = vi.spyOn(registry, \"registerBatch\");\n\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"a\", pid: process.pid })]),\n );\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({ name: \"b\", type: \"codex\", pid: process.pid + 1 }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(spy).toHaveBeenCalledTimes(1);\n expect((spy.mock.calls[0][0] as RegistryEntry[]).map((e) => e.name).sort()).toEqual([\n \"a\",\n \"b\",\n ]);\n });\n\n it(\"performs zero database writes on an unchanged refresh\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"stable\",\n pid: process.pid,\n projectPath: \"/cwd/stable\",\n sessionId: \"stable-session\",\n sessionFilePath: \"/sessions/stable.jsonl\",\n }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n databaseOperations = [];\n\n await scopedManager.listAgents();\n\n const writes = databaseOperations.filter((sql) =>\n /^\\s*(BEGIN|COMMIT|INSERT|UPDATE|DELETE)/i.test(sql),\n );\n expect(writes).toEqual([]);\n });\n\n it(\"exposes a persisted pin and preserves it across a changed poll refresh\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({ name: \"pinned\", pid: process.pid, sessionId: \"before\" }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n registry.togglePin(\"claude\", process.pid);\n adapter.setAgents([\n createMockAgent({ name: \"pinned\", pid: process.pid, sessionId: \"after\" }),\n ]);\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].pinned).toBe(true);\n expect(registry.lookup(\"pinned\")).toMatchObject({ sessionId: \"after\", pinned: true });\n });\n\n it(\"uses registry updated_at as lastActive for pinned recency ordering\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"recently-pinned\",\n pid: process.pid,\n lastActive: new Date(\"2026-01-01T00:00:00.000Z\"),\n }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n nowMs += 60_000;\n scopedManager.togglePin(\"recently-pinned\");\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].pinned).toBe(true);\n expect(agents[0].lastActive.toISOString()).toBe(\"2026-08-14T10:01:00.000Z\");\n });\n\n it(\"preserves adapter lastActive for unpinned agents\", async () => {\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"unpinned\",\n pid: process.pid,\n lastActive: new Date(\"2026-01-01T00:00:00.000Z\"),\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].pinned).toBe(false);\n expect(agents[0].lastActive.toISOString()).toBe(\"2026-01-01T00:00:00.000Z\");\n });\n\n it(\"does not persist passive cwd changes when an existing cwd is present\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({ name: \"changing\", pid: process.pid, projectPath: \"/cwd/before\" }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n databaseOperations = [];\n nowMs += 1_000;\n adapter.setAgents([\n createMockAgent({ name: \"changing\", pid: process.pid, projectPath: \"/cwd/after\" }),\n ]);\n\n await scopedManager.listAgents();\n\n const upserts = databaseOperations.filter((sql) => /^\\s*INSERT INTO agents/i.test(sql));\n const transactions = databaseOperations.filter((sql) => /^\\s*(BEGIN|COMMIT)/i.test(sql));\n expect(upserts).toHaveLength(0);\n expect(transactions).toHaveLength(0);\n expect(registry.lookup(\"changing\")?.cwd).toBe(\"/cwd/before\");\n });\n\n it(\"prunes newly dead entries only when the passive cadence is due\", async () => {\n registry.register({\n name: \"cadenced\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/cadenced\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-cadenced\",\n sessionFilePath: \"\",\n });\n const alive = vi.spyOn(registry, \"isAlive\").mockReturnValue(true);\n\n await scopedManager.listAgents();\n expect(alive).toHaveBeenCalledTimes(1);\n alive.mockReturnValue(false);\n nowMs += 29_999;\n\n await scopedManager.listAgents();\n expect(alive).toHaveBeenCalledTimes(1);\n expect(registry.lookup(\"cadenced\")).not.toBeNull();\n\n nowMs += 1;\n await scopedManager.listAgents();\n expect(alive).toHaveBeenCalledTimes(2);\n expect(registry.lookup(\"cadenced\")).toBeNull();\n });\n\n it(\"does not inherit a name when the same pid is reused by another agent type\", async () => {\n registry.register({\n name: \"old-claude\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"old-claude\" },\n cwd: \"/cwd/old\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"old-session\",\n sessionFilePath: \"\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"new-codex\",\n type: \"codex\",\n pid: process.pid,\n projectPath: \"/cwd/new\",\n sessionId: \"new-session\",\n }),\n ]),\n );\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].name).toBe(\"new-codex\");\n expect(registry.lookup(\"old-claude\")).toBeNull();\n expect(registry.lookup(\"new-codex\")).toMatchObject({ type: \"codex\", pid: process.pid });\n });\n\n it(\"skips registerBatch when no agents are detected and prune is not due\", async () => {\n const writeSpy = vi.spyOn(registry, \"registerBatch\");\n const pruneSpy = vi.spyOn(registry, \"pruneIfDue\");\n\n scopedManager.registerAdapter(new MockAdapter(\"claude\", []));\n await scopedManager.listAgents();\n await scopedManager.listAgents();\n\n expect(writeSpy).not.toHaveBeenCalled();\n expect(pruneSpy).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"togglePin\", () => {\n it(\"resolves the agent name to its process identity and toggles the pin\", () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"toggle.json\"));\n const scopedManager = new AgentManager(registry);\n registry.register({\n name: \"renamed-agent\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/tmp\",\n startedAt: \"2026-08-16T00:00:00.000Z\",\n sessionId: \"session\",\n sessionFilePath: \"\",\n pinned: false,\n });\n\n expect(scopedManager.togglePin(\"renamed-agent\")).toBe(true);\n expect(registry.lookup(\"renamed-agent\")?.pinned).toBe(true);\n });\n\n it(\"reports when the agent is no longer running\", () => {\n expect(() => manager.togglePin(\"missing\")).toThrow(/no longer running/i);\n });\n\n it(\"rejects a dead process and prunes its row\", () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"dead-toggle.json\"));\n const scopedManager = new AgentManager(registry);\n registry.register({\n name: \"dead\",\n type: \"claude\",\n pid: 999999,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/tmp\",\n startedAt: \"2026-08-16T00:00:00.000Z\",\n sessionId: \"session\",\n sessionFilePath: \"\",\n pinned: false,\n });\n\n expect(() => scopedManager.togglePin(\"dead\")).toThrow(/no longer running/i);\n expect(registry.lookup(\"dead\")).toBeNull();\n });\n\n it(\"surfaces a clear readonly mutation error\", () => {\n const regPath = path.join(tmpDir, \"readonly-toggle.json\");\n const writable = new AgentRegistry(regPath);\n writable.register({\n name: \"readonly-agent\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/tmp\",\n startedAt: \"2026-08-16T00:00:00.000Z\",\n sessionId: \"session\",\n sessionFilePath: \"\",\n pinned: false,\n });\n const readonlyManager = new AgentManager(new AgentRegistry(regPath, { readonly: true }));\n\n expect(() => readonlyManager.togglePin(\"readonly-agent\")).toThrow(\n \"Agent registry is readonly; cannot toggle pin.\",\n );\n });\n });\n\n describe(\"clear\", () => {\n it(\"should remove all adapters\", () => {\n manager.registerAdapter(new MockAdapter(\"claude\"));\n manager.registerAdapter(new MockAdapter(\"gemini_cli\"));\n\n manager.clear();\n\n expect(manager.getAdapterCount()).toBe(0);\n expect(manager.getAdapters()).toEqual([]);\n });\n });\n\n describe(\"listSessions\", () => {\n function createMockSession(overrides: Partial<SessionSummary> = {}): SessionSummary {\n return {\n type: \"claude\",\n sessionId: \"session-1\",\n cwd: \"/repo\",\n firstUserMessage: \"hello\",\n lastActive: new Date(\"2025-01-01T00:00:00Z\"),\n startedAt: new Date(\"2025-01-01T00:00:00Z\"),\n sessionFilePath: \"/tmp/session-1.jsonl\",\n ...overrides,\n };\n }\n\n it(\"returns empty array when no adapters are registered\", async () => {\n const result = await manager.listSessions();\n expect(result).toEqual([]);\n });\n\n it(\"merges sessions from every registered adapter\", async () => {\n const claudeSession = createMockSession({ type: \"claude\", sessionId: \"c1\" });\n const codexSession = createMockSession({ type: \"codex\", sessionId: \"cx1\" });\n manager.registerAdapter(new MockAdapter(\"claude\", [], false, [claudeSession]));\n manager.registerAdapter(new MockAdapter(\"codex\", [], false, [codexSession]));\n\n const result = await manager.listSessions();\n\n expect(result).toHaveLength(2);\n expect(result.map((s) => s.sessionId).sort()).toEqual([\"c1\", \"cx1\"]);\n });\n\n it(\"sorts merged sessions by lastActive descending\", async () => {\n const older = createMockSession({\n sessionId: \"older\",\n lastActive: new Date(\"2025-01-01T00:00:00Z\"),\n });\n const newer = createMockSession({\n type: \"codex\",\n sessionId: \"newer\",\n lastActive: new Date(\"2025-06-01T00:00:00Z\"),\n });\n manager.registerAdapter(new MockAdapter(\"claude\", [], false, [older]));\n manager.registerAdapter(new MockAdapter(\"codex\", [], false, [newer]));\n\n const result = await manager.listSessions();\n\n expect(result.map((s) => s.sessionId)).toEqual([\"newer\", \"older\"]);\n });\n\n it(\"skips adapters whose type does not match opts.type\", async () => {\n const claudeAdapter = new MockAdapter(\"claude\", [], false, [\n createMockSession({ type: \"claude\", sessionId: \"c1\" }),\n ]);\n const codexAdapter = new MockAdapter(\"codex\", [], false, [\n createMockSession({ type: \"codex\", sessionId: \"cx1\" }),\n ]);\n manager.registerAdapter(claudeAdapter);\n manager.registerAdapter(codexAdapter);\n\n const result = await manager.listSessions({ type: \"claude\" });\n\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe(\"c1\");\n // Codex adapter must not have been called\n expect(codexAdapter.lastListSessionsOpts).toBeUndefined();\n expect(claudeAdapter.lastListSessionsOpts).toEqual({ type: \"claude\" });\n });\n\n it(\"tolerates an adapter that throws and still returns the others\", async () => {\n const goodSession = createMockSession({ sessionId: \"good\" });\n manager.registerAdapter(new MockAdapter(\"claude\", [], false, [goodSession]));\n manager.registerAdapter(new MockAdapter(\"codex\", [], false, [], true /* failListSessions */));\n\n const consoleErrorSpy = vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n\n try {\n const result = await manager.listSessions();\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe(\"good\");\n expect(consoleErrorSpy).toHaveBeenCalled();\n } finally {\n consoleErrorSpy.mockRestore();\n }\n });\n\n it(\"passes the same opts to every called adapter\", async () => {\n const a = new MockAdapter(\"claude\", [], false, []);\n const b = new MockAdapter(\"codex\", [], false, []);\n manager.registerAdapter(a);\n manager.registerAdapter(b);\n\n await manager.listSessions({ cwd: \"/Users/test/proj\" });\n\n expect(a.lastListSessionsOpts).toEqual({ cwd: \"/Users/test/proj\" });\n expect(b.lastListSessionsOpts).toEqual({ cwd: \"/Users/test/proj\" });\n });\n });\n\n describe(\"findSessionsById\", () => {\n const session = (type: AgentType, sessionId: string): SessionSummary => ({\n type,\n sessionId,\n cwd: \"/repo\",\n firstUserMessage: \"hello\",\n lastActive: new Date(\"2025-01-01T00:00:00Z\"),\n startedAt: new Date(\"2025-01-01T00:00:00Z\"),\n sessionFilePath: `/tmp/${sessionId}`,\n });\n\n it(\"uses each built-in adapter direct lookup and preserves cross-provider ambiguity\", async () => {\n const claude = new MockAdapter(\"claude\", [], false, [session(\"claude\", \"shared\")]);\n const codex = new MockAdapter(\"codex\", [], false, [session(\"codex\", \"shared\")]);\n manager.registerAdapter(claude);\n manager.registerAdapter(codex);\n\n const result = await manager.findSessionsById(\"shared\");\n\n expect(result).toHaveLength(2);\n expect(claude.findSessionsByIdCalls).toEqual([\"shared\"]);\n expect(codex.findSessionsByIdCalls).toEqual([\"shared\"]);\n expect(claude.lastListSessionsOpts).toBeUndefined();\n expect(codex.lastListSessionsOpts).toBeUndefined();\n });\n\n it(\"skips non-matching providers when type is supplied\", async () => {\n const claude = new MockAdapter(\"claude\", [], false, [session(\"claude\", \"target\")]);\n const codex = new MockAdapter(\"codex\", [], false, [session(\"codex\", \"target\")]);\n manager.registerAdapter(claude);\n manager.registerAdapter(codex);\n\n const result = await manager.findSessionsById(\"target\", { type: \"codex\" });\n\n expect(result).toEqual([expect.objectContaining({ type: \"codex\", sessionId: \"target\" })]);\n expect(claude.findSessionsByIdCalls).toEqual([]);\n expect(codex.findSessionsByIdCalls).toEqual([\"target\"]);\n });\n\n it(\"falls back to filtered listing for external adapters without direct lookup\", async () => {\n const external = new MockAdapter(\"other\", [], false, [\n session(\"other\", \"target\"),\n session(\"other\", \"different\"),\n ]);\n (external as Partial<AgentAdapter>).findSessionsById = undefined;\n manager.registerAdapter(external);\n\n const result = await manager.findSessionsById(\"target\");\n\n expect(result).toEqual([expect.objectContaining({ sessionId: \"target\" })]);\n expect(external.lastListSessionsOpts).toEqual(undefined);\n });\n });\n\n describe(\"resolveAgent\", () => {\n it(\"should return null for empty input or empty agents list\", () => {\n const agent = createMockAgent({ name: \"test-agent\" });\n expect(manager.resolveAgent(\"\", [agent])).toBeNull();\n expect(manager.resolveAgent(\"test\", [])).toBeNull();\n });\n\n it(\"should resolve exact match (case-insensitive)\", () => {\n const agent = createMockAgent({ name: \"My-Agent\" });\n const agents = [agent, createMockAgent({ name: \"Other\" })];\n\n // Exact match\n expect(manager.resolveAgent(\"My-Agent\", agents)).toBe(agent);\n // Case-insensitive\n expect(manager.resolveAgent(\"my-agent\", agents)).toBe(agent);\n });\n\n it(\"should resolve unique partial match\", () => {\n const agent = createMockAgent({ name: \"ai-devkit\" });\n const agents = [agent, createMockAgent({ name: \"other-project\" })];\n\n const result = manager.resolveAgent(\"dev\", agents);\n expect(result).toBe(agent);\n });\n\n it(\"should return array for ambiguous partial match\", () => {\n const agent1 = createMockAgent({ name: \"my-website\" });\n const agent2 = createMockAgent({ name: \"my-app\" });\n const agents = [agent1, agent2, createMockAgent({ name: \"other\" })];\n\n const result = manager.resolveAgent(\"my\", agents);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as AgentInfo[];\n expect(matches).toHaveLength(2);\n expect(matches).toContain(agent1);\n expect(matches).toContain(agent2);\n });\n\n it(\"should return null for no match\", () => {\n const agents = [createMockAgent({ name: \"ai-devkit\" })];\n expect(manager.resolveAgent(\"xyz\", agents)).toBeNull();\n });\n\n it(\"should prefer exact match over partial matches\", () => {\n // Edge case: \"test\" matches \"test\" (exact) and \"testing\" (partial)\n // Should return exact \"test\"\n const exact = createMockAgent({ name: \"test\" });\n const partial = createMockAgent({ name: \"testing\" });\n const agents = [exact, partial];\n\n expect(manager.resolveAgent(\"test\", agents)).toBe(exact);\n });\n });\n});\n"],"names":["fs","os","path","AgentManager","AgentStatus","AgentRegistry","MockAdapter","lastListSessionsOpts","undefined","findSessionsByIdCalls","type","mockAgents","shouldFail","mockSessions","shouldFailListSessions","detectAgents","Error","canHandle","getConversation","listSessions","opts","findSessionsById","sessionId","push","filter","session","setAgents","agents","setFail","setSessions","sessions","setFailListSessions","createMockAgent","overrides","name","status","RUNNING","summary","pid","projectPath","lastActive","Date","describe","manager","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","it","adapter","registerAdapter","expect","hasAdapter","toBe","getAdapterCount","adapter1","adapter2","toThrow","removed","unregisterAdapter","adapters","getAdapters","toEqual","toHaveLength","toContain","processes","command","cwd","tty","captureSnapshot","vi","fn","createSnapshotAdapter","processNames","claude","pi","snapshotManager","listAgents","toHaveBeenCalledTimes","toHaveBeenCalledWith","gemini","codex","legacy","detect","spyOn","not","toHaveBeenCalled","claudeAgents","geminiAgents","find","a","toBeDefined","IDLE","WAITING","UNKNOWN","goodAdapter","badAdapter","regPath","registry","scopedManager","nowMs","databaseOperations","parse","now","pruneIntervalMs","onDatabaseOperation","sql","restoreAllMocks","useHerdrPanes","panes","fetchHerdrPanes","mockResolvedValue","runtimeProvider","fetchHerdrAgentPanes","process","sessionFilePath","entries","list","toMatchObject","runtime","runtimeRef","startedAt","toMatch","agent","agentSessionId","paneId","workspaceId","tabId","agentName","register","lookup","foregroundPids","toHaveBeenCalledOnce","map","e","mockImplementation","Object","assign","code","firstRefresh","secondRefresh","before","toISOString","entry","spy","mock","calls","sort","writes","test","togglePin","pinned","upserts","transactions","alive","mockReturnValue","toBeNull","writeSpy","pruneSpy","writable","readonlyManager","readonly","clear","createMockSession","firstUserMessage","result","claudeSession","codexSession","s","older","newer","claudeAdapter","codexAdapter","toBeUndefined","goodSession","consoleErrorSpy","console","mockRestore","b","objectContaining","external","resolveAgent","agent1","agent2","Array","isArray","matches","exact","partial"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/__tests__/AgentManager.test.ts"],"sourcesContent":["/**\n * Tests for AgentManager\n */\n\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { AgentManager } from \"../AgentManager.js\";\nimport type {\n AgentAdapter,\n AgentInfo,\n AgentType,\n ConversationMessage,\n SessionSummary,\n ProcessInfo,\n} from \"../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../adapters/AgentAdapter.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../utils/AgentRegistry.js\";\nimport { createProcessSnapshotCapture, type ProcessExec } from \"../utils/process.js\";\nimport type { HerdrAgentPane } from \"../runtime/herdr/HerdrAgentDiscovery.js\";\n\n// Mock adapter for testing\nclass MockAdapter implements AgentAdapter {\n public lastListSessionsOpts: unknown = undefined;\n public findSessionsByIdCalls: string[] = [];\n\n constructor(\n public readonly type: AgentType,\n private mockAgents: AgentInfo[] = [],\n private shouldFail: boolean = false,\n private mockSessions: SessionSummary[] = [],\n private shouldFailListSessions: boolean = false,\n ) {}\n\n async detectAgents(): Promise<AgentInfo[]> {\n if (this.shouldFail) {\n throw new Error(`Mock adapter ${this.type} failed`);\n }\n return this.mockAgents;\n }\n\n canHandle(): boolean {\n return true;\n }\n\n getConversation(): ConversationMessage[] {\n return [];\n }\n\n async listSessions(opts?: unknown): Promise<SessionSummary[]> {\n this.lastListSessionsOpts = opts;\n if (this.shouldFailListSessions) {\n throw new Error(`Mock adapter ${this.type} listSessions failed`);\n }\n return this.mockSessions;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n this.findSessionsByIdCalls.push(sessionId);\n return this.mockSessions.filter((session) => session.sessionId === sessionId);\n }\n\n setAgents(agents: AgentInfo[]): void {\n this.mockAgents = agents;\n }\n\n setFail(shouldFail: boolean): void {\n this.shouldFail = shouldFail;\n }\n\n setSessions(sessions: SessionSummary[]): void {\n this.mockSessions = sessions;\n }\n\n setFailListSessions(shouldFail: boolean): void {\n this.shouldFailListSessions = shouldFail;\n }\n}\n\n// Helper to create mock agent\nfunction createMockAgent(overrides: Partial<AgentInfo> = {}): AgentInfo {\n return {\n name: \"test-agent\",\n type: \"claude\",\n status: AgentStatus.RUNNING,\n summary: \"Test summary\",\n pid: 12345,\n projectPath: \"/test/path\",\n sessionId: \"test-session-id\",\n lastActive: new Date(),\n ...overrides,\n };\n}\n\ndescribe(\"AgentManager\", () => {\n let manager: AgentManager;\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"agent-manager-\"));\n manager = new AgentManager(new AgentRegistry(path.join(tmpDir, \"agents.json\")));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe(\"registerAdapter\", () => {\n it(\"should register a new adapter\", () => {\n const adapter = new MockAdapter(\"claude\");\n\n manager.registerAdapter(adapter);\n\n expect(manager.hasAdapter(\"claude\")).toBe(true);\n expect(manager.getAdapterCount()).toBe(1);\n });\n\n it(\"should throw error when registering duplicate adapter type\", () => {\n const adapter1 = new MockAdapter(\"claude\");\n const adapter2 = new MockAdapter(\"claude\");\n\n manager.registerAdapter(adapter1);\n\n expect(() => manager.registerAdapter(adapter2)).toThrow(\n 'Adapter for type \"claude\" is already registered',\n );\n });\n\n it(\"should allow registering multiple different adapter types\", () => {\n const adapter1 = new MockAdapter(\"claude\");\n const adapter2 = new MockAdapter(\"gemini_cli\");\n\n manager.registerAdapter(adapter1);\n manager.registerAdapter(adapter2);\n\n expect(manager.getAdapterCount()).toBe(2);\n expect(manager.hasAdapter(\"claude\")).toBe(true);\n expect(manager.hasAdapter(\"gemini_cli\")).toBe(true);\n });\n });\n\n describe(\"unregisterAdapter\", () => {\n it(\"should unregister an existing adapter\", () => {\n const adapter = new MockAdapter(\"claude\");\n manager.registerAdapter(adapter);\n\n const removed = manager.unregisterAdapter(\"claude\");\n\n expect(removed).toBe(true);\n expect(manager.hasAdapter(\"claude\")).toBe(false);\n expect(manager.getAdapterCount()).toBe(0);\n });\n\n it(\"should return false when unregistering non-existent adapter\", () => {\n const removed = manager.unregisterAdapter(\"NonExistent\");\n expect(removed).toBe(false);\n });\n });\n\n describe(\"getAdapters\", () => {\n it(\"should return empty array when no adapters registered\", () => {\n const adapters = manager.getAdapters();\n expect(adapters).toEqual([]);\n });\n\n it(\"should return all registered adapters\", () => {\n const adapter1 = new MockAdapter(\"claude\");\n const adapter2 = new MockAdapter(\"gemini_cli\");\n\n manager.registerAdapter(adapter1);\n manager.registerAdapter(adapter2);\n\n const adapters = manager.getAdapters();\n expect(adapters).toHaveLength(2);\n expect(adapters).toContain(adapter1);\n expect(adapters).toContain(adapter2);\n });\n });\n\n describe(\"listAgents\", () => {\n it(\"shares one process capture while giving each adapter only its declared executables\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 101, command: \"claude\", cwd: \"/claude\", tty: \"s001\" },\n { pid: 202, command: \"node /bin/pi\", cwd: \"/pi\", tty: \"s002\" },\n ];\n const captureSnapshot = vi.fn(async () => processes);\n const createSnapshotAdapter = (type: AgentType, processNames: string[]) => ({\n type,\n processNames,\n detectAgents: vi.fn(async () => []),\n canHandle: () => true,\n getConversation: () => [],\n listSessions: async () => [],\n });\n const claude = createSnapshotAdapter(\"claude\", [\"claude\"]);\n const pi = createSnapshotAdapter(\"pi\", [\"pi\", \"node\"]);\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"snapshot-agents.json\")),\n captureSnapshot,\n );\n\n snapshotManager.registerAdapter(claude as AgentAdapter);\n snapshotManager.registerAdapter(pi as AgentAdapter);\n\n await snapshotManager.listAgents();\n\n expect(captureSnapshot).toHaveBeenCalledTimes(1);\n expect(captureSnapshot).toHaveBeenCalledWith([\"claude\", \"pi\", \"node\"], {\n isCandidate: expect.any(Function),\n });\n expect(claude.detectAgents).toHaveBeenCalledWith({ processes: [processes[0]] });\n expect(pi.detectAgents).toHaveBeenCalledWith({ processes: [processes[1]] });\n });\n\n it(\"does not expose foreign command arguments to broad Pi and Gemini matchers\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"node /usr/local/lib/gemini.js\", cwd: \"/g\", tty: \"s001\" },\n { pid: 200, command: \"codex exec --cd /Users/x/repos/gemini\", cwd: \"/c\", tty: \"s002\" },\n { pid: 300, command: \"node /usr/local/lib/pi.js\", cwd: \"/p\", tty: \"s003\" },\n { pid: 400, command: \"claude --resume /Users/x/pi/session.jsonl\", cwd: \"/a\", tty: \"s004\" },\n ];\n const captureSnapshot = vi.fn(async () => processes);\n const createSnapshotAdapter = (type: AgentType, processNames: string[]) => ({\n type,\n processNames,\n detectAgents: vi.fn(async () => []),\n canHandle: () => true,\n getConversation: () => [],\n listSessions: async () => [],\n });\n const gemini = createSnapshotAdapter(\"gemini_cli\", [\"node\"]);\n const codex = createSnapshotAdapter(\"codex\", [\"codex\"]);\n const pi = createSnapshotAdapter(\"pi\", [\"pi\", \"node\"]);\n const claude = createSnapshotAdapter(\"claude\", [\"claude\"]);\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"filtered-snapshot-agents.json\")),\n captureSnapshot,\n );\n\n snapshotManager.registerAdapter(gemini as AgentAdapter);\n snapshotManager.registerAdapter(codex as AgentAdapter);\n snapshotManager.registerAdapter(pi as AgentAdapter);\n snapshotManager.registerAdapter(claude as AgentAdapter);\n\n await snapshotManager.listAgents();\n\n expect(captureSnapshot).toHaveBeenCalledTimes(1);\n expect(captureSnapshot).toHaveBeenCalledWith([\"node\", \"codex\", \"pi\", \"claude\"], {\n isCandidate: expect.any(Function),\n });\n expect(gemini.detectAgents).toHaveBeenCalledWith({ processes: [processes[0], processes[2]] });\n expect(codex.detectAgents).toHaveBeenCalledWith({ processes: [processes[1]] });\n expect(pi.detectAgents).toHaveBeenCalledWith({ processes: [processes[0], processes[2]] });\n expect(claude.detectAgents).toHaveBeenCalledWith({ processes: [processes[3]] });\n });\n\n describe(\"candidate-only enrichment\", () => {\n const pidsArg = (args: readonly string[]) =>\n args[args.indexOf(\"-p\") + 1].split(\",\").map((pid) => parseInt(pid, 10));\n\n function createExec(psLines: string[]) {\n const exec = vi.fn<ProcessExec>(async (file, args) => {\n if (file === \"ps\" && args.includes(\"-axo\")) return psLines.join(\"\\n\");\n if (file === \"lsof\")\n return pidsArg(args)\n .map((pid) => `p${pid}\\nn/w/${pid}`)\n .join(\"\\n\");\n if (file === \"ps\") {\n return pidsArg(args)\n .map((pid) => `${pid} Wed Mar 18 23:18:01 2026`)\n .join(\"\\n\");\n }\n throw new Error(`unexpected command: ${file}`);\n });\n const enriched = (kind: \"lsof\" | \"lstart\") =>\n exec.mock.calls\n .filter(([file, args]) =>\n kind === \"lsof\" ? file === \"lsof\" : args.some((arg) => arg.includes(\"lstart=\")),\n )\n .map(([, args]) => pidsArg(args));\n return { exec, enriched };\n }\n\n const createAdapter = (\n type: AgentType,\n processNames: string[],\n canHandle: (process: ProcessInfo) => boolean,\n ) => ({\n type,\n processNames,\n detectAgents: vi.fn(async () => []),\n canHandle,\n getConversation: () => [],\n listSessions: async () => [],\n });\n\n const unrelatedNode = Array.from(\n { length: 50 },\n (_, index) => `${1000 + index} 1 ?? node /Applications/Tool${index}.app/helper.js`,\n );\n\n it(\"runs lsof and ps lstart only for PIDs some adapter can handle\", async () => {\n const { exec, enriched } = createExec([\n ...unrelatedNode,\n \"200 1 s001 node /usr/local/bin/gemini\",\n \"300 1 s002 node /usr/local/lib/pi.js\",\n \"400 1 s003 codex exec --cd /repos/gemini\",\n ]);\n const gemini = createAdapter(\"gemini_cli\", [\"node\"], (p) => p.command.includes(\"gemini\"));\n const pi = createAdapter(\"pi\", [\"pi\", \"node\"], (p) => p.command.includes(\"pi.js\"));\n const codex = createAdapter(\"codex\", [\"codex\"], () => false);\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"candidate-agents.json\")),\n createProcessSnapshotCapture({ exec }),\n );\n snapshotManager.registerAdapter(gemini as AgentAdapter);\n snapshotManager.registerAdapter(pi as AgentAdapter);\n snapshotManager.registerAdapter(codex as AgentAdapter);\n\n await snapshotManager.listAgents();\n\n expect(enriched(\"lsof\")).toEqual([[200, 300]]);\n expect(enriched(\"lstart\")).toEqual([[200, 300]]);\n const geminiProcesses = gemini.detectAgents.mock.calls[0][0].processes as ProcessInfo[];\n expect(geminiProcesses).toHaveLength(52);\n expect(geminiProcesses.find((p) => p.pid === 200)).toMatchObject({ cwd: \"/w/200\" });\n expect(geminiProcesses.find((p) => p.pid === 1000)).toMatchObject({ cwd: \"\" });\n });\n\n it(\"spawns only the base ps on a refresh with no candidate processes\", async () => {\n const { exec } = createExec(unrelatedNode);\n const gemini = createAdapter(\"gemini_cli\", [\"node\"], (p) => p.command.includes(\"gemini\"));\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"no-candidate-agents.json\")),\n createProcessSnapshotCapture({ exec }),\n );\n snapshotManager.registerAdapter(gemini as AgentAdapter);\n\n await snapshotManager.listAgents();\n await snapshotManager.listAgents();\n\n expect(exec).toHaveBeenCalledTimes(2);\n for (const [file, args] of exec.mock.calls) {\n expect(file).toBe(\"ps\");\n expect(args).toContain(\"-axo\");\n }\n });\n\n it(\"only checks canHandle for adapters whose executables match\", async () => {\n const { exec, enriched } = createExec([\"200 1 s001 node /usr/local/bin/gemini\"]);\n const claude = createAdapter(\"claude\", [\"claude\"], () => true);\n const gemini = createAdapter(\"gemini_cli\", [\"node\"], () => false);\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"scoped-candidate-agents.json\")),\n createProcessSnapshotCapture({ exec }),\n );\n snapshotManager.registerAdapter(claude as AgentAdapter);\n snapshotManager.registerAdapter(gemini as AgentAdapter);\n\n await snapshotManager.listAgents();\n\n expect(enriched(\"lsof\")).toEqual([]);\n });\n\n it(\"fetches start times once per PID across refreshes\", async () => {\n const { exec, enriched } = createExec([\n ...unrelatedNode,\n \"200 1 s001 node /usr/local/bin/gemini\",\n ]);\n const gemini = createAdapter(\"gemini_cli\", [\"node\"], (p) => p.command.includes(\"gemini\"));\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"cached-agents.json\")),\n createProcessSnapshotCapture({ exec }),\n );\n snapshotManager.registerAdapter(gemini as AgentAdapter);\n\n await snapshotManager.listAgents();\n await snapshotManager.listAgents();\n await snapshotManager.listAgents();\n\n expect(enriched(\"lstart\")).toEqual([[200]]);\n expect(enriched(\"lsof\")).toEqual([[200], [200], [200]]);\n const lastCall = gemini.detectAgents.mock.calls[2][0].processes as ProcessInfo[];\n expect(lastCall.find((p) => p.pid === 200)?.startTime).toEqual(\n new Date(\"Wed Mar 18 23:18:01 2026\"),\n );\n });\n });\n\n it(\"does not pass a snapshot context to legacy adapters\", async () => {\n const captureSnapshot = vi.fn(async () => []);\n const legacy = new MockAdapter(\"claude\");\n const detect = vi.spyOn(legacy, \"detectAgents\");\n const snapshotManager = new AgentManager(\n new AgentRegistry(path.join(tmpDir, \"legacy-agents.json\")),\n captureSnapshot,\n );\n snapshotManager.registerAdapter(legacy);\n\n await snapshotManager.listAgents();\n\n expect(captureSnapshot).not.toHaveBeenCalled();\n expect(detect).toHaveBeenCalledWith();\n });\n\n it(\"should return empty array when no adapters registered\", async () => {\n const agents = await manager.listAgents();\n expect(agents).toEqual([]);\n });\n\n it(\"should return agents from single adapter\", async () => {\n const mockAgents = [createMockAgent({ name: \"agent1\" }), createMockAgent({ name: \"agent2\" })];\n const adapter = new MockAdapter(\"claude\", mockAgents);\n\n manager.registerAdapter(adapter);\n const agents = await manager.listAgents();\n\n expect(agents).toHaveLength(2);\n expect(agents[0].name).toBe(\"agent1\");\n expect(agents[1].name).toBe(\"agent2\");\n });\n\n it(\"should aggregate agents from multiple adapters\", async () => {\n const claudeAgents = [createMockAgent({ name: \"claude-agent\", type: \"claude\" })];\n const geminiAgents = [createMockAgent({ name: \"gemini-agent\", type: \"gemini_cli\" })];\n\n manager.registerAdapter(new MockAdapter(\"claude\", claudeAgents));\n manager.registerAdapter(new MockAdapter(\"gemini_cli\", geminiAgents));\n\n const agents = await manager.listAgents();\n\n expect(agents).toHaveLength(2);\n expect(agents.find((a) => a.name === \"claude-agent\")).toBeDefined();\n expect(agents.find((a) => a.name === \"gemini-agent\")).toBeDefined();\n });\n\n it(\"should sort agents by status priority (waiting first)\", async () => {\n const mockAgents = [\n createMockAgent({ name: \"idle-agent\", status: AgentStatus.IDLE }),\n createMockAgent({ name: \"waiting-agent\", status: AgentStatus.WAITING }),\n createMockAgent({ name: \"running-agent\", status: AgentStatus.RUNNING }),\n createMockAgent({ name: \"unknown-agent\", status: AgentStatus.UNKNOWN }),\n ];\n const adapter = new MockAdapter(\"claude\", mockAgents);\n\n manager.registerAdapter(adapter);\n const agents = await manager.listAgents();\n\n expect(agents[0].name).toBe(\"waiting-agent\");\n expect(agents[1].name).toBe(\"running-agent\");\n expect(agents[2].name).toBe(\"idle-agent\");\n expect(agents[3].name).toBe(\"unknown-agent\");\n });\n\n it(\"should handle adapter errors gracefully\", async () => {\n const goodAdapter = new MockAdapter(\"claude\", [createMockAgent({ name: \"good-agent\" })]);\n const badAdapter = new MockAdapter(\"gemini_cli\", [], true); // Will fail\n\n manager.registerAdapter(goodAdapter);\n manager.registerAdapter(badAdapter);\n\n // Should not throw, should return results from working adapter\n const agents = await manager.listAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].name).toBe(\"good-agent\");\n });\n\n it(\"should return empty array when all adapters fail\", async () => {\n const adapter1 = new MockAdapter(\"claude\", [], true);\n const adapter2 = new MockAdapter(\"gemini_cli\", [], true);\n\n manager.registerAdapter(adapter1);\n manager.registerAdapter(adapter2);\n\n const agents = await manager.listAgents();\n expect(agents).toEqual([]);\n });\n });\n\n describe(\"listAgents — registry persistence\", () => {\n let tmpDir: string;\n let regPath: string;\n let registry: AgentRegistry;\n let scopedManager: AgentManager;\n let nowMs: number;\n let databaseOperations: string[];\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"agent-manager-\"));\n regPath = path.join(tmpDir, \"agents.json\");\n nowMs = Date.parse(\"2026-08-14T10:00:00.000Z\");\n databaseOperations = [];\n registry = new AgentRegistry(regPath, {\n now: () => new Date(nowMs),\n pruneIntervalMs: 30_000,\n onDatabaseOperation: (sql) => databaseOperations.push(sql),\n });\n scopedManager = new AgentManager(registry);\n databaseOperations = [];\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function useHerdrPanes(panes: readonly HerdrAgentPane[]): ReturnType<typeof vi.fn> {\n const fetchHerdrPanes = vi.fn().mockResolvedValue(panes);\n scopedManager = new AgentManager(registry, undefined, {\n runtimeProvider: \"herdr\",\n fetchHerdrAgentPanes: fetchHerdrPanes,\n });\n return fetchHerdrPanes;\n }\n\n it(\"persists every detected agent to the registry\", async () => {\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"a\",\n pid: process.pid,\n sessionId: \"sid-a\",\n sessionFilePath: \"/path/a.jsonl\",\n projectPath: \"/cwd/a\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n const entries = registry.list();\n expect(entries).toHaveLength(1);\n expect(entries[0]).toMatchObject({\n name: \"a\",\n type: \"claude\",\n pid: process.pid,\n cwd: \"/cwd/a\",\n sessionId: \"sid-a\",\n sessionFilePath: \"/path/a.jsonl\",\n runtime: \"tmux\",\n runtimeRef: null,\n });\n expect(entries[0].startedAt).toMatch(/^\\d{4}-\\d{2}-\\d{2}T/);\n });\n\n it(\"persists a Herdr runtime ref for manually discovered agents matched by session id\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n agentSessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w31:p1\",\n workspaceId: \"w31\",\n tabId: \"w31:t1\",\n },\n ]);\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n sessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n sessionFilePath: \"/path/codex.jsonl\",\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.list()[0]).toMatchObject({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w31:p1\",\n workspaceId: \"w31\",\n tabId: \"w31:t1\",\n agentName: \"ai-devkit-44290\",\n },\n });\n });\n\n it(\"upgrades an existing tmux fallback row when Herdr later matches by session id\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n agentSessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w31:p1\",\n },\n ]);\n registry.register({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/ai-devkit\",\n startedAt: \"2026-09-14T00:00:00.000Z\",\n sessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n sessionFilePath: \"/path/codex.jsonl\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-44290\",\n type: \"codex\",\n pid: process.pid,\n sessionId: \"01a0a05e-751f-7850-9fd7-247e297f9ac5\",\n sessionFilePath: \"/path/codex.jsonl\",\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.lookup(\"ai-devkit-44290\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w31:p1\",\n agentName: \"ai-devkit-44290\",\n },\n });\n });\n\n it(\"upgrades an existing tmux fallback row when Herdr matches by foreground pid\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w31:p1\",\n foregroundPids: [44290],\n },\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w32:p1\",\n foregroundPids: [process.pid],\n },\n ]);\n registry.register({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/ai-devkit\",\n startedAt: \"2026-09-14T00:00:00.000Z\",\n sessionId: `pid-${process.pid}`,\n sessionFilePath: \"\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n sessionId: `pid-${process.pid}`,\n sessionFilePath: undefined,\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.lookup(\"ai-devkit-64904\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w32:p1\",\n agentName: \"ai-devkit-64904\",\n },\n });\n });\n\n it(\"fetches Herdr panes automatically when the configured runtime is Herdr\", async () => {\n const fetchHerdrPanes = useHerdrPanes([\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w32:p1\",\n foregroundPids: [process.pid],\n },\n ]);\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n sessionId: `pid-${process.pid}`,\n sessionFilePath: undefined,\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(fetchHerdrPanes).toHaveBeenCalledOnce();\n expect(registry.lookup(\"ai-devkit-64904\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w32:p1\",\n agentName: \"ai-devkit-64904\",\n },\n });\n });\n\n it(\"upgrades an existing tmux row with a malformed runtime ref when Herdr matches\", async () => {\n useHerdrPanes([\n {\n agent: \"codex\",\n cwd: \"/cwd/ai-devkit\",\n paneId: \"w32:p1\",\n foregroundPids: [process.pid],\n },\n ]);\n registry.register({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: {},\n cwd: \"/cwd/ai-devkit\",\n startedAt: \"2026-09-14T00:00:00.000Z\",\n sessionId: `pid-${process.pid}`,\n sessionFilePath: \"\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"ai-devkit-64904\",\n type: \"codex\",\n pid: process.pid,\n sessionId: `pid-${process.pid}`,\n sessionFilePath: undefined,\n projectPath: \"/cwd/ai-devkit\",\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(registry.lookup(\"ai-devkit-64904\")).toMatchObject({\n runtime: \"herdr\",\n runtimeRef: {\n session: \"default\",\n paneId: \"w32:p1\",\n agentName: \"ai-devkit-64904\",\n },\n });\n });\n\n it(\"prunes entries for dead pids\", async () => {\n registry.register({\n name: \"dead\",\n type: \"claude\",\n pid: 999999,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/dead\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-dead\",\n sessionFilePath: \"/path/dead.jsonl\",\n });\n\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"live\", pid: process.pid })]),\n );\n\n await scopedManager.listAgents();\n\n const entries = registry.list();\n expect(entries.map((e) => e.name)).toEqual([\"live\"]);\n });\n\n it('preserves an existing name (e.g. user-set \"merry\") across cycles', async () => {\n registry.register({\n name: \"merry\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"merry\" },\n cwd: \"/cwd/merry\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-merry\",\n sessionFilePath: \"/path/merry.jsonl\",\n });\n\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"default-name\", pid: process.pid })]),\n );\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].name).toBe(\"merry\");\n expect(registry.list()[0].name).toBe(\"merry\");\n expect(registry.list()[0].runtimeRef).toEqual({ session: \"merry\" });\n expect(registry.list()[0].startedAt).toBe(\"2026-05-30T00:00:00.000Z\");\n });\n\n it(\"preserves custom name and tmux runtime ref across two EPERM refresh cycles\", async () => {\n registry.register({\n name: \"merry\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"merry-tmux\" },\n cwd: \"/cwd/merry\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-merry\",\n sessionFilePath: \"/path/merry.jsonl\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [\n createMockAgent({ name: `ai-devkit-${process.pid}`, pid: process.pid }),\n ]),\n );\n vi.spyOn(process, \"kill\").mockImplementation(() => {\n throw Object.assign(new Error(\"operation not permitted\"), { code: \"EPERM\" });\n });\n\n const firstRefresh = await scopedManager.listAgents();\n const secondRefresh = await scopedManager.listAgents();\n\n expect(firstRefresh[0].name).toBe(\"merry\");\n expect(secondRefresh[0].name).toBe(\"merry\");\n expect(registry.lookup(\"merry\")).toMatchObject({\n name: \"merry\",\n runtimeRef: { session: \"merry-tmux\" },\n });\n });\n\n it(\"preserves a user-managed name when a fallback row was written later for the same pid\", async () => {\n registry.register({\n name: \"agent-list-debug\",\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"agent-list-debug\" },\n cwd: \"/cwd/debug\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"pid-debug\",\n sessionFilePath: \"\",\n });\n registry.register({\n name: `ai-devkit-${process.pid}`,\n type: \"codex\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/debug\",\n startedAt: \"2026-05-31T00:00:00.000Z\",\n sessionId: \"pid-debug\",\n sessionFilePath: \"\",\n });\n\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({ name: `ai-devkit-${process.pid}`, type: \"codex\", pid: process.pid }),\n ]),\n );\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].name).toBe(\"agent-list-debug\");\n expect(registry.list()).toHaveLength(1);\n expect(registry.list()[0]).toMatchObject({\n name: \"agent-list-debug\",\n pid: process.pid,\n runtimeRef: { session: \"agent-list-debug\" },\n });\n });\n\n it(\"writes a fresh startedAt for new entries\", async () => {\n const before = new Date().toISOString();\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"new\", pid: process.pid })]),\n );\n\n await scopedManager.listAgents();\n\n const entry = registry.list()[0];\n expect(entry.startedAt >= before).toBe(true);\n });\n\n it(\"batches the write — a single registerBatch call per listAgents\", async () => {\n const spy = vi.spyOn(registry, \"registerBatch\");\n\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [createMockAgent({ name: \"a\", pid: process.pid })]),\n );\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({ name: \"b\", type: \"codex\", pid: process.pid + 1 }),\n ]),\n );\n\n await scopedManager.listAgents();\n\n expect(spy).toHaveBeenCalledTimes(1);\n expect((spy.mock.calls[0][0] as RegistryEntry[]).map((e) => e.name).sort()).toEqual([\n \"a\",\n \"b\",\n ]);\n });\n\n it(\"performs zero database writes on an unchanged refresh\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"stable\",\n pid: process.pid,\n projectPath: \"/cwd/stable\",\n sessionId: \"stable-session\",\n sessionFilePath: \"/sessions/stable.jsonl\",\n }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n databaseOperations = [];\n\n await scopedManager.listAgents();\n\n const writes = databaseOperations.filter((sql) =>\n /^\\s*(BEGIN|COMMIT|INSERT|UPDATE|DELETE)/i.test(sql),\n );\n expect(writes).toEqual([]);\n });\n\n it(\"exposes a persisted pin and preserves it across a changed poll refresh\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({ name: \"pinned\", pid: process.pid, sessionId: \"before\" }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n registry.togglePin(\"claude\", process.pid);\n adapter.setAgents([\n createMockAgent({ name: \"pinned\", pid: process.pid, sessionId: \"after\" }),\n ]);\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].pinned).toBe(true);\n expect(registry.lookup(\"pinned\")).toMatchObject({ sessionId: \"after\", pinned: true });\n });\n\n it(\"uses registry updated_at as lastActive for pinned recency ordering\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"recently-pinned\",\n pid: process.pid,\n lastActive: new Date(\"2026-01-01T00:00:00.000Z\"),\n }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n nowMs += 60_000;\n scopedManager.togglePin(\"recently-pinned\");\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].pinned).toBe(true);\n expect(agents[0].lastActive.toISOString()).toBe(\"2026-08-14T10:01:00.000Z\");\n });\n\n it(\"preserves adapter lastActive for unpinned agents\", async () => {\n scopedManager.registerAdapter(\n new MockAdapter(\"claude\", [\n createMockAgent({\n name: \"unpinned\",\n pid: process.pid,\n lastActive: new Date(\"2026-01-01T00:00:00.000Z\"),\n }),\n ]),\n );\n\n await scopedManager.listAgents();\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].pinned).toBe(false);\n expect(agents[0].lastActive.toISOString()).toBe(\"2026-01-01T00:00:00.000Z\");\n });\n\n it(\"does not persist passive cwd changes when an existing cwd is present\", async () => {\n const adapter = new MockAdapter(\"claude\", [\n createMockAgent({ name: \"changing\", pid: process.pid, projectPath: \"/cwd/before\" }),\n ]);\n scopedManager.registerAdapter(adapter);\n await scopedManager.listAgents();\n databaseOperations = [];\n nowMs += 1_000;\n adapter.setAgents([\n createMockAgent({ name: \"changing\", pid: process.pid, projectPath: \"/cwd/after\" }),\n ]);\n\n await scopedManager.listAgents();\n\n const upserts = databaseOperations.filter((sql) => /^\\s*INSERT INTO agents/i.test(sql));\n const transactions = databaseOperations.filter((sql) => /^\\s*(BEGIN|COMMIT)/i.test(sql));\n expect(upserts).toHaveLength(0);\n expect(transactions).toHaveLength(0);\n expect(registry.lookup(\"changing\")?.cwd).toBe(\"/cwd/before\");\n });\n\n it(\"prunes newly dead entries only when the passive cadence is due\", async () => {\n registry.register({\n name: \"cadenced\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/cwd/cadenced\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"sid-cadenced\",\n sessionFilePath: \"\",\n });\n const alive = vi.spyOn(registry, \"isAlive\").mockReturnValue(true);\n\n await scopedManager.listAgents();\n expect(alive).toHaveBeenCalledTimes(1);\n alive.mockReturnValue(false);\n nowMs += 29_999;\n\n await scopedManager.listAgents();\n expect(alive).toHaveBeenCalledTimes(1);\n expect(registry.lookup(\"cadenced\")).not.toBeNull();\n\n nowMs += 1;\n await scopedManager.listAgents();\n expect(alive).toHaveBeenCalledTimes(2);\n expect(registry.lookup(\"cadenced\")).toBeNull();\n });\n\n it(\"does not inherit a name when the same pid is reused by another agent type\", async () => {\n registry.register({\n name: \"old-claude\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: { session: \"old-claude\" },\n cwd: \"/cwd/old\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"old-session\",\n sessionFilePath: \"\",\n });\n scopedManager.registerAdapter(\n new MockAdapter(\"codex\", [\n createMockAgent({\n name: \"new-codex\",\n type: \"codex\",\n pid: process.pid,\n projectPath: \"/cwd/new\",\n sessionId: \"new-session\",\n }),\n ]),\n );\n\n const agents = await scopedManager.listAgents();\n\n expect(agents[0].name).toBe(\"new-codex\");\n expect(registry.lookup(\"old-claude\")).toBeNull();\n expect(registry.lookup(\"new-codex\")).toMatchObject({ type: \"codex\", pid: process.pid });\n });\n\n it(\"skips registerBatch when no agents are detected and prune is not due\", async () => {\n const writeSpy = vi.spyOn(registry, \"registerBatch\");\n const pruneSpy = vi.spyOn(registry, \"pruneIfDue\");\n\n scopedManager.registerAdapter(new MockAdapter(\"claude\", []));\n await scopedManager.listAgents();\n await scopedManager.listAgents();\n\n expect(writeSpy).not.toHaveBeenCalled();\n expect(pruneSpy).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"togglePin\", () => {\n it(\"resolves the agent name to its process identity and toggles the pin\", () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"toggle.json\"));\n const scopedManager = new AgentManager(registry);\n registry.register({\n name: \"renamed-agent\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/tmp\",\n startedAt: \"2026-08-16T00:00:00.000Z\",\n sessionId: \"session\",\n sessionFilePath: \"\",\n pinned: false,\n });\n\n expect(scopedManager.togglePin(\"renamed-agent\")).toBe(true);\n expect(registry.lookup(\"renamed-agent\")?.pinned).toBe(true);\n });\n\n it(\"reports when the agent is no longer running\", () => {\n expect(() => manager.togglePin(\"missing\")).toThrow(/no longer running/i);\n });\n\n it(\"rejects a dead process and prunes its row\", () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"dead-toggle.json\"));\n const scopedManager = new AgentManager(registry);\n registry.register({\n name: \"dead\",\n type: \"claude\",\n pid: 999999,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/tmp\",\n startedAt: \"2026-08-16T00:00:00.000Z\",\n sessionId: \"session\",\n sessionFilePath: \"\",\n pinned: false,\n });\n\n expect(() => scopedManager.togglePin(\"dead\")).toThrow(/no longer running/i);\n expect(registry.lookup(\"dead\")).toBeNull();\n });\n\n it(\"surfaces a clear readonly mutation error\", () => {\n const regPath = path.join(tmpDir, \"readonly-toggle.json\");\n const writable = new AgentRegistry(regPath);\n writable.register({\n name: \"readonly-agent\",\n type: \"claude\",\n pid: process.pid,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/tmp\",\n startedAt: \"2026-08-16T00:00:00.000Z\",\n sessionId: \"session\",\n sessionFilePath: \"\",\n pinned: false,\n });\n const readonlyManager = new AgentManager(new AgentRegistry(regPath, { readonly: true }));\n\n expect(() => readonlyManager.togglePin(\"readonly-agent\")).toThrow(\n \"Agent registry is readonly; cannot toggle pin.\",\n );\n });\n });\n\n describe(\"clear\", () => {\n it(\"should remove all adapters\", () => {\n manager.registerAdapter(new MockAdapter(\"claude\"));\n manager.registerAdapter(new MockAdapter(\"gemini_cli\"));\n\n manager.clear();\n\n expect(manager.getAdapterCount()).toBe(0);\n expect(manager.getAdapters()).toEqual([]);\n });\n });\n\n describe(\"listSessions\", () => {\n function createMockSession(overrides: Partial<SessionSummary> = {}): SessionSummary {\n return {\n type: \"claude\",\n sessionId: \"session-1\",\n cwd: \"/repo\",\n firstUserMessage: \"hello\",\n lastActive: new Date(\"2025-01-01T00:00:00Z\"),\n startedAt: new Date(\"2025-01-01T00:00:00Z\"),\n sessionFilePath: \"/tmp/session-1.jsonl\",\n ...overrides,\n };\n }\n\n it(\"returns empty array when no adapters are registered\", async () => {\n const result = await manager.listSessions();\n expect(result).toEqual([]);\n });\n\n it(\"merges sessions from every registered adapter\", async () => {\n const claudeSession = createMockSession({ type: \"claude\", sessionId: \"c1\" });\n const codexSession = createMockSession({ type: \"codex\", sessionId: \"cx1\" });\n manager.registerAdapter(new MockAdapter(\"claude\", [], false, [claudeSession]));\n manager.registerAdapter(new MockAdapter(\"codex\", [], false, [codexSession]));\n\n const result = await manager.listSessions();\n\n expect(result).toHaveLength(2);\n expect(result.map((s) => s.sessionId).sort()).toEqual([\"c1\", \"cx1\"]);\n });\n\n it(\"sorts merged sessions by lastActive descending\", async () => {\n const older = createMockSession({\n sessionId: \"older\",\n lastActive: new Date(\"2025-01-01T00:00:00Z\"),\n });\n const newer = createMockSession({\n type: \"codex\",\n sessionId: \"newer\",\n lastActive: new Date(\"2025-06-01T00:00:00Z\"),\n });\n manager.registerAdapter(new MockAdapter(\"claude\", [], false, [older]));\n manager.registerAdapter(new MockAdapter(\"codex\", [], false, [newer]));\n\n const result = await manager.listSessions();\n\n expect(result.map((s) => s.sessionId)).toEqual([\"newer\", \"older\"]);\n });\n\n it(\"skips adapters whose type does not match opts.type\", async () => {\n const claudeAdapter = new MockAdapter(\"claude\", [], false, [\n createMockSession({ type: \"claude\", sessionId: \"c1\" }),\n ]);\n const codexAdapter = new MockAdapter(\"codex\", [], false, [\n createMockSession({ type: \"codex\", sessionId: \"cx1\" }),\n ]);\n manager.registerAdapter(claudeAdapter);\n manager.registerAdapter(codexAdapter);\n\n const result = await manager.listSessions({ type: \"claude\" });\n\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe(\"c1\");\n // Codex adapter must not have been called\n expect(codexAdapter.lastListSessionsOpts).toBeUndefined();\n expect(claudeAdapter.lastListSessionsOpts).toEqual({ type: \"claude\" });\n });\n\n it(\"tolerates an adapter that throws and still returns the others\", async () => {\n const goodSession = createMockSession({ sessionId: \"good\" });\n manager.registerAdapter(new MockAdapter(\"claude\", [], false, [goodSession]));\n manager.registerAdapter(new MockAdapter(\"codex\", [], false, [], true /* failListSessions */));\n\n const consoleErrorSpy = vi.spyOn(console, \"error\").mockImplementation(() => undefined);\n\n try {\n const result = await manager.listSessions();\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe(\"good\");\n expect(consoleErrorSpy).toHaveBeenCalled();\n } finally {\n consoleErrorSpy.mockRestore();\n }\n });\n\n it(\"passes the same opts to every called adapter\", async () => {\n const a = new MockAdapter(\"claude\", [], false, []);\n const b = new MockAdapter(\"codex\", [], false, []);\n manager.registerAdapter(a);\n manager.registerAdapter(b);\n\n await manager.listSessions({ cwd: \"/Users/test/proj\" });\n\n expect(a.lastListSessionsOpts).toEqual({ cwd: \"/Users/test/proj\" });\n expect(b.lastListSessionsOpts).toEqual({ cwd: \"/Users/test/proj\" });\n });\n });\n\n describe(\"findSessionsById\", () => {\n const session = (type: AgentType, sessionId: string): SessionSummary => ({\n type,\n sessionId,\n cwd: \"/repo\",\n firstUserMessage: \"hello\",\n lastActive: new Date(\"2025-01-01T00:00:00Z\"),\n startedAt: new Date(\"2025-01-01T00:00:00Z\"),\n sessionFilePath: `/tmp/${sessionId}`,\n });\n\n it(\"uses each built-in adapter direct lookup and preserves cross-provider ambiguity\", async () => {\n const claude = new MockAdapter(\"claude\", [], false, [session(\"claude\", \"shared\")]);\n const codex = new MockAdapter(\"codex\", [], false, [session(\"codex\", \"shared\")]);\n manager.registerAdapter(claude);\n manager.registerAdapter(codex);\n\n const result = await manager.findSessionsById(\"shared\");\n\n expect(result).toHaveLength(2);\n expect(claude.findSessionsByIdCalls).toEqual([\"shared\"]);\n expect(codex.findSessionsByIdCalls).toEqual([\"shared\"]);\n expect(claude.lastListSessionsOpts).toBeUndefined();\n expect(codex.lastListSessionsOpts).toBeUndefined();\n });\n\n it(\"skips non-matching harnesses when type is supplied\", async () => {\n const claude = new MockAdapter(\"claude\", [], false, [session(\"claude\", \"target\")]);\n const codex = new MockAdapter(\"codex\", [], false, [session(\"codex\", \"target\")]);\n manager.registerAdapter(claude);\n manager.registerAdapter(codex);\n\n const result = await manager.findSessionsById(\"target\", { type: \"codex\" });\n\n expect(result).toEqual([expect.objectContaining({ type: \"codex\", sessionId: \"target\" })]);\n expect(claude.findSessionsByIdCalls).toEqual([]);\n expect(codex.findSessionsByIdCalls).toEqual([\"target\"]);\n });\n\n it(\"falls back to filtered listing for external adapters without direct lookup\", async () => {\n const external = new MockAdapter(\"other\", [], false, [\n session(\"other\", \"target\"),\n session(\"other\", \"different\"),\n ]);\n (external as Partial<AgentAdapter>).findSessionsById = undefined;\n manager.registerAdapter(external);\n\n const result = await manager.findSessionsById(\"target\");\n\n expect(result).toEqual([expect.objectContaining({ sessionId: \"target\" })]);\n expect(external.lastListSessionsOpts).toEqual(undefined);\n });\n });\n\n describe(\"resolveAgent\", () => {\n it(\"should return null for empty input or empty agents list\", () => {\n const agent = createMockAgent({ name: \"test-agent\" });\n expect(manager.resolveAgent(\"\", [agent])).toBeNull();\n expect(manager.resolveAgent(\"test\", [])).toBeNull();\n });\n\n it(\"should resolve exact match (case-insensitive)\", () => {\n const agent = createMockAgent({ name: \"My-Agent\" });\n const agents = [agent, createMockAgent({ name: \"Other\" })];\n\n // Exact match\n expect(manager.resolveAgent(\"My-Agent\", agents)).toBe(agent);\n // Case-insensitive\n expect(manager.resolveAgent(\"my-agent\", agents)).toBe(agent);\n });\n\n it(\"should resolve unique partial match\", () => {\n const agent = createMockAgent({ name: \"ai-devkit\" });\n const agents = [agent, createMockAgent({ name: \"other-project\" })];\n\n const result = manager.resolveAgent(\"dev\", agents);\n expect(result).toBe(agent);\n });\n\n it(\"should return array for ambiguous partial match\", () => {\n const agent1 = createMockAgent({ name: \"my-website\" });\n const agent2 = createMockAgent({ name: \"my-app\" });\n const agents = [agent1, agent2, createMockAgent({ name: \"other\" })];\n\n const result = manager.resolveAgent(\"my\", agents);\n\n expect(Array.isArray(result)).toBe(true);\n const matches = result as AgentInfo[];\n expect(matches).toHaveLength(2);\n expect(matches).toContain(agent1);\n expect(matches).toContain(agent2);\n });\n\n it(\"should return null for no match\", () => {\n const agents = [createMockAgent({ name: \"ai-devkit\" })];\n expect(manager.resolveAgent(\"xyz\", agents)).toBeNull();\n });\n\n it(\"should prefer exact match over partial matches\", () => {\n // Edge case: \"test\" matches \"test\" (exact) and \"testing\" (partial)\n // Should return exact \"test\"\n const exact = createMockAgent({ name: \"test\" });\n const partial = createMockAgent({ name: \"testing\" });\n const agents = [exact, partial];\n\n expect(manager.resolveAgent(\"test\", agents)).toBe(exact);\n });\n });\n});\n"],"names":["fs","os","path","AgentManager","AgentStatus","AgentRegistry","createProcessSnapshotCapture","MockAdapter","lastListSessionsOpts","undefined","findSessionsByIdCalls","type","mockAgents","shouldFail","mockSessions","shouldFailListSessions","detectAgents","Error","canHandle","getConversation","listSessions","opts","findSessionsById","sessionId","push","filter","session","setAgents","agents","setFail","setSessions","sessions","setFailListSessions","createMockAgent","overrides","name","status","RUNNING","summary","pid","projectPath","lastActive","Date","describe","manager","tmpDir","beforeEach","mkdtempSync","join","tmpdir","afterEach","rmSync","recursive","force","it","adapter","registerAdapter","expect","hasAdapter","toBe","getAdapterCount","adapter1","adapter2","toThrow","removed","unregisterAdapter","adapters","getAdapters","toEqual","toHaveLength","toContain","processes","command","cwd","tty","captureSnapshot","vi","fn","createSnapshotAdapter","processNames","claude","pi","snapshotManager","listAgents","toHaveBeenCalledTimes","toHaveBeenCalledWith","isCandidate","any","Function","gemini","codex","pidsArg","args","indexOf","split","map","parseInt","createExec","psLines","exec","file","includes","enriched","kind","mock","calls","some","arg","createAdapter","unrelatedNode","Array","from","length","_","index","p","geminiProcesses","find","toMatchObject","lastCall","startTime","legacy","detect","spyOn","not","toHaveBeenCalled","claudeAgents","geminiAgents","a","toBeDefined","IDLE","WAITING","UNKNOWN","goodAdapter","badAdapter","regPath","registry","scopedManager","nowMs","databaseOperations","parse","now","pruneIntervalMs","onDatabaseOperation","sql","restoreAllMocks","useHerdrPanes","panes","fetchHerdrPanes","mockResolvedValue","runtimeProvider","fetchHerdrAgentPanes","process","sessionFilePath","entries","list","runtime","runtimeRef","startedAt","toMatch","agent","agentSessionId","paneId","workspaceId","tabId","agentName","register","lookup","foregroundPids","toHaveBeenCalledOnce","e","mockImplementation","Object","assign","code","firstRefresh","secondRefresh","before","toISOString","entry","spy","sort","writes","test","togglePin","pinned","upserts","transactions","alive","mockReturnValue","toBeNull","writeSpy","pruneSpy","writable","readonlyManager","readonly","clear","createMockSession","firstUserMessage","result","claudeSession","codexSession","s","older","newer","claudeAdapter","codexAdapter","toBeUndefined","goodSession","consoleErrorSpy","console","mockRestore","b","objectContaining","external","resolveAgent","agent1","agent2","isArray","matches","exact","partial"],"mappings":"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"}
|