@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
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from \"./AgentManager.js\";\nexport { getCodexCapacityReport } from \"./capacity/index.js\";\nexport type { CapacityProbeOptions, CapacityReport, CapacityWindow } from \"./capacity/index.js\";\nexport {\n getAgentReadinessReport,\n getAgentReadinessReports,\n worstReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n AuthReadinessCheck,\n BuiltInSkillsReadinessCheck,\n DirectoryReadinessCheck,\n ExecutableReadinessCheck,\n IntegrationReadinessCheck,\n ReadinessAgentType,\n ReadinessAuthState,\n ReadinessCheck,\n ReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\n\nexport { ClaudeCodeAdapter } from \"./providers/claude/ClaudeCodeAdapter.js\";\nexport { CodexAdapter } from \"./providers/codex/CodexAdapter.js\";\nexport { CopilotAdapter } from \"./adapters/CopilotAdapter.js\";\nexport { GeminiCliAdapter } from \"./adapters/GeminiCliAdapter.js\";\nexport { GrokCliAdapter } from \"./adapters/GrokCliAdapter.js\";\nexport { OpenCodeAdapter } from \"./adapters/OpenCodeAdapter.js\";\nexport { PiAdapter } from \"./providers/pi/PiAdapter.js\";\nexport { AgentStatus } from \"./adapters/AgentAdapter.js\";\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"./adapters/AgentAdapter.js\";\n\nexport { TerminalFocusManager, TerminalType } from \"./terminal/TerminalFocusManager.js\";\nexport type { TerminalLocation } from \"./terminal/TerminalFocusManager.js\";\nexport { TtyWriter } from \"./terminal/TtyWriter.js\";\n\nexport type { ListAgentsOptions } from \"./AgentManager.js\";\n\nexport {\n AgentRegistry,\n RenameNotFoundError,\n RenameConflictError,\n AGENT_RUNTIME_PROVIDERS,\n parseTmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport type {\n AgentRegistryOptions,\n RegistryEntry,\n AgentRuntimeProvider,\n TmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport { TmuxManager } from \"./terminal/TmuxManager.js\";\nexport type { AgentRuntimeAvailability, InteractiveAgentRuntime } from \"./runtime/types.js\";\nexport {\n startAgent,\n stopAgent,\n focusAgent,\n sendAgentPrompt,\n TmuxUnavailableError,\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n DEFAULT_PID_POLL_INTERVAL_MS,\n DEFAULT_PID_POLL_TIMEOUT_MS,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport type {\n FocusAgentDeps,\n StartAgentDeps,\n StartAgentOptions,\n StopAgentDeps,\n StopAgentResult,\n FocusAgentResult,\n SendAgentPromptDeps,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport { AGENTS } from \"./utils/agents.js\";\nexport type { AgentConfig, StartableAgentType } from \"./utils/agents.js\";\n\nexport type { AgentRequest } from \"./utils/agent-requests.js\";\nexport {\n getAgentRequestPath,\n readLatestAgentRequest,\n writeAgentRequest,\n} from \"./utils/agent-requests.js\";\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from \"./durable/DurableAgent.js\";\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from \"./durable/DurableAgent.js\";\nexport { DurableAgentRepository } from \"./durable/DurableAgentRepository.js\";\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from \"./durable/DurableAgentRepository.js\";\nexport { ClaudePrintAgentService } from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport { CodexCliProbe } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport type { CodexCliProbeOptions } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport { CodexPrintRunner } from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport { CodexPrintAgentService } from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport { PiCliProbe } from \"./providers/pi/durable/PiCliProbe.js\";\nexport type { PiCliProbeOptions } from \"./providers/pi/durable/PiCliProbe.js\";\nexport { PiPrintRunner } from \"./providers/pi/durable/PiPrintRunner.js\";\nexport type {\n PiPrintRunnerOptions,\n PiPrintRunRequest,\n PiPrintRunResult,\n} from \"./providers/pi/durable/PiPrintRunner.js\";\nexport { PiPrintAgentService } from \"./providers/pi/durable/PiPrintAgentService.js\";\nexport type {\n PiPrintAgentServiceOptions,\n PiPrintSendResult,\n} from \"./providers/pi/durable/PiPrintAgentService.js\";\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","getAgentReadinessReport","getAgentReadinessReports","worstReadinessStatus","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","AGENT_RUNTIME_PROVIDERS","parseTmuxRuntimeRef","TmuxManager","startAgent","stopAgent","focusAgent","sendAgentPrompt","TmuxUnavailableError","AgentNameInUseError","AgentPidPollTimeoutError","AgentRuntimeUnavailableError","AgentTerminalNotFoundError","DEFAULT_PID_POLL_INTERVAL_MS","DEFAULT_PID_POLL_TIMEOUT_MS","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAE7D,SACEC,uBAAuB,EACvBC,wBAAwB,EACxBC,oBAAoB,QACf,gCAAgC;AAevC,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,oCAAoC;AACjE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,gBAAgB,QAAQ,iCAAiC;AAClE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,8BAA8B;AACxD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SACEC,aAAa,EACbC,mBAAmB,EACnBC,mBAAmB,EACnBC,uBAAuB,EACvBC,mBAAmB,QACd,2BAA2B;AAOlC,SAASC,WAAW,QAAQ,4BAA4B;AAExD,SACEC,UAAU,EACVC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,oBAAoB,EACpBC,mBAAmB,EACnBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,2BAA2B,QACtB,mCAAmC;AAU1C,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SACEC,mBAAmB,EACnBC,sBAAsB,EACtBC,iBAAiB,QACZ,4BAA4B;AAEnC,SACEC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACP,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAMxE,SAASC,mBAAmB,QAAQ,gDAAgD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { AgentInfo, ProcessInfo } from
|
|
2
|
-
import { AgentStatus } from
|
|
3
|
-
import type { SessionFile } from
|
|
4
|
-
import { ClaudeSessionParser, type ClaudeSession } from
|
|
1
|
+
import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import type { SessionFile } from "../../utils/session.js";
|
|
4
|
+
import { ClaudeSessionParser, type ClaudeSession } from "./ClaudeSessionParser.js";
|
|
5
5
|
export interface ClaudeAgentLiveInfo {
|
|
6
6
|
pidStatus?: AgentStatus;
|
|
7
7
|
waitingFor?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,mBAAmB;
|
|
1
|
+
{"version":3,"file":"ClaudeAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,EAChB,OAAO,EACP,WAAW,EACX,WAAW,EACX,QAAQ,GACT,EAAE,uBAAuB,GAAG,SAAS;IAwBtC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAYzD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AgentStatus } from
|
|
2
|
-
import { generateAgentName } from
|
|
3
|
-
import { ClaudeSessionParser } from
|
|
1
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { generateAgentName } from "../../utils/matching.js";
|
|
3
|
+
import { ClaudeSessionParser } from "./ClaudeSessionParser.js";
|
|
4
4
|
export class ClaudeAgentMapper {
|
|
5
5
|
parser;
|
|
6
6
|
constructor(parser = new ClaudeSessionParser()){
|
|
@@ -11,15 +11,15 @@ export class ClaudeAgentMapper {
|
|
|
11
11
|
// status mis-classifies sessions whose latest entry is a UI-state
|
|
12
12
|
// event like `permission-mode` or `ai-title`.
|
|
13
13
|
const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);
|
|
14
|
-
const baseSummary = session.lastUserMessage ||
|
|
14
|
+
const baseSummary = session.lastUserMessage || "Session started";
|
|
15
15
|
const summary = status === AgentStatus.WAITING && liveInfo?.waitingFor ? `${baseSummary} — waiting for ${liveInfo.waitingFor}` : baseSummary;
|
|
16
16
|
return {
|
|
17
17
|
name: generateAgentName(processInfo.cwd, processInfo.pid),
|
|
18
|
-
type:
|
|
18
|
+
type: "claude",
|
|
19
19
|
status,
|
|
20
20
|
summary,
|
|
21
21
|
pid: processInfo.pid,
|
|
22
|
-
projectPath: sessionFile.resolvedCwd || processInfo.cwd ||
|
|
22
|
+
projectPath: sessionFile.resolvedCwd || processInfo.cwd || "",
|
|
23
23
|
sessionId: sessionFile.sessionId,
|
|
24
24
|
lastActive: session.lastActive,
|
|
25
25
|
sessionFilePath: sessionFile.filePath
|
|
@@ -27,12 +27,12 @@ export class ClaudeAgentMapper {
|
|
|
27
27
|
}
|
|
28
28
|
mapProcessOnlyAgent(processInfo) {
|
|
29
29
|
return {
|
|
30
|
-
name: generateAgentName(processInfo.cwd ||
|
|
31
|
-
type:
|
|
30
|
+
name: generateAgentName(processInfo.cwd || "", processInfo.pid),
|
|
31
|
+
type: "claude",
|
|
32
32
|
status: AgentStatus.IDLE,
|
|
33
|
-
summary:
|
|
33
|
+
summary: "Unknown",
|
|
34
34
|
pid: processInfo.pid,
|
|
35
|
-
projectPath: processInfo.cwd ||
|
|
35
|
+
projectPath: processInfo.cwd || "",
|
|
36
36
|
sessionId: `pid-${processInfo.pid}`,
|
|
37
37
|
lastActive: new Date()
|
|
38
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport type { SessionFile } from \"../../utils/session.js\";\nimport { ClaudeSessionParser, type ClaudeSession } from \"./ClaudeSessionParser.js\";\n\nexport interface ClaudeAgentLiveInfo {\n pidStatus?: AgentStatus;\n waitingFor?: string;\n}\n\nexport interface ClaudeSessionAgentInput {\n session: ClaudeSession;\n processInfo: ProcessInfo;\n sessionFile: SessionFile;\n liveInfo?: ClaudeAgentLiveInfo;\n}\n\nexport class ClaudeAgentMapper {\n constructor(private readonly parser: ClaudeSessionParser = new ClaudeSessionParser()) {}\n\n mapSessionToAgent({\n session,\n processInfo,\n sessionFile,\n liveInfo,\n }: ClaudeSessionAgentInput): AgentInfo {\n // Live PID-file status is authoritative when present — JSONL-derived\n // status mis-classifies sessions whose latest entry is a UI-state\n // event like `permission-mode` or `ai-title`.\n const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);\n const baseSummary = session.lastUserMessage || \"Session started\";\n const summary =\n status === AgentStatus.WAITING && liveInfo?.waitingFor\n ? `${baseSummary} — waiting for ${liveInfo.waitingFor}`\n : baseSummary;\n\n return {\n name: generateAgentName(processInfo.cwd, processInfo.pid),\n type: \"claude\",\n status,\n summary,\n pid: processInfo.pid,\n projectPath: sessionFile.resolvedCwd || processInfo.cwd || \"\",\n sessionId: sessionFile.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: sessionFile.filePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(processInfo.cwd || \"\", processInfo.pid),\n type: \"claude\",\n status: AgentStatus.IDLE,\n summary: \"Unknown\",\n pid: processInfo.pid,\n projectPath: processInfo.cwd || \"\",\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","ClaudeSessionParser","ClaudeAgentMapper","parser","mapSessionToAgent","session","processInfo","sessionFile","liveInfo","status","pidStatus","determineStatus","baseSummary","lastUserMessage","summary","WAITING","waitingFor","name","cwd","pid","type","projectPath","resolvedCwd","sessionId","lastActive","sessionFilePath","filePath","mapProcessOnlyAgent","IDLE","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAE5D,SAASC,mBAAmB,QAA4B,2BAA2B;AAcnF,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA8B,IAAIF,qBAAqB,CAAE;aAAzDE,SAAAA;IAA0D;IAEvFC,kBAAkB,EAChBC,OAAO,EACPC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACgB,EAAa;QACrC,qEAAqE;QACrE,kEAAkE;QAClE,8CAA8C;QAC9C,MAAMC,SAASD,UAAUE,aAAa,IAAI,CAACP,MAAM,CAACQ,eAAe,CAACN;QAClE,MAAMO,cAAcP,QAAQQ,eAAe,IAAI;QAC/C,MAAMC,UACJL,WAAWV,YAAYgB,OAAO,IAAIP,UAAUQ,aACxC,GAAGJ,YAAY,eAAe,EAAEJ,SAASQ,UAAU,EAAE,GACrDJ;QAEN,OAAO;YACLK,MAAMjB,kBAAkBM,YAAYY,GAAG,EAAEZ,YAAYa,GAAG;YACxDC,MAAM;YACNX;YACAK;YACAK,KAAKb,YAAYa,GAAG;YACpBE,aAAad,YAAYe,WAAW,IAAIhB,YAAYY,GAAG,IAAI;YAC3DK,WAAWhB,YAAYgB,SAAS;YAChCC,YAAYnB,QAAQmB,UAAU;YAC9BC,iBAAiBlB,YAAYmB,QAAQ;QACvC;IACF;IAEAC,oBAAoBrB,WAAwB,EAAa;QACvD,OAAO;YACLW,MAAMjB,kBAAkBM,YAAYY,GAAG,IAAI,IAAIZ,YAAYa,GAAG;YAC9DC,MAAM;YACNX,QAAQV,YAAY6B,IAAI;YACxBd,SAAS;YACTK,KAAKb,YAAYa,GAAG;YACpBE,aAAaf,YAAYY,GAAG,IAAI;YAChCK,WAAW,CAAC,IAAI,EAAEjB,YAAYa,GAAG,EAAE;YACnCK,YAAY,IAAIK;QAClB;IACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from
|
|
1
|
+
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
|
|
2
2
|
/**
|
|
3
3
|
* Claude Code Adapter
|
|
4
4
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAWxC;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,sBAAuB;IAE5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAU5B,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,kBAAkB;IAKpB,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmEzE,OAAO,CAAC,aAAa;IAOrB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAiC1E"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import * as path from
|
|
2
|
-
import { captureProcessSnapshot, executableBasename, filterByProcessNames } from
|
|
3
|
-
import { safeStat } from
|
|
4
|
-
import { ClaudeSessionParser } from
|
|
5
|
-
import { ClaudeAgentMapper } from
|
|
6
|
-
import { ClaudeSessionLocator } from
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { captureProcessSnapshot, executableBasename, filterByProcessNames } from "../../utils/process.js";
|
|
3
|
+
import { safeStat } from "../../utils/session.js";
|
|
4
|
+
import { ClaudeSessionParser } from "./ClaudeSessionParser.js";
|
|
5
|
+
import { ClaudeAgentMapper } from "./ClaudeAgentMapper.js";
|
|
6
|
+
import { ClaudeSessionLocator } from "./ClaudeSessionLocator.js";
|
|
7
7
|
/**
|
|
8
8
|
* Claude Code Adapter
|
|
9
9
|
*
|
|
@@ -14,18 +14,18 @@ import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
|
|
|
14
14
|
* 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file
|
|
15
15
|
* 5. Extracting summary from last user message in session JSONL
|
|
16
16
|
*/ export class ClaudeCodeAdapter {
|
|
17
|
-
type =
|
|
17
|
+
type = "claude";
|
|
18
18
|
processNames = [
|
|
19
|
-
|
|
19
|
+
"claude"
|
|
20
20
|
];
|
|
21
21
|
parser;
|
|
22
22
|
mapper;
|
|
23
23
|
projectsDir;
|
|
24
24
|
sessionsDir;
|
|
25
25
|
constructor(){
|
|
26
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE ||
|
|
27
|
-
this.projectsDir = path.join(homeDir,
|
|
28
|
-
this.sessionsDir = path.join(homeDir,
|
|
26
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
27
|
+
this.projectsDir = path.join(homeDir, ".claude", "projects");
|
|
28
|
+
this.sessionsDir = path.join(homeDir, ".claude", "sessions");
|
|
29
29
|
this.parser = new ClaudeSessionParser();
|
|
30
30
|
this.mapper = new ClaudeAgentMapper(this.parser);
|
|
31
31
|
}
|
|
@@ -34,7 +34,7 @@ import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
|
|
|
34
34
|
}
|
|
35
35
|
isClaudeExecutable(command) {
|
|
36
36
|
const base = executableBasename(command);
|
|
37
|
-
return base ===
|
|
37
|
+
return base === "claude" || base === "claude.exe";
|
|
38
38
|
}
|
|
39
39
|
async detectAgents(context) {
|
|
40
40
|
const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
|
|
@@ -113,10 +113,10 @@ import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
|
|
|
113
113
|
if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;
|
|
114
114
|
const stat = safeStat(filePath);
|
|
115
115
|
summaries.push({
|
|
116
|
-
type:
|
|
116
|
+
type: "claude",
|
|
117
117
|
sessionId: session.sessionId,
|
|
118
118
|
cwd: recordedCwd,
|
|
119
|
-
firstUserMessage: session.firstUserMessage ||
|
|
119
|
+
firstUserMessage: session.firstUserMessage || "",
|
|
120
120
|
lastActive: session.lastActive ?? stat?.mtime ?? new Date(),
|
|
121
121
|
startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),
|
|
122
122
|
sessionFilePath: filePath
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"sourcesContent":["import * as path from 'path';\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from '../../adapters/AgentAdapter.js';\nimport { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../../utils/process.js';\nimport { safeStat } from '../../utils/session.js';\nimport { ClaudeSessionParser } from './ClaudeSessionParser.js';\nimport { ClaudeAgentMapper } from './ClaudeAgentMapper.js';\nimport { ClaudeSessionLocator } from './ClaudeSessionLocator.js';\n\n/**\n * Claude Code Adapter\n *\n * Detects Claude Code agents by:\n * 1. Filtering Claude processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json\n * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file\n * 5. Extracting summary from last user message in session JSONL\n */\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly type = 'claude' as const;\n readonly processNames = ['claude'] as const;\n\n private parser: ClaudeSessionParser;\n private mapper: ClaudeAgentMapper;\n private projectsDir: string;\n private sessionsDir: string;\n\n constructor() {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n this.projectsDir = path.join(homeDir, '.claude', 'projects');\n this.sessionsDir = path.join(homeDir, '.claude', 'sessions');\n this.parser = new ClaudeSessionParser();\n this.mapper = new ClaudeAgentMapper(this.parser);\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isClaudeExecutable(processInfo.command);\n }\n\n private isClaudeExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === 'claude' || base === 'claude.exe';\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) {\n return [];\n }\n\n const { direct, legacyMatches } = this.createLocator().matchRunningProcesses(processes);\n\n const matchedPids = new Set([\n ...direct.map((d) => d.process.pid),\n ...legacyMatches.map((m) => m.process.pid),\n ]);\n\n const agents: AgentInfo[] = [];\n\n // Build agents from direct (resume + PID-file) matches\n for (const match of direct) {\n const { process: proc, sessionFile } = match;\n const sessionData = this.parser.readSession(sessionFile.filePath, sessionFile.resolvedCwd);\n if (sessionData) {\n agents.push(this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: proc,\n sessionFile,\n liveInfo: {\n pidStatus: match.pidStatus,\n waitingFor: match.waitingFor,\n },\n }));\n } else {\n matchedPids.delete(proc.pid);\n }\n }\n\n // Build agents from legacy matches\n for (const match of legacyMatches) {\n const sessionData = this.parser.readSession(\n match.session.filePath,\n match.session.resolvedCwd,\n );\n if (sessionData) {\n agents.push(this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: match.process,\n sessionFile: match.session,\n }));\n } else {\n matchedPids.delete(match.process.pid);\n }\n }\n\n // Any process with no match (direct or legacy) appears as IDLE\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n\n return agents;\n }\n\n private createLocator(): ClaudeSessionLocator {\n return new ClaudeSessionLocator({\n projectsDir: this.projectsDir,\n sessionsDir: this.sessionsDir,\n });\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const candidates = this.createLocator().discoverHistoricalSessionFiles();\n const summaries: SessionSummary[] = [];\n\n for (const { filePath, defaultCwd } of candidates) {\n const session = this.parser.readSession(filePath, defaultCwd);\n if (!session) continue;\n\n // Drop sessions whose JSONL had no parseable conversation entries.\n // readSession is permissive (returns a shell record even when every\n // line fails to parse); listSessions needs at least one real entry\n // so we don't surface garbage files.\n if (!session.lastEntryType) continue;\n\n const recordedCwd = session.lastCwd || defaultCwd;\n if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;\n\n const stat = safeStat(filePath);\n\n summaries.push({\n type: 'claude',\n sessionId: session.sessionId,\n cwd: recordedCwd,\n firstUserMessage: session.firstUserMessage || '',\n lastActive: session.lastActive ?? stat?.mtime ?? new Date(),\n startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),\n sessionFilePath: filePath,\n });\n }\n\n return summaries;\n }\n}\n"],"names":["path","captureProcessSnapshot","executableBasename","filterByProcessNames","safeStat","ClaudeSessionParser","ClaudeAgentMapper","ClaudeSessionLocator","ClaudeCodeAdapter","type","processNames","parser","mapper","projectsDir","sessionsDir","homeDir","process","env","HOME","USERPROFILE","join","canHandle","processInfo","isClaudeExecutable","command","base","detectAgents","context","snapshot","processes","relevant","filter","length","direct","legacyMatches","createLocator","matchRunningProcesses","matchedPids","Set","map","d","pid","m","agents","match","proc","sessionFile","sessionData","readSession","filePath","resolvedCwd","push","mapSessionToAgent","session","liveInfo","pidStatus","waitingFor","delete","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","cwd","candidates","discoverHistoricalSessionFiles","summaries","defaultCwd","lastEntryType","recordedCwd","lastCwd","undefined","stat","sessionId","firstUserMessage","lastActive","mtime","Date","startedAt","sessionStart","birthtime"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"sourcesContent":["import * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n} from \"../../utils/process.js\";\nimport { safeStat } from \"../../utils/session.js\";\nimport { ClaudeSessionParser } from \"./ClaudeSessionParser.js\";\nimport { ClaudeAgentMapper } from \"./ClaudeAgentMapper.js\";\nimport { ClaudeSessionLocator } from \"./ClaudeSessionLocator.js\";\n\n/**\n * Claude Code Adapter\n *\n * Detects Claude Code agents by:\n * 1. Filtering Claude processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json\n * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file\n * 5. Extracting summary from last user message in session JSONL\n */\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly type = \"claude\" as const;\n readonly processNames = [\"claude\"] as const;\n\n private parser: ClaudeSessionParser;\n private mapper: ClaudeAgentMapper;\n private projectsDir: string;\n private sessionsDir: string;\n\n constructor() {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n this.projectsDir = path.join(homeDir, \".claude\", \"projects\");\n this.sessionsDir = path.join(homeDir, \".claude\", \"sessions\");\n this.parser = new ClaudeSessionParser();\n this.mapper = new ClaudeAgentMapper(this.parser);\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isClaudeExecutable(processInfo.command);\n }\n\n private isClaudeExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === \"claude\" || base === \"claude.exe\";\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) {\n return [];\n }\n\n const { direct, legacyMatches } = this.createLocator().matchRunningProcesses(processes);\n\n const matchedPids = new Set([\n ...direct.map((d) => d.process.pid),\n ...legacyMatches.map((m) => m.process.pid),\n ]);\n\n const agents: AgentInfo[] = [];\n\n // Build agents from direct (resume + PID-file) matches\n for (const match of direct) {\n const { process: proc, sessionFile } = match;\n const sessionData = this.parser.readSession(sessionFile.filePath, sessionFile.resolvedCwd);\n if (sessionData) {\n agents.push(\n this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: proc,\n sessionFile,\n liveInfo: {\n pidStatus: match.pidStatus,\n waitingFor: match.waitingFor,\n },\n }),\n );\n } else {\n matchedPids.delete(proc.pid);\n }\n }\n\n // Build agents from legacy matches\n for (const match of legacyMatches) {\n const sessionData = this.parser.readSession(\n match.session.filePath,\n match.session.resolvedCwd,\n );\n if (sessionData) {\n agents.push(\n this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: match.process,\n sessionFile: match.session,\n }),\n );\n } else {\n matchedPids.delete(match.process.pid);\n }\n }\n\n // Any process with no match (direct or legacy) appears as IDLE\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n\n return agents;\n }\n\n private createLocator(): ClaudeSessionLocator {\n return new ClaudeSessionLocator({\n projectsDir: this.projectsDir,\n sessionsDir: this.sessionsDir,\n });\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const candidates = this.createLocator().discoverHistoricalSessionFiles();\n const summaries: SessionSummary[] = [];\n\n for (const { filePath, defaultCwd } of candidates) {\n const session = this.parser.readSession(filePath, defaultCwd);\n if (!session) continue;\n\n // Drop sessions whose JSONL had no parseable conversation entries.\n // readSession is permissive (returns a shell record even when every\n // line fails to parse); listSessions needs at least one real entry\n // so we don't surface garbage files.\n if (!session.lastEntryType) continue;\n\n const recordedCwd = session.lastCwd || defaultCwd;\n if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;\n\n const stat = safeStat(filePath);\n\n summaries.push({\n type: \"claude\",\n sessionId: session.sessionId,\n cwd: recordedCwd,\n firstUserMessage: session.firstUserMessage || \"\",\n lastActive: session.lastActive ?? stat?.mtime ?? new Date(),\n startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),\n sessionFilePath: filePath,\n });\n }\n\n return summaries;\n }\n}\n"],"names":["path","captureProcessSnapshot","executableBasename","filterByProcessNames","safeStat","ClaudeSessionParser","ClaudeAgentMapper","ClaudeSessionLocator","ClaudeCodeAdapter","type","processNames","parser","mapper","projectsDir","sessionsDir","homeDir","process","env","HOME","USERPROFILE","join","canHandle","processInfo","isClaudeExecutable","command","base","detectAgents","context","snapshot","processes","relevant","filter","length","direct","legacyMatches","createLocator","matchRunningProcesses","matchedPids","Set","map","d","pid","m","agents","match","proc","sessionFile","sessionData","readSession","filePath","resolvedCwd","push","mapSessionToAgent","session","liveInfo","pidStatus","waitingFor","delete","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","cwd","candidates","discoverHistoricalSessionFiles","summaries","defaultCwd","lastEntryType","recordedCwd","lastCwd","undefined","stat","sessionId","firstUserMessage","lastActive","mtime","Date","startedAt","sessionStart","birthtime"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { ProcessInfo } from
|
|
2
|
-
import { AgentStatus } from
|
|
3
|
-
import { type MatchResult } from
|
|
4
|
-
import { type SessionFile } from
|
|
1
|
+
import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import { type MatchResult } from "../../utils/matching.js";
|
|
4
|
+
import { type SessionFile } from "../../utils/session.js";
|
|
5
5
|
/**
|
|
6
6
|
* A process directly matched to a session via PID file (authoritative path).
|
|
7
7
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClaudeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,
|
|
1
|
+
{"version":3,"file":"ClaudeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAyBhC;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,aAAa,EAAE,WAAW,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,2BAAgC;IAMrD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,2BAA2B;IAe5E;;;;;;;;;;OAUG;IACH,8BAA8B,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBjF;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IA6B7D;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA8CzB,OAAO,CAAC,sBAAsB;IAK9B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;CAsC3B"}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import * as fs from
|
|
2
|
-
import * as path from
|
|
3
|
-
import { AgentStatus } from
|
|
4
|
-
import { matchProcessesToSessions } from
|
|
5
|
-
import { batchGetSessionFileBirthtimes, isDirectory, listJsonl, safeReaddir, safeStat } from
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
4
|
+
import { matchProcessesToSessions } from "../../utils/matching.js";
|
|
5
|
+
import { batchGetSessionFileBirthtimes, isDirectory, listJsonl, safeReaddir, safeStat } from "../../utils/session.js";
|
|
6
6
|
/** Maximum allowed delta (ms) between process start time and PID file startedAt. */ const PID_FILE_STALENESS_MS = 60000;
|
|
7
7
|
export class ClaudeSessionLocator {
|
|
8
8
|
projectsDir;
|
|
9
9
|
sessionsDir;
|
|
10
10
|
constructor(options = {}){
|
|
11
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE ||
|
|
12
|
-
this.projectsDir = options.projectsDir ?? path.join(homeDir,
|
|
13
|
-
this.sessionsDir = options.sessionsDir ?? path.join(homeDir,
|
|
11
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
12
|
+
this.projectsDir = options.projectsDir ?? path.join(homeDir, ".claude", "projects");
|
|
13
|
+
this.sessionsDir = options.sessionsDir ?? path.join(homeDir, ".claude", "sessions");
|
|
14
14
|
}
|
|
15
15
|
/**
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
* Pair live Claude processes with their session files.
|
|
17
|
+
*
|
|
18
|
+
* Runs three staged strategies, each handing its unmatched processes
|
|
19
|
+
* to the next:
|
|
20
|
+
* 1. `--resume <id>` on the command line — authoritative for resumed
|
|
21
|
+
* sessions whose JSONL predates the process.
|
|
22
|
+
* 2. PID-file matching via ~/.claude/sessions/<pid>.json.
|
|
23
|
+
* 3. Legacy CWD+birthtime heuristic, for processes with no PID file.
|
|
24
|
+
*/ matchRunningProcesses(processes) {
|
|
25
25
|
const { direct: resumeDirect, fallback: noResume } = this.tryResumeMatching(processes);
|
|
26
26
|
const { direct: pidDirect, fallback } = this.tryPidFileMatching(noResume);
|
|
27
27
|
const legacySessions = this.discoverLiveSessions(fallback);
|
|
@@ -35,16 +35,16 @@ export class ClaudeSessionLocator {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
* Discover candidate session files for listing historical sessions.
|
|
39
|
+
*
|
|
40
|
+
* Always walks every subdirectory of `projectsDir`. We can't use the
|
|
41
|
+
* encoded-dir shortcut for the cwd-scoped path because Claude Code
|
|
42
|
+
* indexes session files by where the *process was launched*, not by
|
|
43
|
+
* the recorded `cwd` field inside the session — these diverge in
|
|
44
|
+
* worktrees and similar setups. The cwd filter is applied later
|
|
45
|
+
* against `session.lastCwd` so callers see exactly the sessions whose
|
|
46
|
+
* recorded cwd matches.
|
|
47
|
+
*/ discoverHistoricalSessionFiles() {
|
|
48
48
|
const out = [];
|
|
49
49
|
if (!isDirectory(this.projectsDir)) return out;
|
|
50
50
|
for (const dirName of safeReaddir(this.projectsDir)){
|
|
@@ -54,7 +54,7 @@ export class ClaudeSessionLocator {
|
|
|
54
54
|
// recorded cwd: '-Users-foo-bar' → '/Users/foo/bar'. Lossy for
|
|
55
55
|
// paths containing '-'; session content's lastCwd overrides
|
|
56
56
|
// this when available.
|
|
57
|
-
const decoded = dirName.replace(/-/g,
|
|
57
|
+
const decoded = dirName.replace(/-/g, "/");
|
|
58
58
|
for (const name of listJsonl(projectDir)){
|
|
59
59
|
out.push({
|
|
60
60
|
filePath: path.join(projectDir, name),
|
|
@@ -65,28 +65,28 @@ export class ClaudeSessionLocator {
|
|
|
65
65
|
return out;
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const encoded = cwd.replace(/[^a-zA-Z0-9]/g,
|
|
68
|
+
* Derive the Claude Code project directory for a given CWD.
|
|
69
|
+
*
|
|
70
|
+
* Claude Code encodes paths by replacing every non-alphanumeric
|
|
71
|
+
* character with '-', so '/', '_', '.', spaces, etc. all collapse:
|
|
72
|
+
* /Users/foo/bar → -Users-foo-bar
|
|
73
|
+
* /Users/foo/my_project → -Users-foo-my-project
|
|
74
|
+
* /Users/foo/.worktrees/x → -Users-foo--worktrees-x
|
|
75
|
+
*
|
|
76
|
+
* The encoding is lossy — multiple real paths can collide on the
|
|
77
|
+
* same encoded dir. Callers that need to disambiguate must read the
|
|
78
|
+
* `cwd` field inside each session JSONL.
|
|
79
|
+
*/ getProjectDir(cwd) {
|
|
80
|
+
const encoded = cwd.replace(/[^a-zA-Z0-9]/g, "-");
|
|
81
81
|
return path.join(this.projectsDir, encoded);
|
|
82
82
|
}
|
|
83
83
|
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
84
|
+
* Discover session files for the given processes.
|
|
85
|
+
*
|
|
86
|
+
* For each unique process CWD, encodes it to derive the expected
|
|
87
|
+
* ~/.claude/projects/<encoded>/ directory, then gets session file birthtimes
|
|
88
|
+
* via a single batched stat call across all directories.
|
|
89
|
+
*/ discoverLiveSessions(processes) {
|
|
90
90
|
const dirToCwd = new Map();
|
|
91
91
|
for (const proc of processes){
|
|
92
92
|
if (!proc.cwd) continue;
|
|
@@ -104,16 +104,16 @@ export class ClaudeSessionLocator {
|
|
|
104
104
|
...dirToCwd.keys()
|
|
105
105
|
]);
|
|
106
106
|
for (const file of files){
|
|
107
|
-
file.resolvedCwd = dirToCwd.get(file.projectDir) ||
|
|
107
|
+
file.resolvedCwd = dirToCwd.get(file.projectDir) || "";
|
|
108
108
|
}
|
|
109
109
|
return files;
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
112
|
+
* Match processes via `claude --resume <uuid>` in their command line.
|
|
113
|
+
* This works for resumed sessions, where the JSONL was created earlier
|
|
114
|
+
* (so its birthtime is far from the process startTime and the legacy
|
|
115
|
+
* matcher can't pair them) and the PID file may also be misaligned.
|
|
116
|
+
*/ tryResumeMatching(processes) {
|
|
117
117
|
const direct = [];
|
|
118
118
|
const fallback = [];
|
|
119
119
|
for (const proc of processes){
|
|
@@ -157,17 +157,17 @@ export class ClaudeSessionLocator {
|
|
|
157
157
|
return match?.[1] ?? null;
|
|
158
158
|
}
|
|
159
159
|
/**
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
* Read and parse ~/.claude/sessions/<pid>.json, returning null on any
|
|
161
|
+
* I/O / parse failure or when the file is stale relative to the live
|
|
162
|
+
* process.
|
|
163
|
+
*
|
|
164
|
+
* "Stale" means the PID file's startedAt diverges from the process's
|
|
165
|
+
* start time by more than {@link PID_FILE_STALENESS_MS} — typically
|
|
166
|
+
* a previous Claude Code process recycled the same PID without cleanup.
|
|
167
|
+
*/ readMatchingPidFile(pid, procStartTime) {
|
|
168
168
|
const pidFilePath = path.join(this.sessionsDir, `${pid}.json`);
|
|
169
169
|
try {
|
|
170
|
-
const entry = JSON.parse(fs.readFileSync(pidFilePath,
|
|
170
|
+
const entry = JSON.parse(fs.readFileSync(pidFilePath, "utf-8"));
|
|
171
171
|
if (procStartTime) {
|
|
172
172
|
const deltaMs = Math.abs(procStartTime.getTime() - entry.startedAt);
|
|
173
173
|
if (deltaMs > PID_FILE_STALENESS_MS) {
|
|
@@ -180,32 +180,32 @@ export class ClaudeSessionLocator {
|
|
|
180
180
|
}
|
|
181
181
|
}
|
|
182
182
|
/**
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
183
|
+
* Map the PID file's live status string to {@link AgentStatus}.
|
|
184
|
+
*
|
|
185
|
+
* Returns undefined for missing / unrecognized values so the caller
|
|
186
|
+
* can fall back to JSONL-derived heuristics.
|
|
187
|
+
*/ mapPidStatus(status) {
|
|
188
188
|
switch(status){
|
|
189
|
-
case
|
|
189
|
+
case "running":
|
|
190
190
|
return AgentStatus.RUNNING;
|
|
191
|
-
case
|
|
191
|
+
case "waiting":
|
|
192
192
|
return AgentStatus.WAITING;
|
|
193
|
-
case
|
|
193
|
+
case "idle":
|
|
194
194
|
return AgentStatus.IDLE;
|
|
195
195
|
default:
|
|
196
196
|
return undefined;
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
/**
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
200
|
+
* Attempt to match each process to its session via ~/.claude/sessions/<pid>.json.
|
|
201
|
+
*
|
|
202
|
+
* Returns:
|
|
203
|
+
* direct — processes matched authoritatively via PID file
|
|
204
|
+
* fallback — processes with no valid PID file (sent to legacy matching)
|
|
205
|
+
*
|
|
206
|
+
* Per-process fallback triggers on: file absent, malformed JSON,
|
|
207
|
+
* stale startedAt (>60s from proc.startTime), or missing JSONL.
|
|
208
|
+
*/ tryPidFileMatching(processes) {
|
|
209
209
|
const direct = [];
|
|
210
210
|
const fallback = [];
|
|
211
211
|
for (const proc of processes){
|