@ai-devkit/agent-manager 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +3 -3
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +80 -79
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +413 -388
- 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/CopilotAdapter.test.js +254 -248
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
- package/dist/__tests__/adapters/GeminiCliAdapter.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 +169 -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/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 +301 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -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 +335 -217
- 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/CopilotAdapter.d.ts +2 -2
- package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
- package/dist/adapters/CopilotAdapter.js +51 -51
- package/dist/adapters/CopilotAdapter.js.map +1 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
- package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GeminiCliAdapter.js +86 -86
- package/dist/adapters/GeminiCliAdapter.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 +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +37 -36
- 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 +46 -41
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -25
- 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/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 +67 -0
- package/dist/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/readiness/AgentReadiness.js +614 -0
- package/dist/readiness/AgentReadiness.js.map +1 -0
- 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/HerdrAgentRuntime.d.ts +31 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -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 +14 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +96 -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 +57 -24
- 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 +283 -281
- package/src/__tests__/AgentManager.test.ts +917 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -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/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 +242 -0
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -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 +506 -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/CopilotAdapter.ts +405 -395
- package/src/adapters/GeminiCliAdapter.ts +598 -600
- package/src/adapters/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +285 -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 +145 -86
- 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/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 +727 -0
- 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/HerdrAgentRuntime.ts +190 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +76 -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 +299 -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/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/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/PiAdapter.test.ts +0 -458
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
- package/src/adapters/CodexAdapter.ts +0 -923
- package/src/adapters/PiAdapter.ts +0 -598
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import * as fs from
|
|
2
|
-
import * as os from
|
|
3
|
-
import * as path from
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from
|
|
5
|
-
import { AgentStatus } from
|
|
6
|
-
import { ClaudeSessionLocator } from
|
|
7
|
-
import { batchGetSessionFileBirthtimes } from
|
|
8
|
-
vi.mock(
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as os from "os";
|
|
3
|
+
import * as path from "path";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { AgentStatus } from "../../../adapters/AgentAdapter.js";
|
|
6
|
+
import { ClaudeSessionLocator } from "../../../providers/claude/ClaudeSessionLocator.js";
|
|
7
|
+
import { batchGetSessionFileBirthtimes } from "../../../utils/session.js";
|
|
8
|
+
vi.mock("../../../utils/session.js", async (importOriginal)=>{
|
|
9
9
|
const actual = await importOriginal();
|
|
10
10
|
return {
|
|
11
11
|
...actual,
|
|
@@ -15,17 +15,17 @@ vi.mock('../../../utils/session.js', async (importOriginal)=>{
|
|
|
15
15
|
const mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes;
|
|
16
16
|
const tmpDirs = [];
|
|
17
17
|
function makeTmpDir() {
|
|
18
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(),
|
|
18
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "claude-locator-test-"));
|
|
19
19
|
tmpDirs.push(dir);
|
|
20
20
|
return dir;
|
|
21
21
|
}
|
|
22
22
|
function makeProcess(overrides = {}) {
|
|
23
23
|
return {
|
|
24
24
|
pid: 123,
|
|
25
|
-
command:
|
|
26
|
-
cwd:
|
|
27
|
-
tty:
|
|
28
|
-
startTime: new Date(
|
|
25
|
+
command: "claude",
|
|
26
|
+
cwd: "/repo/my-app",
|
|
27
|
+
tty: "ttys001",
|
|
28
|
+
startTime: new Date("2026-08-23T10:00:00.000Z"),
|
|
29
29
|
...overrides
|
|
30
30
|
};
|
|
31
31
|
}
|
|
@@ -35,7 +35,7 @@ function makeProcess(overrides = {}) {
|
|
|
35
35
|
/** `getProjectDir` is private; bound here so the encoding tests read cleanly. */ function bindProjectDir(locator) {
|
|
36
36
|
return locator.getProjectDir.bind(locator);
|
|
37
37
|
}
|
|
38
|
-
describe(
|
|
38
|
+
describe("ClaudeSessionLocator", ()=>{
|
|
39
39
|
beforeEach(()=>{
|
|
40
40
|
mockedBatchGetSessionFileBirthtimes.mockReset();
|
|
41
41
|
});
|
|
@@ -47,13 +47,13 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
|
-
it(
|
|
50
|
+
it("matches resumed sessions directly and carries live PID status metadata", ()=>{
|
|
51
51
|
const root = makeTmpDir();
|
|
52
|
-
const projectsDir = path.join(root,
|
|
53
|
-
const sessionsDir = path.join(root,
|
|
54
|
-
const cwd =
|
|
55
|
-
const sessionId =
|
|
56
|
-
const projectDir = path.join(projectsDir,
|
|
52
|
+
const projectsDir = path.join(root, "projects");
|
|
53
|
+
const sessionsDir = path.join(root, "sessions");
|
|
54
|
+
const cwd = "/repo/my-app";
|
|
55
|
+
const sessionId = "12345678-1234-1234-1234-123456789abc";
|
|
56
|
+
const projectDir = path.join(projectsDir, "-repo-my-app");
|
|
57
57
|
const sessionFile = path.join(projectDir, `${sessionId}.jsonl`);
|
|
58
58
|
fs.mkdirSync(projectDir, {
|
|
59
59
|
recursive: true
|
|
@@ -61,16 +61,16 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
61
61
|
fs.mkdirSync(sessionsDir, {
|
|
62
62
|
recursive: true
|
|
63
63
|
});
|
|
64
|
-
fs.writeFileSync(sessionFile,
|
|
65
|
-
fs.writeFileSync(path.join(sessionsDir,
|
|
64
|
+
fs.writeFileSync(sessionFile, "{}\n");
|
|
65
|
+
fs.writeFileSync(path.join(sessionsDir, "123.json"), JSON.stringify({
|
|
66
66
|
pid: 123,
|
|
67
67
|
sessionId,
|
|
68
68
|
cwd,
|
|
69
|
-
startedAt: new Date(
|
|
70
|
-
kind:
|
|
71
|
-
entrypoint:
|
|
72
|
-
status:
|
|
73
|
-
waitingFor:
|
|
69
|
+
startedAt: new Date("2026-08-23T10:00:00.000Z").getTime(),
|
|
70
|
+
kind: "interactive",
|
|
71
|
+
entrypoint: "cli",
|
|
72
|
+
status: "waiting",
|
|
73
|
+
waitingFor: "approve Read"
|
|
74
74
|
}));
|
|
75
75
|
const locator = new ClaudeSessionLocator({
|
|
76
76
|
projectsDir,
|
|
@@ -86,7 +86,7 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
86
86
|
expect(matches.legacyMatches).toEqual([]);
|
|
87
87
|
expect(matches.direct[0]).toMatchObject({
|
|
88
88
|
pidStatus: AgentStatus.WAITING,
|
|
89
|
-
waitingFor:
|
|
89
|
+
waitingFor: "approve Read",
|
|
90
90
|
sessionFile: {
|
|
91
91
|
sessionId,
|
|
92
92
|
filePath: sessionFile,
|
|
@@ -95,72 +95,72 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
95
95
|
}
|
|
96
96
|
});
|
|
97
97
|
});
|
|
98
|
-
describe(
|
|
98
|
+
describe("discoverLiveSessions", ()=>{
|
|
99
99
|
let tmpDir;
|
|
100
100
|
let projectsDir;
|
|
101
101
|
let locator;
|
|
102
102
|
beforeEach(()=>{
|
|
103
103
|
tmpDir = makeTmpDir();
|
|
104
|
-
projectsDir = path.join(tmpDir,
|
|
104
|
+
projectsDir = path.join(tmpDir, "projects");
|
|
105
105
|
locator = new ClaudeSessionLocator({
|
|
106
106
|
projectsDir,
|
|
107
|
-
sessionsDir: path.join(tmpDir,
|
|
107
|
+
sessionsDir: path.join(tmpDir, "sessions")
|
|
108
108
|
});
|
|
109
109
|
});
|
|
110
|
-
it(
|
|
110
|
+
it("should return empty when projects dir does not exist", ()=>{
|
|
111
111
|
const missing = new ClaudeSessionLocator({
|
|
112
|
-
projectsDir: path.join(tmpDir,
|
|
113
|
-
sessionsDir: path.join(tmpDir,
|
|
112
|
+
projectsDir: path.join(tmpDir, "nonexistent"),
|
|
113
|
+
sessionsDir: path.join(tmpDir, "sessions")
|
|
114
114
|
});
|
|
115
115
|
const result = missing.discoverLiveSessions([
|
|
116
116
|
{
|
|
117
117
|
pid: 1,
|
|
118
|
-
command:
|
|
119
|
-
cwd:
|
|
120
|
-
tty:
|
|
118
|
+
command: "claude",
|
|
119
|
+
cwd: "/test",
|
|
120
|
+
tty: ""
|
|
121
121
|
}
|
|
122
122
|
]);
|
|
123
123
|
expect(result).toEqual([]);
|
|
124
124
|
});
|
|
125
|
-
it(
|
|
125
|
+
it("should scan only directories matching process CWDs", ()=>{
|
|
126
126
|
// /my/project → -my-project (encoded dir)
|
|
127
|
-
const encodedDir = path.join(projectsDir,
|
|
127
|
+
const encodedDir = path.join(projectsDir, "-my-project");
|
|
128
128
|
fs.mkdirSync(encodedDir, {
|
|
129
129
|
recursive: true
|
|
130
130
|
});
|
|
131
131
|
// Also create another dir that should NOT be scanned
|
|
132
|
-
const otherDir = path.join(projectsDir,
|
|
132
|
+
const otherDir = path.join(projectsDir, "-other-project");
|
|
133
133
|
fs.mkdirSync(otherDir, {
|
|
134
134
|
recursive: true
|
|
135
135
|
});
|
|
136
136
|
const mockFiles = [
|
|
137
137
|
{
|
|
138
|
-
sessionId:
|
|
139
|
-
filePath: path.join(encodedDir,
|
|
138
|
+
sessionId: "s1",
|
|
139
|
+
filePath: path.join(encodedDir, "s1.jsonl"),
|
|
140
140
|
projectDir: encodedDir,
|
|
141
141
|
birthtimeMs: 1710800324000,
|
|
142
|
-
resolvedCwd:
|
|
142
|
+
resolvedCwd: ""
|
|
143
143
|
}
|
|
144
144
|
];
|
|
145
145
|
mockedBatchGetSessionFileBirthtimes.mockReturnValue(mockFiles);
|
|
146
146
|
const processes = [
|
|
147
147
|
{
|
|
148
148
|
pid: 1,
|
|
149
|
-
command:
|
|
150
|
-
cwd:
|
|
151
|
-
tty:
|
|
149
|
+
command: "claude",
|
|
150
|
+
cwd: "/my/project",
|
|
151
|
+
tty: ""
|
|
152
152
|
}
|
|
153
153
|
];
|
|
154
154
|
const result = locator.discoverLiveSessions(processes);
|
|
155
155
|
expect(result).toHaveLength(1);
|
|
156
|
-
expect(result[0].resolvedCwd).toBe(
|
|
156
|
+
expect(result[0].resolvedCwd).toBe("/my/project");
|
|
157
157
|
// batchGetSessionFileBirthtimes called once with all dirs
|
|
158
158
|
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
|
|
159
159
|
expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledWith([
|
|
160
160
|
encodedDir
|
|
161
161
|
]);
|
|
162
162
|
});
|
|
163
|
-
it(
|
|
163
|
+
it("should return empty when encoded dir does not exist", ()=>{
|
|
164
164
|
fs.mkdirSync(projectsDir, {
|
|
165
165
|
recursive: true
|
|
166
166
|
});
|
|
@@ -168,40 +168,40 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
168
168
|
const result = locator.discoverLiveSessions([
|
|
169
169
|
{
|
|
170
170
|
pid: 1,
|
|
171
|
-
command:
|
|
172
|
-
cwd:
|
|
173
|
-
tty:
|
|
171
|
+
command: "claude",
|
|
172
|
+
cwd: "/test",
|
|
173
|
+
tty: ""
|
|
174
174
|
}
|
|
175
175
|
]);
|
|
176
176
|
expect(result).toEqual([]);
|
|
177
177
|
expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();
|
|
178
178
|
});
|
|
179
|
-
it(
|
|
180
|
-
const encodedDir = path.join(projectsDir,
|
|
179
|
+
it("should deduplicate when multiple processes share same CWD", ()=>{
|
|
180
|
+
const encodedDir = path.join(projectsDir, "-my-project");
|
|
181
181
|
fs.mkdirSync(encodedDir, {
|
|
182
182
|
recursive: true
|
|
183
183
|
});
|
|
184
184
|
mockedBatchGetSessionFileBirthtimes.mockReturnValue([
|
|
185
185
|
{
|
|
186
|
-
sessionId:
|
|
187
|
-
filePath: path.join(encodedDir,
|
|
186
|
+
sessionId: "s1",
|
|
187
|
+
filePath: path.join(encodedDir, "s1.jsonl"),
|
|
188
188
|
projectDir: encodedDir,
|
|
189
189
|
birthtimeMs: 1710800324000,
|
|
190
|
-
resolvedCwd:
|
|
190
|
+
resolvedCwd: ""
|
|
191
191
|
}
|
|
192
192
|
]);
|
|
193
193
|
const processes = [
|
|
194
194
|
{
|
|
195
195
|
pid: 1,
|
|
196
|
-
command:
|
|
197
|
-
cwd:
|
|
198
|
-
tty:
|
|
196
|
+
command: "claude",
|
|
197
|
+
cwd: "/my/project",
|
|
198
|
+
tty: ""
|
|
199
199
|
},
|
|
200
200
|
{
|
|
201
201
|
pid: 2,
|
|
202
|
-
command:
|
|
203
|
-
cwd:
|
|
204
|
-
tty:
|
|
202
|
+
command: "claude",
|
|
203
|
+
cwd: "/my/project",
|
|
204
|
+
tty: ""
|
|
205
205
|
}
|
|
206
206
|
];
|
|
207
207
|
const result = locator.discoverLiveSessions(processes);
|
|
@@ -212,30 +212,30 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
212
212
|
]);
|
|
213
213
|
expect(result).toHaveLength(1);
|
|
214
214
|
});
|
|
215
|
-
it(
|
|
215
|
+
it("should skip processes with empty cwd", ()=>{
|
|
216
216
|
fs.mkdirSync(projectsDir, {
|
|
217
217
|
recursive: true
|
|
218
218
|
});
|
|
219
219
|
const result = locator.discoverLiveSessions([
|
|
220
220
|
{
|
|
221
221
|
pid: 1,
|
|
222
|
-
command:
|
|
223
|
-
cwd:
|
|
224
|
-
tty:
|
|
222
|
+
command: "claude",
|
|
223
|
+
cwd: "",
|
|
224
|
+
tty: ""
|
|
225
225
|
}
|
|
226
226
|
]);
|
|
227
227
|
expect(result).toEqual([]);
|
|
228
228
|
});
|
|
229
229
|
});
|
|
230
|
-
describe(
|
|
230
|
+
describe("tryPidFileMatching", ()=>{
|
|
231
231
|
let tmpDir;
|
|
232
232
|
let sessionsDir;
|
|
233
233
|
let projectsDir;
|
|
234
234
|
let tryMatch;
|
|
235
235
|
beforeEach(()=>{
|
|
236
236
|
tmpDir = makeTmpDir();
|
|
237
|
-
sessionsDir = path.join(tmpDir,
|
|
238
|
-
projectsDir = path.join(tmpDir,
|
|
237
|
+
sessionsDir = path.join(tmpDir, "sessions");
|
|
238
|
+
projectsDir = path.join(tmpDir, "projects");
|
|
239
239
|
fs.mkdirSync(sessionsDir, {
|
|
240
240
|
recursive: true
|
|
241
241
|
});
|
|
@@ -244,11 +244,11 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
244
244
|
sessionsDir
|
|
245
245
|
}));
|
|
246
246
|
});
|
|
247
|
-
const makeProc = (pid, cwd =
|
|
247
|
+
const makeProc = (pid, cwd = "/project/test", startTime)=>({
|
|
248
248
|
pid,
|
|
249
|
-
command:
|
|
249
|
+
command: "claude",
|
|
250
250
|
cwd,
|
|
251
|
-
tty:
|
|
251
|
+
tty: "ttys001",
|
|
252
252
|
startTime
|
|
253
253
|
});
|
|
254
254
|
const writePidFile = (pid, sessionId, cwd, startedAt)=>{
|
|
@@ -257,41 +257,41 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
257
257
|
sessionId,
|
|
258
258
|
cwd,
|
|
259
259
|
startedAt,
|
|
260
|
-
kind:
|
|
261
|
-
entrypoint:
|
|
260
|
+
kind: "interactive",
|
|
261
|
+
entrypoint: "cli"
|
|
262
262
|
}));
|
|
263
263
|
};
|
|
264
264
|
const writeJsonl = (cwd, sessionId)=>{
|
|
265
|
-
const encoded = cwd.replace(/[^a-zA-Z0-9]/g,
|
|
265
|
+
const encoded = cwd.replace(/[^a-zA-Z0-9]/g, "-");
|
|
266
266
|
const projDir = path.join(projectsDir, encoded);
|
|
267
267
|
fs.mkdirSync(projDir, {
|
|
268
268
|
recursive: true
|
|
269
269
|
});
|
|
270
270
|
const filePath = path.join(projDir, `${sessionId}.jsonl`);
|
|
271
271
|
fs.writeFileSync(filePath, JSON.stringify({
|
|
272
|
-
type:
|
|
272
|
+
type: "assistant",
|
|
273
273
|
timestamp: new Date().toISOString()
|
|
274
274
|
}));
|
|
275
275
|
return filePath;
|
|
276
276
|
};
|
|
277
|
-
it(
|
|
277
|
+
it("should return direct match when PID file and JSONL both exist within time tolerance", ()=>{
|
|
278
278
|
const startTime = new Date();
|
|
279
|
-
const proc = makeProc(1001,
|
|
280
|
-
writePidFile(1001,
|
|
281
|
-
writeJsonl(
|
|
279
|
+
const proc = makeProc(1001, "/project/test", startTime);
|
|
280
|
+
writePidFile(1001, "session-abc", "/project/test", startTime.getTime());
|
|
281
|
+
writeJsonl("/project/test", "session-abc");
|
|
282
282
|
const { direct, fallback } = tryMatch([
|
|
283
283
|
proc
|
|
284
284
|
]);
|
|
285
285
|
expect(direct).toHaveLength(1);
|
|
286
286
|
expect(fallback).toHaveLength(0);
|
|
287
|
-
expect(direct[0].sessionFile.sessionId).toBe(
|
|
288
|
-
expect(direct[0].sessionFile.resolvedCwd).toBe(
|
|
287
|
+
expect(direct[0].sessionFile.sessionId).toBe("session-abc");
|
|
288
|
+
expect(direct[0].sessionFile.resolvedCwd).toBe("/project/test");
|
|
289
289
|
expect(direct[0].process.pid).toBe(1001);
|
|
290
290
|
});
|
|
291
|
-
it(
|
|
291
|
+
it("should fall back when PID file exists but JSONL is missing", ()=>{
|
|
292
292
|
const startTime = new Date();
|
|
293
|
-
const proc = makeProc(1002,
|
|
294
|
-
writePidFile(1002,
|
|
293
|
+
const proc = makeProc(1002, "/project/test", startTime);
|
|
294
|
+
writePidFile(1002, "nonexistent-session", "/project/test", startTime.getTime());
|
|
295
295
|
// No JSONL file written
|
|
296
296
|
const { direct, fallback } = tryMatch([
|
|
297
297
|
proc
|
|
@@ -300,32 +300,32 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
300
300
|
expect(fallback).toHaveLength(1);
|
|
301
301
|
expect(fallback[0].pid).toBe(1002);
|
|
302
302
|
});
|
|
303
|
-
it(
|
|
303
|
+
it("should fall back when startedAt is stale (>60s from proc.startTime)", ()=>{
|
|
304
304
|
const startTime = new Date();
|
|
305
305
|
const staleTime = startTime.getTime() - 90_000; // 90 seconds earlier
|
|
306
|
-
const proc = makeProc(1003,
|
|
307
|
-
writePidFile(1003,
|
|
308
|
-
writeJsonl(
|
|
306
|
+
const proc = makeProc(1003, "/project/test", startTime);
|
|
307
|
+
writePidFile(1003, "stale-session", "/project/test", staleTime);
|
|
308
|
+
writeJsonl("/project/test", "stale-session");
|
|
309
309
|
const { direct, fallback } = tryMatch([
|
|
310
310
|
proc
|
|
311
311
|
]);
|
|
312
312
|
expect(direct).toHaveLength(0);
|
|
313
313
|
expect(fallback).toHaveLength(1);
|
|
314
314
|
});
|
|
315
|
-
it(
|
|
315
|
+
it("should accept PID file when startedAt is within 60s tolerance", ()=>{
|
|
316
316
|
const startTime = new Date();
|
|
317
317
|
const closeTime = startTime.getTime() - 30_000; // 30 seconds earlier — within tolerance
|
|
318
|
-
const proc = makeProc(1004,
|
|
319
|
-
writePidFile(1004,
|
|
320
|
-
writeJsonl(
|
|
318
|
+
const proc = makeProc(1004, "/project/test", startTime);
|
|
319
|
+
writePidFile(1004, "close-session", "/project/test", closeTime);
|
|
320
|
+
writeJsonl("/project/test", "close-session");
|
|
321
321
|
const { direct, fallback } = tryMatch([
|
|
322
322
|
proc
|
|
323
323
|
]);
|
|
324
324
|
expect(direct).toHaveLength(1);
|
|
325
325
|
expect(fallback).toHaveLength(0);
|
|
326
326
|
});
|
|
327
|
-
it(
|
|
328
|
-
const proc = makeProc(1005,
|
|
327
|
+
it("should fall back when PID file is absent", ()=>{
|
|
328
|
+
const proc = makeProc(1005, "/project/test", new Date());
|
|
329
329
|
// No PID file written
|
|
330
330
|
const { direct, fallback } = tryMatch([
|
|
331
331
|
proc
|
|
@@ -333,9 +333,9 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
333
333
|
expect(direct).toHaveLength(0);
|
|
334
334
|
expect(fallback).toHaveLength(1);
|
|
335
335
|
});
|
|
336
|
-
it(
|
|
337
|
-
const proc = makeProc(1006,
|
|
338
|
-
fs.writeFileSync(path.join(sessionsDir,
|
|
336
|
+
it("should fall back when PID file contains malformed JSON", ()=>{
|
|
337
|
+
const proc = makeProc(1006, "/project/test", new Date());
|
|
338
|
+
fs.writeFileSync(path.join(sessionsDir, "1006.json"), "not valid json {{{");
|
|
339
339
|
expect(()=>{
|
|
340
340
|
const { direct, fallback } = tryMatch([
|
|
341
341
|
proc
|
|
@@ -344,28 +344,28 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
344
344
|
expect(fallback).toHaveLength(1);
|
|
345
345
|
}).not.toThrow();
|
|
346
346
|
});
|
|
347
|
-
it(
|
|
347
|
+
it("should fall back for all processes when sessions dir does not exist", ()=>{
|
|
348
348
|
const missingSessions = bindPidFileMatching(new ClaudeSessionLocator({
|
|
349
349
|
projectsDir,
|
|
350
|
-
sessionsDir: path.join(tmpDir,
|
|
350
|
+
sessionsDir: path.join(tmpDir, "nonexistent-sessions")
|
|
351
351
|
}));
|
|
352
352
|
const processes = [
|
|
353
|
-
makeProc(2001,
|
|
354
|
-
makeProc(2002,
|
|
353
|
+
makeProc(2001, "/a", new Date()),
|
|
354
|
+
makeProc(2002, "/b", new Date())
|
|
355
355
|
];
|
|
356
356
|
const { direct, fallback } = missingSessions(processes);
|
|
357
357
|
expect(direct).toHaveLength(0);
|
|
358
358
|
expect(fallback).toHaveLength(2);
|
|
359
359
|
});
|
|
360
|
-
it(
|
|
360
|
+
it("should correctly split mixed processes (some with PID files, some without)", ()=>{
|
|
361
361
|
const startTime = new Date();
|
|
362
|
-
const proc1 = makeProc(3001,
|
|
363
|
-
const proc2 = makeProc(3002,
|
|
364
|
-
const proc3 = makeProc(3003,
|
|
365
|
-
writePidFile(3001,
|
|
366
|
-
writeJsonl(
|
|
367
|
-
writePidFile(3003,
|
|
368
|
-
writeJsonl(
|
|
362
|
+
const proc1 = makeProc(3001, "/project/one", startTime);
|
|
363
|
+
const proc2 = makeProc(3002, "/project/two", startTime);
|
|
364
|
+
const proc3 = makeProc(3003, "/project/three", startTime);
|
|
365
|
+
writePidFile(3001, "session-one", "/project/one", startTime.getTime());
|
|
366
|
+
writeJsonl("/project/one", "session-one");
|
|
367
|
+
writePidFile(3003, "session-three", "/project/three", startTime.getTime());
|
|
368
|
+
writeJsonl("/project/three", "session-three");
|
|
369
369
|
// proc2 has no PID file
|
|
370
370
|
const { direct, fallback } = tryMatch([
|
|
371
371
|
proc1,
|
|
@@ -380,10 +380,10 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
380
380
|
]);
|
|
381
381
|
expect(fallback[0].pid).toBe(3002);
|
|
382
382
|
});
|
|
383
|
-
it(
|
|
384
|
-
const proc = makeProc(4001,
|
|
385
|
-
writePidFile(4001,
|
|
386
|
-
writeJsonl(
|
|
383
|
+
it("should skip stale-file check when proc.startTime is undefined", ()=>{
|
|
384
|
+
const proc = makeProc(4001, "/project/test", undefined); // no startTime
|
|
385
|
+
writePidFile(4001, "no-time-session", "/project/test", Date.now() - 999_999);
|
|
386
|
+
writeJsonl("/project/test", "no-time-session");
|
|
387
387
|
const { direct, fallback } = tryMatch([
|
|
388
388
|
proc
|
|
389
389
|
]);
|
|
@@ -392,43 +392,43 @@ describe('ClaudeSessionLocator', ()=>{
|
|
|
392
392
|
expect(fallback).toHaveLength(0);
|
|
393
393
|
});
|
|
394
394
|
});
|
|
395
|
-
describe(
|
|
395
|
+
describe("getProjectDir", ()=>{
|
|
396
396
|
let tmpDir;
|
|
397
397
|
let projectsDir;
|
|
398
398
|
let encode;
|
|
399
399
|
beforeEach(()=>{
|
|
400
400
|
tmpDir = makeTmpDir();
|
|
401
|
-
projectsDir = path.join(tmpDir,
|
|
401
|
+
projectsDir = path.join(tmpDir, "projects");
|
|
402
402
|
encode = bindProjectDir(new ClaudeSessionLocator({
|
|
403
403
|
projectsDir,
|
|
404
|
-
sessionsDir: path.join(tmpDir,
|
|
404
|
+
sessionsDir: path.join(tmpDir, "sessions")
|
|
405
405
|
}));
|
|
406
406
|
});
|
|
407
|
-
it(
|
|
408
|
-
expect(encode(
|
|
407
|
+
it("should replace path separators with hyphens", ()=>{
|
|
408
|
+
expect(encode("/Users/foo/bar")).toBe(path.join(projectsDir, "-Users-foo-bar"));
|
|
409
409
|
});
|
|
410
|
-
it(
|
|
411
|
-
expect(encode(
|
|
410
|
+
it("should encode underscores as hyphens (matches Claude Code CLI)", ()=>{
|
|
411
|
+
expect(encode("/Users/foo/my_project")).toBe(path.join(projectsDir, "-Users-foo-my-project"));
|
|
412
412
|
});
|
|
413
|
-
it(
|
|
414
|
-
expect(encode(
|
|
413
|
+
it("should encode dots as hyphens", ()=>{
|
|
414
|
+
expect(encode("/Users/foo/.worktrees/x")).toBe(path.join(projectsDir, "-Users-foo--worktrees-x"));
|
|
415
415
|
});
|
|
416
|
-
it(
|
|
416
|
+
it("should collide paths that differ only in non-alphanumeric chars", ()=>{
|
|
417
417
|
// The encoding is intentionally lossy — callers must
|
|
418
418
|
// disambiguate via session JSONL contents, not dir name.
|
|
419
|
-
expect(encode(
|
|
420
|
-
expect(encode(
|
|
419
|
+
expect(encode("/a/b_c")).toBe(encode("/a/b-c"));
|
|
420
|
+
expect(encode("/a/b_c")).toBe(encode("/a/b.c"));
|
|
421
421
|
});
|
|
422
|
-
it(
|
|
423
|
-
const cwd =
|
|
424
|
-
const expectedDir = path.join(projectsDir,
|
|
422
|
+
it("should resolve to a real session dir when cwd contains underscores", ()=>{
|
|
423
|
+
const cwd = "/Users/foo/my_project";
|
|
424
|
+
const expectedDir = path.join(projectsDir, "-Users-foo-my-project");
|
|
425
425
|
fs.mkdirSync(expectedDir, {
|
|
426
426
|
recursive: true
|
|
427
427
|
});
|
|
428
|
-
const sessionFile = path.join(expectedDir,
|
|
429
|
-
fs.writeFileSync(sessionFile,
|
|
428
|
+
const sessionFile = path.join(expectedDir, "session-underscore.jsonl");
|
|
429
|
+
fs.writeFileSync(sessionFile, "");
|
|
430
430
|
expect(encode(cwd)).toBe(expectedDir);
|
|
431
|
-
expect(fs.existsSync(path.join(encode(cwd),
|
|
431
|
+
expect(fs.existsSync(path.join(encode(cwd), "session-underscore.jsonl"))).toBe(true);
|
|
432
432
|
});
|
|
433
433
|
});
|
|
434
434
|
});
|