@ai-devkit/agent-manager 0.32.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 +134 -134
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/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 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -26
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js +99 -99
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/providers/codex/CodexAdapter.d.ts +27 -0
- package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/providers/codex/CodexAdapter.js +162 -0
- package/dist/providers/codex/CodexAdapter.js.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.js +35 -0
- package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.js +207 -0
- package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.js +68 -0
- package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
- package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
- package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionParser.js +262 -0
- package/dist/providers/codex/CodexSessionParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/providers/pi/PiAdapter.d.ts +28 -0
- package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
- package/dist/providers/pi/PiAdapter.js +153 -0
- package/dist/providers/pi/PiAdapter.js.map +1 -0
- package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
- package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/providers/pi/PiAgentMapper.js +37 -0
- package/dist/providers/pi/PiAgentMapper.js.map +1 -0
- package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
- package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionLocator.js +79 -0
- package/dist/providers/pi/PiSessionLocator.js.map +1 -0
- package/dist/providers/pi/PiSessionParser.d.ts +36 -0
- package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionParser.js +191 -0
- package/dist/providers/pi/PiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
- package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionTracker.js +69 -0
- package/dist/providers/pi/PiSessionTracker.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiCliProbe.js +15 -15
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.js +16 -16
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +6 -6
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js +130 -130
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.js +156 -0
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
- package/dist/runtime/RuntimeFactory.d.ts +4 -0
- package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
- package/dist/runtime/RuntimeFactory.js +11 -0
- package/dist/runtime/RuntimeFactory.js.map +1 -0
- package/dist/runtime/errors.d.ts +27 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +42 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/herdr/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 +217 -169
- 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 +144 -103
- package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
- package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
- package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
- package/src/providers/claude/ClaudeSessionParser.ts +322 -338
- package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
- package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
- package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
- package/src/providers/codex/CodexAdapter.ts +205 -0
- package/src/providers/codex/CodexAgentMapper.ts +35 -0
- package/src/providers/codex/CodexSessionLocator.ts +279 -0
- package/src/providers/codex/CodexSessionMapping.ts +89 -0
- package/src/providers/codex/CodexSessionParser.ts +385 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
- package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
- package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
- package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
- package/src/providers/pi/PiAdapter.ts +183 -0
- package/src/providers/pi/PiAgentMapper.ts +36 -0
- package/src/providers/pi/PiSessionLocator.ts +95 -0
- package/src/providers/pi/PiSessionParser.ts +284 -0
- package/src/providers/pi/PiSessionTracker.ts +87 -0
- package/src/providers/pi/durable/PiCliProbe.ts +42 -34
- package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
- package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
- package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
- package/src/providers/pi/durable/PiStreamParser.ts +82 -72
- package/src/readiness/AgentReadiness.ts +585 -513
- package/src/runtime/ManagedAgentRuntime.ts +266 -0
- package/src/runtime/RuntimeFactory.ts +13 -0
- package/src/runtime/errors.ts +50 -0
- package/src/runtime/herdr/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 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/adapters/PiAdapter.test.ts"],"sourcesContent":["/**\n * Tests for PiAdapter\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport { PiAdapter } from '../../adapters/PiAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { AgentRegistry } from '../../utils/AgentRegistry.js';\nimport { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';\nimport { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';\n\nvi.mock('../../utils/process.js', async (importOriginal) => {\n const actual = await importOriginal() as typeof import('../../utils/process.js');\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock('../../utils/matching.js', () => ({\n matchProcessesToSessions: vi.fn(),\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<typeof captureProcessSnapshot>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<typeof matchProcessesToSessions>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe('PiAdapter', () => {\n let adapter: PiAdapter;\n let tmpHome: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'pi-adapter-test-'));\n process.env.HOME = tmpHome;\n sessionsDir = path.join(tmpHome, '.pi', 'agent', 'sessions');\n fs.mkdirSync(sessionsDir, { recursive: true });\n\n adapter = new PiAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) => (\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name)))\n ));\n mockedMatchProcessesToSessions.mockReturnValue([]);\n mockedGenerateAgentName.mockImplementation((cwd: string, pid: number) => {\n const folder = path.basename(cwd) || 'unknown';\n return `${folder} (${pid})`;\n });\n });\n\n afterEach(() => {\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n it('exposes pi type', () => {\n expect(adapter.type).toBe('pi');\n });\n\n it('identifies Pi commands without matching unrelated paths', () => {\n expect(adapter.canHandle({ pid: 1, command: 'pi', cwd: '/repo', tty: 'ttys001' })).toBe(true);\n expect(adapter.canHandle({ pid: 2, command: '/usr/local/bin/PI --model x', cwd: '/repo', tty: 'ttys002' })).toBe(true);\n expect(adapter.canHandle({ pid: 3, command: 'node /opt/pi/bin/pi.js', cwd: '/repo', tty: 'ttys003' })).toBe(true);\n expect(adapter.canHandle({ pid: 4, command: 'node /repo/feature-pi-adapter/script.js', cwd: '/repo', tty: 'ttys004' })).toBe(false);\n expect(adapter.canHandle({ pid: 5, command: 'C:\\\\tools\\\\node.exe C:\\\\lib\\\\pi.js', cwd: '/repo', tty: 'ttys005' })).toBe(true);\n });\n\n it('rejects foreign executables from a hand-built snapshot context', async () => {\n const foreign: ProcessInfo = {\n pid: 6,\n command: 'claude --resume /Users/x/repos/pi/session.jsonl',\n cwd: '/repo',\n tty: 'ttys006',\n };\n\n expect(await adapter.detectAgents({ processes: [foreign] })).toEqual([]);\n });\n\n it('maps a running Pi process to the tracker session for its PID', async () => {\n const cwd = '/repo/project-a';\n const proc = makeProcess({ pid: 101, cwd });\n const sessionFile = writePiSession(cwd, [\n { type: 'session_meta', timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-101', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'implement Pi adapter' },\n { role: 'assistant', timestamp: new Date().toISOString(), content: 'working on it' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 101: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 101,\n projectPath: cwd,\n sessionId: 'sess-101',\n summary: 'implement Pi adapter',\n status: AgentStatus.WAITING,\n sessionFilePath: sessionFile,\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it('truncates long user prompts in detected agent summaries', async () => {\n const cwd = '/repo/project-long-summary';\n const proc = makeProcess({ pid: 112, cwd });\n const longPrompt = 'x'.repeat(140);\n const sessionFile = writePiSession(cwd, [\n { type: 'session', timestamp: '2026-06-10T08:58:20.754Z', id: 'sess-long', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: longPrompt },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 112: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0].summary).toHaveLength(120);\n expect(agents[0].summary.endsWith('...')).toBe(true);\n });\n\n it('uses the filename session id fallback and reports running when the latest message is from the user', async () => {\n const cwd = '/repo/project-filename-fallback';\n const proc = makeProcess({ pid: 113, cwd });\n const sessionFile = writePiSessionWithFileName(cwd, 'plain-session.jsonl', [\n { role: 'user', timestamp: new Date().toISOString(), content: 'still working' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 113: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0]).toMatchObject({\n sessionId: 'plain-session',\n summary: 'still working',\n status: AgentStatus.RUNNING,\n });\n });\n\n it('falls back to legacy matching when sessions.json is missing', async () => {\n const cwd = '/repo/project-b';\n const proc = makeProcess({ pid: 202, cwd });\n const sessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-202' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'fallback matching please' },\n ]);\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-202',\n filePath: sessionFile,\n projectDir: path.dirname(sessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 202,\n projectPath: cwd,\n sessionId: 'sess-202',\n summary: 'fallback matching please',\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledWith(\n [proc],\n expect.arrayContaining([\n expect.objectContaining({ filePath: sessionFile, resolvedCwd: cwd }),\n ]),\n );\n });\n\n it('ignores malformed tracker metadata and still falls back to legacy matching', async () => {\n const cwd = '/repo/project-c';\n const proc = makeProcess({ pid: 303, cwd });\n const sessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-303', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'recover from bad tracker' },\n ]);\n fs.writeFileSync(path.join(tmpHome, '.pi', 'agent', 'sessions.json'), '{bad json');\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-303',\n filePath: sessionFile,\n projectDir: path.dirname(sessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe('sess-303');\n });\n\n it('falls back to legacy matching when a trusted tracker session is unparseable', async () => {\n const cwd = '/repo/project-bad-tracker-session';\n const proc = makeProcess({ pid: 304, cwd });\n const badSessionFile = writePiSessionWithFileName(cwd, 'bad.jsonl', ['{not json']);\n const fallbackSessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-304', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'fallback after bad tracker session' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 304: badSessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-304',\n filePath: fallbackSessionFile,\n projectDir: path.dirname(fallbackSessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n sessionId: 'sess-304',\n summary: 'fallback after bad tracker session',\n sessionFilePath: fallbackSessionFile,\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalled();\n });\n\n it('does not trust tracker paths outside the Pi sessions directory', async () => {\n const cwd = '/repo/project-d';\n const proc = makeProcess({ pid: 404, cwd });\n const outside = path.join(tmpHome, 'outside.jsonl');\n fs.writeFileSync(outside, JSON.stringify({ role: 'user', content: 'nope' }));\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 404: outside }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 404,\n sessionId: 'pid-404',\n summary: 'Pi process running',\n });\n });\n\n it('returns a process-only agent when no session can be matched', async () => {\n const proc = makeProcess({ pid: 505, cwd: '/repo/project-e' });\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n status: AgentStatus.RUNNING,\n pid: 505,\n projectPath: '/repo/project-e',\n sessionId: 'pid-505',\n summary: 'Pi process running',\n });\n });\n\n it('reads user and assistant conversation messages from JSONL', () => {\n const cwd = '/repo/project-f';\n const sessionFile = writePiSession(cwd, [\n { role: 'system', timestamp: '2026-06-10T08:58:20.000Z', content: 'hidden' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'hello pi' },\n { type: 'assistant', timestamp: '2026-06-10T08:58:22.000Z', message: { content: 'hello human' } },\n '{not json',\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'hello pi', timestamp: '2026-06-10T08:58:21.000Z' },\n { role: 'assistant', content: 'hello human', timestamp: '2026-06-10T08:58:22.000Z' },\n ]);\n });\n\n it('includes system entries only in verbose conversation mode', () => {\n const cwd = '/repo/project-verbose';\n const sessionFile = writePiSession(cwd, [\n { role: 'system', timestamp: '2026-06-10T08:58:20.000Z', content: 'model changed' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'visible' },\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'visible', timestamp: '2026-06-10T08:58:21.000Z' },\n ]);\n expect(adapter.getConversation(sessionFile, { verbose: true })).toEqual([\n { role: 'system', content: 'model changed', timestamp: '2026-06-10T08:58:20.000Z' },\n { role: 'user', content: 'visible', timestamp: '2026-06-10T08:58:21.000Z' },\n ]);\n });\n\n it('reads real Pi message entries with nested role and text parts', async () => {\n const cwd = '/repo/project-real';\n const proc = makeProcess({ pid: 606, cwd });\n const sessionFile = writePiSession(cwd, [\n { type: 'session', version: 3, id: 'sess-real', timestamp: '2026-06-10T13:27:17.581Z', cwd },\n { type: 'model_change', id: 'model-1', timestamp: '2026-06-10T13:27:17.655Z', modelId: 'claude-sonnet-4-6' },\n {\n type: 'message',\n id: 'msg-user',\n timestamp: '2026-06-10T13:27:37.975Z',\n message: {\n role: 'user',\n content: [{ type: 'text', text: 'hello' }],\n timestamp: 1781098057974,\n },\n },\n {\n type: 'message',\n id: 'msg-assistant',\n timestamp: '2026-06-10T13:27:40.161Z',\n message: {\n role: 'assistant',\n content: [{ type: 'text', text: 'Hello! How can I help you today?' }],\n provider: 'anthropic',\n model: 'claude-sonnet-4-6',\n timestamp: 1781098058012,\n },\n },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 606: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'hello', timestamp: '2026-06-10T13:27:37.975Z' },\n { role: 'assistant', content: 'Hello! How can I help you today?', timestamp: '2026-06-10T13:27:40.161Z' },\n ]);\n\n const agents = await adapter.detectAgents();\n expect(agents[0]).toMatchObject({\n sessionId: 'sess-real',\n summary: 'hello',\n lastActive: new Date('2026-06-10T13:27:40.161Z'),\n });\n });\n\n it('lists historical sessions and applies cwd filtering', async () => {\n const matchingCwd = '/repo/project-g';\n const otherCwd = '/repo/project-h';\n const matchingSession = writePiSession(matchingCwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-g', cwd: matchingCwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'first matching message' },\n ]);\n writePiSession(otherCwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-h', cwd: otherCwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'other message' },\n ]);\n\n const sessions = await adapter.listSessions({ cwd: matchingCwd });\n\n expect(sessions).toEqual([\n expect.objectContaining({\n type: 'pi',\n sessionId: 'sess-g',\n cwd: matchingCwd,\n firstUserMessage: 'first matching message',\n sessionFilePath: matchingSession,\n }),\n ]);\n });\n\n function makeProcess(overrides: Partial<ProcessInfo>): ProcessInfo {\n return {\n pid: 1,\n command: 'pi',\n cwd: '/repo',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T08:58:20.000Z'),\n ...overrides,\n };\n }\n\n function writePiSession(cwd: string, entries: Array<Record<string, unknown> | string>): string {\n const projectDir = path.join(sessionsDir, encodeProjectDir(cwd));\n fs.mkdirSync(projectDir, { recursive: true });\n const sessionId = entries\n .map((entry) => typeof entry === 'string' ? undefined : entry.sessionId)\n .find((value): value is string => typeof value === 'string') ?? cryptoRandomSessionId();\n const filePath = path.join(projectDir, `2026-06-10T08-58-20-754Z_${sessionId}.jsonl`);\n fs.writeFileSync(\n filePath,\n entries.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry)).join('\\n'),\n );\n return filePath;\n }\n\n function writePiSessionWithFileName(cwd: string, fileName: string, entries: Array<Record<string, unknown> | string>): string {\n const projectDir = path.join(sessionsDir, encodeProjectDir(cwd));\n fs.mkdirSync(projectDir, { recursive: true });\n const filePath = path.join(projectDir, fileName);\n fs.writeFileSync(\n filePath,\n entries.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry)).join('\\n'),\n );\n return filePath;\n }\n\n function encodeProjectDir(cwd: string): string {\n return cwd.replace(/\\//g, '-').replace(/^-?/, '--') + '--';\n }\n\n function cryptoRandomSessionId(): string {\n return `019eb0c1-06d2-71ed-90ee-${Math.random().toString(16).slice(2, 14).padEnd(12, '0')}`;\n }\n});\n"],"names":["fs","os","path","PiAdapter","AgentStatus","AgentRegistry","listAgentProcesses","enrichProcesses","captureProcessSnapshot","matchProcessesToSessions","generateAgentName","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","adapter","tmpHome","sessionsDir","beforeEach","mkdtempSync","join","tmpdir","process","env","HOME","mkdirSync","recursive","mockReset","mockImplementation","procs","names","flatMap","name","mockReturnValue","cwd","pid","folder","basename","afterEach","rmSync","force","it","expect","type","toBe","canHandle","command","tty","foreign","detectAgents","processes","toEqual","proc","makeProcess","sessionFile","writePiSession","timestamp","sessionId","role","content","Date","toISOString","writeFileSync","JSON","stringify","agents","toHaveLength","toMatchObject","projectPath","summary","status","WAITING","sessionFilePath","not","toHaveBeenCalled","longPrompt","repeat","id","endsWith","writePiSessionWithFileName","RUNNING","session","filePath","projectDir","dirname","birthtimeMs","now","resolvedCwd","deltaMs","toHaveBeenCalledWith","arrayContaining","objectContaining","badSessionFile","fallbackSessionFile","outside","message","getConversation","verbose","version","modelId","text","provider","model","lastActive","matchingCwd","otherCwd","matchingSession","sessions","listSessions","firstUserMessage","overrides","startTime","entries","encodeProjectDir","map","entry","undefined","find","value","cryptoRandomSessionId","fileName","replace","Math","random","toString","slice","padEnd"],"mappings":"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"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import os from 'os';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import Database from 'better-sqlite3';
|
|
5
|
-
import { afterEach, describe, expect, it } from 'vitest';
|
|
6
|
-
import { DatabaseConnection } from '../../database/connection.js';
|
|
7
|
-
import { getSchemaVersion } from '../../database/schema.js';
|
|
8
|
-
const roots = [];
|
|
9
|
-
afterEach(()=>{
|
|
10
|
-
for (const root of roots.splice(0))fs.rmSync(root, {
|
|
11
|
-
recursive: true,
|
|
12
|
-
force: true
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
function dbPath() {
|
|
16
|
-
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-db-'));
|
|
17
|
-
roots.push(root);
|
|
18
|
-
return path.join(root, 'state', 'agents.db');
|
|
19
|
-
}
|
|
20
|
-
describe('durable agents schema', ()=>{
|
|
21
|
-
it('migrates to version 4 with durable constraints and indexes', ()=>{
|
|
22
|
-
const connection = new DatabaseConnection({
|
|
23
|
-
dbPath: dbPath()
|
|
24
|
-
});
|
|
25
|
-
expect(getSchemaVersion(connection)).toBe(4);
|
|
26
|
-
const table = connection.queryOne("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'durable_agents'");
|
|
27
|
-
expect(table?.sql).toContain("DEFAULT 'durable'");
|
|
28
|
-
expect(table?.sql).toContain("state IN ('ready','running','degraded')");
|
|
29
|
-
expect(connection.query("SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'durable_agents'").map(({ name })=>name)).toEqual(expect.arrayContaining([
|
|
30
|
-
'idx_durable_agents_state',
|
|
31
|
-
'idx_durable_agents_list'
|
|
32
|
-
]));
|
|
33
|
-
connection.close();
|
|
34
|
-
});
|
|
35
|
-
it('upgrades a version 3 database to nullable, unique provider sessions', ()=>{
|
|
36
|
-
const file = dbPath();
|
|
37
|
-
fs.mkdirSync(path.dirname(file), {
|
|
38
|
-
recursive: true
|
|
39
|
-
});
|
|
40
|
-
const raw = new Database(file);
|
|
41
|
-
raw.exec(`
|
|
42
|
-
CREATE TABLE durable_agents (
|
|
43
|
-
id TEXT PRIMARY KEY,
|
|
44
|
-
provider_session_id TEXT NOT NULL UNIQUE
|
|
45
|
-
);
|
|
46
|
-
INSERT INTO durable_agents (id, provider_session_id) VALUES ('existing', 'existing-session');
|
|
47
|
-
PRAGMA user_version = 3;
|
|
48
|
-
`);
|
|
49
|
-
raw.close();
|
|
50
|
-
const connection = new DatabaseConnection({
|
|
51
|
-
dbPath: file
|
|
52
|
-
});
|
|
53
|
-
expect(getSchemaVersion(connection)).toBe(4);
|
|
54
|
-
expect(()=>connection.execute('INSERT INTO durable_agents (id, provider_session_id) VALUES (?, NULL)', [
|
|
55
|
-
'codex'
|
|
56
|
-
])).not.toThrow();
|
|
57
|
-
expect(()=>connection.execute('INSERT INTO durable_agents (id, provider_session_id) VALUES (?, ?)', [
|
|
58
|
-
'duplicate',
|
|
59
|
-
'existing-session'
|
|
60
|
-
])).toThrow(/UNIQUE/i);
|
|
61
|
-
connection.close();
|
|
62
|
-
});
|
|
63
|
-
it('enforces case-insensitive names and active-run consistency but permits new providers', ()=>{
|
|
64
|
-
const connection = new DatabaseConnection({
|
|
65
|
-
dbPath: dbPath()
|
|
66
|
-
});
|
|
67
|
-
const insert = (name, provider, state = 'ready')=>connection.execute(`
|
|
68
|
-
INSERT INTO durable_agents (
|
|
69
|
-
id, name, provider, mode, cwd, provider_session_id, state, session_health,
|
|
70
|
-
created_at, updated_at
|
|
71
|
-
) VALUES (?, ?, ?, 'durable', '/tmp', ?, ?, 'uninitialized', ?, ?)
|
|
72
|
-
`, [
|
|
73
|
-
crypto.randomUUID(),
|
|
74
|
-
name,
|
|
75
|
-
provider,
|
|
76
|
-
crypto.randomUUID(),
|
|
77
|
-
state,
|
|
78
|
-
new Date().toISOString(),
|
|
79
|
-
new Date().toISOString()
|
|
80
|
-
]);
|
|
81
|
-
expect(()=>insert('Alpha', 'future-provider')).not.toThrow();
|
|
82
|
-
expect(()=>insert('alpha', 'claude')).toThrow(/UNIQUE/i);
|
|
83
|
-
expect(()=>insert('Broken', 'claude', 'running')).toThrow(/CHECK/i);
|
|
84
|
-
connection.close();
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe('readonly DatabaseConnection', ()=>{
|
|
88
|
-
it('opens an already migrated database without changing it', ()=>{
|
|
89
|
-
const file = dbPath();
|
|
90
|
-
const writable = new DatabaseConnection({
|
|
91
|
-
dbPath: file
|
|
92
|
-
});
|
|
93
|
-
writable.close();
|
|
94
|
-
const before = fs.statSync(file).mtimeMs;
|
|
95
|
-
const readonly = new DatabaseConnection({
|
|
96
|
-
dbPath: file,
|
|
97
|
-
readonly: true
|
|
98
|
-
});
|
|
99
|
-
expect(readonly.queryOne('PRAGMA user_version')?.user_version).toBe(4);
|
|
100
|
-
readonly.close();
|
|
101
|
-
expect(fs.statSync(file).mtimeMs).toBe(before);
|
|
102
|
-
});
|
|
103
|
-
it('does not create a missing database or migrate an old one', ()=>{
|
|
104
|
-
const missing = dbPath();
|
|
105
|
-
expect(()=>new DatabaseConnection({
|
|
106
|
-
dbPath: missing,
|
|
107
|
-
readonly: true
|
|
108
|
-
})).toThrow(/readonly.*exist/i);
|
|
109
|
-
expect(fs.existsSync(missing)).toBe(false);
|
|
110
|
-
fs.mkdirSync(path.dirname(missing), {
|
|
111
|
-
recursive: true
|
|
112
|
-
});
|
|
113
|
-
const raw = new Database(missing);
|
|
114
|
-
raw.pragma('user_version = 2');
|
|
115
|
-
raw.close();
|
|
116
|
-
expect(()=>new DatabaseConnection({
|
|
117
|
-
dbPath: missing,
|
|
118
|
-
readonly: true
|
|
119
|
-
})).toThrow(/schema version 3/i);
|
|
120
|
-
expect(new Database(missing, {
|
|
121
|
-
readonly: true
|
|
122
|
-
}).pragma('user_version', {
|
|
123
|
-
simple: true
|
|
124
|
-
})).toBe(2);
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
//# sourceMappingURL=DurableAgentsDatabase.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/database/DurableAgentsDatabase.test.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport Database from 'better-sqlite3';\nimport { afterEach, describe, expect, it } from 'vitest';\nimport { DatabaseConnection } from '../../database/connection.js';\nimport { getSchemaVersion } from '../../database/schema.js';\n\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction dbPath(): string {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-db-'));\n roots.push(root);\n return path.join(root, 'state', 'agents.db');\n}\n\ndescribe('durable agents schema', () => {\n it('migrates to version 4 with durable constraints and indexes', () => {\n const connection = new DatabaseConnection({ dbPath: dbPath() });\n expect(getSchemaVersion(connection)).toBe(4);\n const table = connection.queryOne<{ sql: string }>(\n \"SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'durable_agents'\",\n );\n expect(table?.sql).toContain(\"DEFAULT 'durable'\");\n expect(table?.sql).toContain(\"state IN ('ready','running','degraded')\");\n expect(connection.query<{ name: string }>(\n \"SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'durable_agents'\",\n ).map(({ name }) => name)).toEqual(expect.arrayContaining([\n 'idx_durable_agents_state', 'idx_durable_agents_list',\n ]));\n connection.close();\n });\n\n it('upgrades a version 3 database to nullable, unique provider sessions', () => {\n const file = dbPath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const raw = new Database(file);\n raw.exec(`\n CREATE TABLE durable_agents (\n id TEXT PRIMARY KEY,\n provider_session_id TEXT NOT NULL UNIQUE\n );\n INSERT INTO durable_agents (id, provider_session_id) VALUES ('existing', 'existing-session');\n PRAGMA user_version = 3;\n `);\n raw.close();\n\n const connection = new DatabaseConnection({ dbPath: file });\n expect(getSchemaVersion(connection)).toBe(4);\n expect(() => connection.execute(\n 'INSERT INTO durable_agents (id, provider_session_id) VALUES (?, NULL)', ['codex'],\n )).not.toThrow();\n expect(() => connection.execute(\n 'INSERT INTO durable_agents (id, provider_session_id) VALUES (?, ?)', ['duplicate', 'existing-session'],\n )).toThrow(/UNIQUE/i);\n connection.close();\n });\n\n it('enforces case-insensitive names and active-run consistency but permits new providers', () => {\n const connection = new DatabaseConnection({ dbPath: dbPath() });\n const insert = (name: string, provider: string, state = 'ready') => connection.execute(`\n INSERT INTO durable_agents (\n id, name, provider, mode, cwd, provider_session_id, state, session_health,\n created_at, updated_at\n ) VALUES (?, ?, ?, 'durable', '/tmp', ?, ?, 'uninitialized', ?, ?)\n `, [crypto.randomUUID(), name, provider, crypto.randomUUID(), state, new Date().toISOString(), new Date().toISOString()]);\n expect(() => insert('Alpha', 'future-provider')).not.toThrow();\n expect(() => insert('alpha', 'claude')).toThrow(/UNIQUE/i);\n expect(() => insert('Broken', 'claude', 'running')).toThrow(/CHECK/i);\n connection.close();\n });\n});\n\ndescribe('readonly DatabaseConnection', () => {\n it('opens an already migrated database without changing it', () => {\n const file = dbPath();\n const writable = new DatabaseConnection({ dbPath: file });\n writable.close();\n const before = fs.statSync(file).mtimeMs;\n const readonly = new DatabaseConnection({ dbPath: file, readonly: true });\n expect(readonly.queryOne<{ user_version: number }>('PRAGMA user_version')?.user_version).toBe(4);\n readonly.close();\n expect(fs.statSync(file).mtimeMs).toBe(before);\n });\n\n it('does not create a missing database or migrate an old one', () => {\n const missing = dbPath();\n expect(() => new DatabaseConnection({ dbPath: missing, readonly: true })).toThrow(/readonly.*exist/i);\n expect(fs.existsSync(missing)).toBe(false);\n\n fs.mkdirSync(path.dirname(missing), { recursive: true });\n const raw = new Database(missing);\n raw.pragma('user_version = 2');\n raw.close();\n expect(() => new DatabaseConnection({ dbPath: missing, readonly: true })).toThrow(/schema version 3/i);\n expect(new Database(missing, { readonly: true }).pragma('user_version', { simple: true })).toBe(2);\n });\n});\n"],"names":["fs","os","path","Database","afterEach","describe","expect","it","DatabaseConnection","getSchemaVersion","roots","root","splice","rmSync","recursive","force","dbPath","mkdtempSync","join","tmpdir","push","connection","toBe","table","queryOne","sql","toContain","query","map","name","toEqual","arrayContaining","close","file","mkdirSync","dirname","raw","exec","execute","not","toThrow","insert","provider","state","crypto","randomUUID","Date","toISOString","writable","before","statSync","mtimeMs","readonly","user_version","missing","existsSync","pragma","simple"],"mappings":"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"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codex Adapter
|
|
3
|
-
*
|
|
4
|
-
* Detects running Codex agents by:
|
|
5
|
-
* 1. Filtering Codex processes from a shared asynchronous process snapshot
|
|
6
|
-
* 2. Using snapshot CWD and start-time enrichment
|
|
7
|
-
* 3. Matching exact PID-to-session metadata from ~/.codex/ai-devkit/sessions.json
|
|
8
|
-
* 4. Discovering session files from ~/.codex/sessions/YYYY/MM/DD/ via shared batchGetSessionFileBirthtimes()
|
|
9
|
-
* 5. Setting resolvedCwd from session_meta first line
|
|
10
|
-
* 6. Matching sessions to processes via shared matchProcessesToSessions()
|
|
11
|
-
* 7. Extracting summary from last event entry in session JSONL
|
|
12
|
-
*/
|
|
13
|
-
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from './AgentAdapter.js';
|
|
14
|
-
import { AgentRegistry } from '../utils/AgentRegistry.js';
|
|
15
|
-
export declare class CodexAdapter implements AgentAdapter {
|
|
16
|
-
readonly type: "codex";
|
|
17
|
-
readonly processNames: readonly ["codex"];
|
|
18
|
-
private static readonly IDLE_THRESHOLD_MINUTES;
|
|
19
|
-
/** Include session files around process start day to recover long-lived processes. */
|
|
20
|
-
private static readonly PROCESS_START_DAY_WINDOW_DAYS;
|
|
21
|
-
private codexSessionsDir;
|
|
22
|
-
private sessionMappingPath;
|
|
23
|
-
private registry;
|
|
24
|
-
constructor(registry?: AgentRegistry);
|
|
25
|
-
canHandle(processInfo: ProcessInfo): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* Detect running Codex agents
|
|
28
|
-
*/
|
|
29
|
-
detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
|
|
30
|
-
private mapSessionMappingMatches;
|
|
31
|
-
private matchFromSessionMapping;
|
|
32
|
-
private readSessionMapping;
|
|
33
|
-
private toPid;
|
|
34
|
-
private isTrustedSessionPath;
|
|
35
|
-
private tryRegistryCache;
|
|
36
|
-
/**
|
|
37
|
-
* Match processes via `codex resume <uuid>` in their command line.
|
|
38
|
-
* Resumed sessions predate the process, so birth-time proximity cannot
|
|
39
|
-
* reliably pair them with the running PID.
|
|
40
|
-
*/
|
|
41
|
-
private tryResumeMatching;
|
|
42
|
-
private extractResumeSessionId;
|
|
43
|
-
private findSessionFileById;
|
|
44
|
-
private getCandidateSessionFiles;
|
|
45
|
-
private mapDirectMatches;
|
|
46
|
-
/**
|
|
47
|
-
* Discover session files for the given processes.
|
|
48
|
-
*
|
|
49
|
-
* Uses process start times to determine which YYYY/MM/DD date directories
|
|
50
|
-
* to scan (±1 day window), then batches stat calls across all directories.
|
|
51
|
-
* Reads each file once and caches content for later parsing by parseSession().
|
|
52
|
-
* Sets resolvedCwd from session_meta first line.
|
|
53
|
-
*/
|
|
54
|
-
private discoverSessions;
|
|
55
|
-
/**
|
|
56
|
-
* Determine which date directories to scan based on process start times.
|
|
57
|
-
* Returns only directories that actually exist.
|
|
58
|
-
*/
|
|
59
|
-
private getDateDirs;
|
|
60
|
-
private getDateDirsAroundDate;
|
|
61
|
-
private toSessionDayKey;
|
|
62
|
-
private tryParseUuidV7Date;
|
|
63
|
-
/**
|
|
64
|
-
* Parse session file content into CodexSession.
|
|
65
|
-
* Uses cached content if available, otherwise reads from disk.
|
|
66
|
-
*/
|
|
67
|
-
private parseSession;
|
|
68
|
-
private mapSessionToAgent;
|
|
69
|
-
private mapProcessOnlyAgent;
|
|
70
|
-
private findLastEventEntry;
|
|
71
|
-
private parseTimestamp;
|
|
72
|
-
private parseMetaTimestampMs;
|
|
73
|
-
private determineStatus;
|
|
74
|
-
private extractSummary;
|
|
75
|
-
private normalizedPayloadType;
|
|
76
|
-
private extractEntryText;
|
|
77
|
-
private truncate;
|
|
78
|
-
private isCodexExecutable;
|
|
79
|
-
/**
|
|
80
|
-
* Read the full conversation from a Codex session JSONL file.
|
|
81
|
-
*
|
|
82
|
-
* Codex entries use either legacy payload.message fields or current
|
|
83
|
-
* response_item/event_msg content arrays.
|
|
84
|
-
*/
|
|
85
|
-
getConversation(sessionFilePath: string, options?: {
|
|
86
|
-
verbose?: boolean;
|
|
87
|
-
}): ConversationMessage[];
|
|
88
|
-
private toConversationMessage;
|
|
89
|
-
private mapCodexRole;
|
|
90
|
-
private mapCodexItemRole;
|
|
91
|
-
private mirroredMessageKey;
|
|
92
|
-
private extractContentText;
|
|
93
|
-
listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
|
|
94
|
-
/**
|
|
95
|
-
* Walk every YYYY/MM/DD directory under `codexSessionsDir` and return
|
|
96
|
-
* absolute paths of `.jsonl` files. Tolerates malformed layouts
|
|
97
|
-
* (skips entries that aren't directories at the expected depth).
|
|
98
|
-
*/
|
|
99
|
-
private collectAllSessionFiles;
|
|
100
|
-
private collectSessionFilesInDateDirs;
|
|
101
|
-
/**
|
|
102
|
-
* Read a Codex session JSONL file and produce a {@link SessionSummary}.
|
|
103
|
-
* Returns null when the file is unreadable, has no `session_meta`, or
|
|
104
|
-
* lacks a session id.
|
|
105
|
-
*/
|
|
106
|
-
private fileToSessionSummary;
|
|
107
|
-
private isSyntheticUserMessage;
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=CodexAdapter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CodexAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/CodexAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA4D1D,qBAAa,YAAa,YAAW,YAAY;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,YAAY,qBAAsB;IAE3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IACnD,sFAAsF;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAK;IAE1D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,GAAE,aAAuC;IAO7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C;;OAEG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAqDzE,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,gBAAgB;IAiCxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,gBAAgB;IAgBxB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,kBAAkB;IAW1B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAKzB;;;;;OAKG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IA8ChG,OAAO,CAAC,qBAAqB;IAwC7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAYpB,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBzE;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,6BAA6B;IAarC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA8D5B,OAAO,CAAC,sBAAsB;CAGjC"}
|