@ai-devkit/agent-manager 0.32.0 → 0.33.1
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 +13 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +116 -84
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +623 -391
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +170 -169
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +93 -93
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/index.test.js +17 -17
- package/dist/__tests__/capacity/index.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgent.test.js +9 -9
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +641 -0
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +1398 -0
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js +164 -0
- package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +488 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
- package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
- package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
- package/dist/__tests__/utils/AgentRegistry.test.js +343 -218
- package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/__tests__/utils/agent-requests.test.js +43 -43
- package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
- package/dist/__tests__/utils/agents.test.js +17 -17
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/matching.test.js +92 -92
- package/dist/__tests__/utils/matching.test.js.map +1 -1
- package/dist/__tests__/utils/process.test.js +108 -108
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/__tests__/utils/session.test.js +53 -53
- package/dist/__tests__/utils/session.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +2 -2
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +1 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GrokCliAdapter.js +80 -80
- package/dist/adapters/GrokCliAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts +2 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +41 -37
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +9 -9
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -8
- package/dist/adapters/index.js.map +1 -1
- package/dist/capacity/codex.d.ts +3 -3
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +57 -57
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +3 -3
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +8 -8
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/types.d.ts +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/database/connection.d.ts +1 -1
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +15 -15
- package/dist/database/connection.js.map +1 -1
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/migrations/005_agent_runtime.sql +2 -0
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +7 -7
- package/dist/database/schema.js.map +1 -1
- package/dist/durable/DurableAgent.d.ts +9 -9
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +16 -16
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +4 -4
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +49 -48
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +1 -1
- package/dist/durable/process.d.ts.map +1 -1
- package/dist/durable/process.js +14 -14
- package/dist/durable/process.js.map +1 -1
- package/dist/durable/run.d.ts +2 -2
- package/dist/durable/run.d.ts.map +1 -1
- package/dist/durable/run.js +6 -6
- package/dist/durable/run.js.map +1 -1
- package/dist/durable/utils.d.ts +1 -1
- package/dist/durable/utils.d.ts.map +1 -1
- package/dist/durable/utils.js +4 -4
- package/dist/durable/utils.js.map +1 -1
- package/dist/index.d.ts +48 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -26
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js +99 -99
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/providers/codex/CodexAdapter.d.ts +27 -0
- package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/providers/codex/CodexAdapter.js +162 -0
- package/dist/providers/codex/CodexAdapter.js.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.js +35 -0
- package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.js +207 -0
- package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.js +68 -0
- package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
- package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
- package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionParser.js +262 -0
- package/dist/providers/codex/CodexSessionParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotAdapter.js +108 -0
- package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
- package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
- package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
- package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
- package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotSessionParser.js +181 -0
- package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
- package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
- package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
- package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
- package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiSessionParser.js +166 -0
- package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiAdapter.d.ts +28 -0
- package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
- package/dist/providers/pi/PiAdapter.js +153 -0
- package/dist/providers/pi/PiAdapter.js.map +1 -0
- package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
- package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/providers/pi/PiAgentMapper.js +37 -0
- package/dist/providers/pi/PiAgentMapper.js.map +1 -0
- package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
- package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionLocator.js +79 -0
- package/dist/providers/pi/PiSessionLocator.js.map +1 -0
- package/dist/providers/pi/PiSessionParser.d.ts +36 -0
- package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionParser.js +191 -0
- package/dist/providers/pi/PiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
- package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionTracker.js +69 -0
- package/dist/providers/pi/PiSessionTracker.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiCliProbe.js +15 -15
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.js +16 -16
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +6 -6
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js +130 -130
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.js +156 -0
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
- package/dist/runtime/RuntimeFactory.d.ts +4 -0
- package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
- package/dist/runtime/RuntimeFactory.js +11 -0
- package/dist/runtime/RuntimeFactory.js.map +1 -0
- package/dist/runtime/errors.d.ts +27 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +42 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts +18 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +36 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +202 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.js +60 -0
- package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.js +10 -0
- package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts +16 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +107 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
- package/dist/runtime/tmux/PidPolling.d.ts +5 -0
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
- package/dist/runtime/tmux/PidPolling.js +24 -0
- package/dist/runtime/tmux/PidPolling.js.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
- package/dist/runtime/types.d.ts +54 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +50 -50
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TmuxManager.d.ts.map +1 -1
- package/dist/terminal/TmuxManager.js +47 -47
- package/dist/terminal/TmuxManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -1
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +89 -89
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/index.d.ts +4 -4
- package/dist/terminal/index.js +3 -3
- package/dist/terminal/index.js.map +1 -1
- package/dist/utils/AgentRegistry.d.ts +10 -2
- package/dist/utils/AgentRegistry.d.ts.map +1 -1
- package/dist/utils/AgentRegistry.js +59 -26
- package/dist/utils/AgentRegistry.js.map +1 -1
- package/dist/utils/agent-requests.d.ts.map +1 -1
- package/dist/utils/agent-requests.js +5 -5
- package/dist/utils/agent-requests.js.map +1 -1
- package/dist/utils/agents.d.ts +2 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +15 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/applescript.js +1 -1
- package/dist/utils/applescript.js.map +1 -1
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matching.d.ts +2 -2
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +4 -4
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/process.d.ts +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +74 -74
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/session.d.ts +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +7 -7
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/sortAgents.d.ts +2 -2
- package/dist/utils/sortAgents.d.ts.map +1 -1
- package/dist/utils/sortAgents.js +5 -5
- package/dist/utils/sortAgents.js.map +1 -1
- package/package.json +18 -19
- package/src/AgentManager.ts +338 -274
- package/src/__tests__/AgentManager.test.ts +1143 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +511 -455
- package/src/__tests__/capacity/codex.test.ts +178 -91
- package/src/__tests__/capacity/index.test.ts +27 -18
- package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
- package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
- package/src/__tests__/fixtures/fake-claude.cjs +20 -13
- package/src/__tests__/fixtures/fake-codex.cjs +41 -30
- package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
- package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
- package/src/__tests__/print/DurableAgent.test.ts +19 -16
- package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
- package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +602 -0
- package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +1299 -0
- package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
- package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +377 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
- package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
- package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
- package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
- package/src/__tests__/utils/AgentRegistry.test.ts +516 -402
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
- package/src/__tests__/utils/agent-requests.test.ts +76 -56
- package/src/__tests__/utils/agents.test.ts +20 -20
- package/src/__tests__/utils/matching.test.ts +206 -171
- package/src/__tests__/utils/process.test.ts +276 -262
- package/src/__tests__/utils/session.test.ts +133 -139
- package/src/adapters/AgentAdapter.ts +134 -126
- package/src/adapters/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +289 -259
- package/src/adapters/index.ts +15 -9
- package/src/capacity/codex.ts +137 -84
- package/src/capacity/index.ts +18 -13
- package/src/capacity/types.ts +1 -1
- package/src/database/connection.ts +73 -68
- package/src/database/index.ts +6 -6
- package/src/database/migrations/005_agent_runtime.sql +2 -0
- package/src/database/schema.ts +40 -38
- package/src/durable/DurableAgent.ts +85 -85
- package/src/durable/DurableAgentRepository.ts +409 -260
- package/src/durable/process.ts +22 -21
- package/src/durable/run.ts +61 -51
- package/src/durable/utils.ts +46 -41
- package/src/index.ts +151 -103
- package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
- package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
- package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
- package/src/providers/claude/ClaudeSessionParser.ts +322 -338
- package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
- package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
- package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
- package/src/providers/codex/CodexAdapter.ts +205 -0
- package/src/providers/codex/CodexAgentMapper.ts +35 -0
- package/src/providers/codex/CodexSessionLocator.ts +279 -0
- package/src/providers/codex/CodexSessionMapping.ts +89 -0
- package/src/providers/codex/CodexSessionParser.ts +385 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
- package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
- package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
- package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
- package/src/providers/copilot/CopilotAdapter.ts +145 -0
- package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
- package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
- package/src/providers/copilot/CopilotSessionParser.ts +289 -0
- package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
- package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
- package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
- package/src/providers/gemini/GeminiSessionParser.ts +271 -0
- package/src/providers/pi/PiAdapter.ts +183 -0
- package/src/providers/pi/PiAgentMapper.ts +36 -0
- package/src/providers/pi/PiSessionLocator.ts +95 -0
- package/src/providers/pi/PiSessionParser.ts +284 -0
- package/src/providers/pi/PiSessionTracker.ts +87 -0
- package/src/providers/pi/durable/PiCliProbe.ts +42 -34
- package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
- package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
- package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
- package/src/providers/pi/durable/PiStreamParser.ts +82 -72
- package/src/readiness/AgentReadiness.ts +585 -513
- package/src/runtime/ManagedAgentRuntime.ts +266 -0
- package/src/runtime/RuntimeFactory.ts +13 -0
- package/src/runtime/errors.ts +50 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +178 -0
- package/src/runtime/herdr/HerdrAgentRuntime.ts +216 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +86 -0
- package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
- package/src/runtime/tmux/PidPolling.ts +34 -0
- package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
- package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
- package/src/runtime/types.ts +56 -0
- package/src/terminal/TerminalFocusManager.ts +215 -212
- package/src/terminal/TmuxManager.ts +99 -92
- package/src/terminal/TtyWriter.ts +203 -194
- package/src/terminal/index.ts +4 -4
- package/src/utils/AgentRegistry.ts +301 -238
- package/src/utils/agent-requests.ts +16 -16
- package/src/utils/agents.ts +41 -38
- package/src/utils/applescript.ts +4 -4
- package/src/utils/index.ts +12 -6
- package/src/utils/matching.ts +43 -43
- package/src/utils/process.ts +261 -258
- package/src/utils/session.ts +66 -66
- package/src/utils/sortAgents.ts +35 -33
- package/tsconfig.json +2 -8
- package/vitest.config.ts +16 -16
- package/.eslintrc.json +0 -31
- package/dist/__tests__/adapters/CopilotAdapter.test.js +0 -630
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +0 -1384
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
- package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
- package/dist/adapters/CodexAdapter.d.ts +0 -109
- package/dist/adapters/CodexAdapter.d.ts.map +0 -1
- package/dist/adapters/CodexAdapter.js +0 -710
- package/dist/adapters/CodexAdapter.js.map +0 -1
- package/dist/adapters/CopilotAdapter.d.ts.map +0 -1
- package/dist/adapters/CopilotAdapter.js +0 -329
- package/dist/adapters/CopilotAdapter.js.map +0 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
- package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/adapters/GeminiCliAdapter.js +0 -513
- package/dist/adapters/GeminiCliAdapter.js.map +0 -1
- package/dist/adapters/PiAdapter.d.ts +0 -63
- package/dist/adapters/PiAdapter.d.ts.map +0 -1
- package/dist/adapters/PiAdapter.js +0 -453
- package/dist/adapters/PiAdapter.js.map +0 -1
- package/src/__tests__/adapters/CopilotAdapter.test.ts +0 -510
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +0 -1259
- package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
- package/src/adapters/CodexAdapter.ts +0 -923
- package/src/adapters/CopilotAdapter.ts +0 -473
- package/src/adapters/GeminiCliAdapter.ts +0 -701
- package/src/adapters/PiAdapter.ts +0 -598
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/__tests__/AgentManager.test.ts"],"sourcesContent":["/**\n * Tests for AgentManager\n */\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';\n\n// Mock adapter for testing\nclass MockAdapter implements AgentAdapter {\n public lastListSessionsOpts: unknown = undefined;\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 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 = [\n createMockAgent({ name: 'agent1' }),\n createMockAgent({ name: 'agent2' }),\n ];\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', [\n createMockAgent({ name: 'good-agent' }),\n ]);\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 it('persists every detected agent to the registry', async () => {\n scopedManager.registerAdapter(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 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 tmuxSession: '',\n });\n expect(entries[0].startedAt).toMatch(/^\\d{4}-\\d{2}-\\d{2}T/);\n });\n\n it('prunes entries for dead pids', async () => {\n registry.register({\n name: 'dead',\n type: 'claude',\n pid: 999999,\n tmuxSession: '',\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(new MockAdapter('claude', [\n 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 tmuxSession: '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(new MockAdapter('claude', [\n 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].tmuxSession).toBe('merry');\n expect(registry.list()[0].startedAt).toBe('2026-05-30T00:00:00.000Z');\n });\n\n it('preserves custom name and tmux session across two EPERM refresh cycles', async () => {\n registry.register({\n name: 'merry',\n type: 'claude',\n pid: process.pid,\n tmuxSession: '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(new MockAdapter('claude', [\n createMockAgent({ name: `ai-devkit-${process.pid}`, pid: process.pid }),\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 tmuxSession: '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 tmuxSession: '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 tmuxSession: '',\n cwd: '/cwd/debug',\n startedAt: '2026-05-31T00:00:00.000Z',\n sessionId: 'pid-debug',\n sessionFilePath: '',\n });\n\n scopedManager.registerAdapter(new MockAdapter('codex', [\n createMockAgent({ name: `ai-devkit-${process.pid}`, type: 'codex', pid: process.pid }),\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 tmuxSession: '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(new MockAdapter('claude', [\n 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(new MockAdapter('claude', [\n createMockAgent({ name: 'a', pid: process.pid }),\n ]));\n scopedManager.registerAdapter(new MockAdapter('codex', [\n createMockAgent({ name: 'b', type: 'codex', pid: process.pid + 1 }),\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())\n .toEqual(['a', 'b']);\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) => /^\\s*(BEGIN|COMMIT|INSERT|UPDATE|DELETE)/i.test(sql));\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(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 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('persists changed fields once in one write transaction', 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(1);\n expect(upserts[0]).toContain(\"'2026-08-14T10:00:01.000Z'\");\n expect(transactions).toHaveLength(2);\n expect(registry.lookup('changing')?.cwd).toBe('/cwd/after');\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 tmuxSession: '',\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 tmuxSession: 'old-claude',\n cwd: '/cwd/old',\n startedAt: '2026-05-30T00:00:00.000Z',\n sessionId: 'old-session',\n sessionFilePath: '',\n });\n scopedManager.registerAdapter(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 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 tmuxSession: '',\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 tmuxSession: '',\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 tmuxSession: '',\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(\n 'claude',\n [],\n false,\n [createMockSession({ type: 'claude', sessionId: 'c1' })],\n );\n const codexAdapter = new MockAdapter(\n 'codex',\n [],\n 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(\n new MockAdapter('codex', [], false, [], true /* failListSessions */),\n );\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('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 = [\n agent,\n createMockAgent({ name: 'other-project' })\n ];\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","type","mockAgents","shouldFail","mockSessions","shouldFailListSessions","detectAgents","Error","canHandle","getConversation","listSessions","opts","setAgents","agents","setFail","setSessions","sessions","setFailListSessions","createMockAgent","overrides","name","status","RUNNING","summary","pid","projectPath","sessionId","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","push","restoreAllMocks","process","sessionFilePath","entries","list","toMatchObject","tmuxSession","startedAt","toMatch","register","map","e","mockImplementation","Object","assign","code","firstRefresh","secondRefresh","lookup","before","toISOString","entry","spy","mock","calls","sort","writes","filter","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","agent","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 type { HerdrAgentPane } from \"../runtime/herdr/HerdrAgentDiscovery.js\";\n\n// Mock adapter for testing\nclass MockAdapter implements AgentAdapter {\n public lastListSessionsOpts: unknown = undefined;\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 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(\"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","type","mockAgents","shouldFail","mockSessions","shouldFailListSessions","detectAgents","Error","canHandle","getConversation","listSessions","opts","setAgents","agents","setFail","setSessions","sessions","setFailListSessions","createMockAgent","overrides","name","status","RUNNING","summary","pid","projectPath","sessionId","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","push","restoreAllMocks","useHerdrPanes","panes","fetchHerdrPanes","mockResolvedValue","runtimeProvider","fetchHerdrAgentPanes","process","sessionFilePath","entries","list","toMatchObject","runtime","runtimeRef","startedAt","toMatch","agent","agentSessionId","paneId","workspaceId","tabId","session","agentName","register","lookup","foregroundPids","toHaveBeenCalledOnce","map","e","mockImplementation","Object","assign","code","firstRefresh","secondRefresh","before","toISOString","entry","spy","mock","calls","sort","writes","filter","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","resolveAgent","agent1","agent2","Array","isArray","matches","exact","partial"],"mappings":"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"}
|