@ai-devkit/agent-manager 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +3 -3
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +80 -79
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +413 -388
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +93 -93
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/index.test.js +17 -17
- package/dist/__tests__/capacity/index.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgent.test.js +9 -9
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +301 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
- package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
- package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
- package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
- package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/__tests__/utils/agent-requests.test.js +43 -43
- package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
- package/dist/__tests__/utils/agents.test.js +17 -17
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/matching.test.js +92 -92
- package/dist/__tests__/utils/matching.test.js.map +1 -1
- package/dist/__tests__/utils/process.test.js +108 -108
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/__tests__/utils/session.test.js +53 -53
- package/dist/__tests__/utils/session.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +2 -2
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +1 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/adapters/CopilotAdapter.d.ts +2 -2
- package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
- package/dist/adapters/CopilotAdapter.js +51 -51
- package/dist/adapters/CopilotAdapter.js.map +1 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
- package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GeminiCliAdapter.js +86 -86
- package/dist/adapters/GeminiCliAdapter.js.map +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GrokCliAdapter.js +80 -80
- package/dist/adapters/GrokCliAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +37 -36
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +9 -9
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -8
- package/dist/adapters/index.js.map +1 -1
- package/dist/capacity/codex.d.ts +3 -3
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +57 -57
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +3 -3
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +8 -8
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/types.d.ts +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/database/connection.d.ts +1 -1
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +15 -15
- package/dist/database/connection.js.map +1 -1
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/migrations/005_agent_runtime.sql +2 -0
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +7 -7
- package/dist/database/schema.js.map +1 -1
- package/dist/durable/DurableAgent.d.ts +9 -9
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +16 -16
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +4 -4
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +49 -48
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +1 -1
- package/dist/durable/process.d.ts.map +1 -1
- package/dist/durable/process.js +14 -14
- package/dist/durable/process.js.map +1 -1
- package/dist/durable/run.d.ts +2 -2
- package/dist/durable/run.d.ts.map +1 -1
- package/dist/durable/run.js +6 -6
- package/dist/durable/run.js.map +1 -1
- package/dist/durable/utils.d.ts +1 -1
- package/dist/durable/utils.d.ts.map +1 -1
- package/dist/durable/utils.js +4 -4
- package/dist/durable/utils.js.map +1 -1
- package/dist/index.d.ts +46 -41
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -25
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js +99 -99
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/providers/codex/CodexAdapter.d.ts +27 -0
- package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/providers/codex/CodexAdapter.js +162 -0
- package/dist/providers/codex/CodexAdapter.js.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.js +35 -0
- package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.js +207 -0
- package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.js +68 -0
- package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
- package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
- package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionParser.js +262 -0
- package/dist/providers/codex/CodexSessionParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/providers/pi/PiAdapter.d.ts +28 -0
- package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
- package/dist/providers/pi/PiAdapter.js +153 -0
- package/dist/providers/pi/PiAdapter.js.map +1 -0
- package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
- package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/providers/pi/PiAgentMapper.js +37 -0
- package/dist/providers/pi/PiAgentMapper.js.map +1 -0
- package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
- package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionLocator.js +79 -0
- package/dist/providers/pi/PiSessionLocator.js.map +1 -0
- package/dist/providers/pi/PiSessionParser.d.ts +36 -0
- package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionParser.js +191 -0
- package/dist/providers/pi/PiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
- package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionTracker.js +69 -0
- package/dist/providers/pi/PiSessionTracker.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiCliProbe.js +15 -15
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.js +16 -16
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +67 -0
- package/dist/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/readiness/AgentReadiness.js +614 -0
- package/dist/readiness/AgentReadiness.js.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.js +156 -0
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
- package/dist/runtime/RuntimeFactory.d.ts +4 -0
- package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
- package/dist/runtime/RuntimeFactory.js +11 -0
- package/dist/runtime/RuntimeFactory.js.map +1 -0
- package/dist/runtime/errors.d.ts +27 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +42 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.js +60 -0
- package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.js +10 -0
- package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
- package/dist/runtime/tmux/PidPolling.d.ts +5 -0
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
- package/dist/runtime/tmux/PidPolling.js +24 -0
- package/dist/runtime/tmux/PidPolling.js.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
- package/dist/runtime/types.d.ts +54 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +50 -50
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TmuxManager.d.ts.map +1 -1
- package/dist/terminal/TmuxManager.js +47 -47
- package/dist/terminal/TmuxManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -1
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +89 -89
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/index.d.ts +4 -4
- package/dist/terminal/index.js +3 -3
- package/dist/terminal/index.js.map +1 -1
- package/dist/utils/AgentRegistry.d.ts +10 -2
- package/dist/utils/AgentRegistry.d.ts.map +1 -1
- package/dist/utils/AgentRegistry.js +57 -24
- package/dist/utils/AgentRegistry.js.map +1 -1
- package/dist/utils/agent-requests.d.ts.map +1 -1
- package/dist/utils/agent-requests.js +5 -5
- package/dist/utils/agent-requests.js.map +1 -1
- package/dist/utils/agents.d.ts +2 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +15 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/applescript.js +1 -1
- package/dist/utils/applescript.js.map +1 -1
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matching.d.ts +2 -2
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +4 -4
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/process.d.ts +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +74 -74
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/session.d.ts +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +7 -7
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/sortAgents.d.ts +2 -2
- package/dist/utils/sortAgents.d.ts.map +1 -1
- package/dist/utils/sortAgents.js +5 -5
- package/dist/utils/sortAgents.js.map +1 -1
- package/package.json +18 -19
- package/src/AgentManager.ts +283 -281
- package/src/__tests__/AgentManager.test.ts +917 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
- package/src/__tests__/capacity/codex.test.ts +178 -91
- package/src/__tests__/capacity/index.test.ts +27 -18
- package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
- package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
- package/src/__tests__/fixtures/fake-claude.cjs +20 -13
- package/src/__tests__/fixtures/fake-codex.cjs +41 -30
- package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
- package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
- package/src/__tests__/print/DurableAgent.test.ts +19 -16
- package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
- package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
- package/src/__tests__/readiness/AgentReadiness.test.ts +242 -0
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
- package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
- package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
- package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
- package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
- package/src/__tests__/utils/agent-requests.test.ts +76 -56
- package/src/__tests__/utils/agents.test.ts +20 -20
- package/src/__tests__/utils/matching.test.ts +206 -171
- package/src/__tests__/utils/process.test.ts +276 -262
- package/src/__tests__/utils/session.test.ts +133 -139
- package/src/adapters/AgentAdapter.ts +134 -126
- package/src/adapters/CopilotAdapter.ts +405 -395
- package/src/adapters/GeminiCliAdapter.ts +598 -600
- package/src/adapters/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +285 -259
- package/src/adapters/index.ts +15 -9
- package/src/capacity/codex.ts +137 -84
- package/src/capacity/index.ts +18 -13
- package/src/capacity/types.ts +1 -1
- package/src/database/connection.ts +73 -68
- package/src/database/index.ts +6 -6
- package/src/database/migrations/005_agent_runtime.sql +2 -0
- package/src/database/schema.ts +40 -38
- package/src/durable/DurableAgent.ts +85 -85
- package/src/durable/DurableAgentRepository.ts +409 -260
- package/src/durable/process.ts +22 -21
- package/src/durable/run.ts +61 -51
- package/src/durable/utils.ts +46 -41
- package/src/index.ts +145 -86
- package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
- package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
- package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
- package/src/providers/claude/ClaudeSessionParser.ts +322 -338
- package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
- package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
- package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
- package/src/providers/codex/CodexAdapter.ts +205 -0
- package/src/providers/codex/CodexAgentMapper.ts +35 -0
- package/src/providers/codex/CodexSessionLocator.ts +279 -0
- package/src/providers/codex/CodexSessionMapping.ts +89 -0
- package/src/providers/codex/CodexSessionParser.ts +385 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
- package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
- package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
- package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
- package/src/providers/pi/PiAdapter.ts +183 -0
- package/src/providers/pi/PiAgentMapper.ts +36 -0
- package/src/providers/pi/PiSessionLocator.ts +95 -0
- package/src/providers/pi/PiSessionParser.ts +284 -0
- package/src/providers/pi/PiSessionTracker.ts +87 -0
- package/src/providers/pi/durable/PiCliProbe.ts +42 -34
- package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
- package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
- package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
- package/src/providers/pi/durable/PiStreamParser.ts +82 -72
- package/src/readiness/AgentReadiness.ts +727 -0
- package/src/runtime/ManagedAgentRuntime.ts +266 -0
- package/src/runtime/RuntimeFactory.ts +13 -0
- package/src/runtime/errors.ts +50 -0
- package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
- package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
- package/src/runtime/tmux/PidPolling.ts +34 -0
- package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
- package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
- package/src/runtime/types.ts +56 -0
- package/src/terminal/TerminalFocusManager.ts +215 -212
- package/src/terminal/TmuxManager.ts +99 -92
- package/src/terminal/TtyWriter.ts +203 -194
- package/src/terminal/index.ts +4 -4
- package/src/utils/AgentRegistry.ts +299 -238
- package/src/utils/agent-requests.ts +16 -16
- package/src/utils/agents.ts +41 -38
- package/src/utils/applescript.ts +4 -4
- package/src/utils/index.ts +12 -6
- package/src/utils/matching.ts +43 -43
- package/src/utils/process.ts +261 -258
- package/src/utils/session.ts +66 -66
- package/src/utils/sortAgents.ts +35 -33
- package/tsconfig.json +2 -8
- package/vitest.config.ts +16 -16
- package/.eslintrc.json +0 -31
- package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
- package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
- package/dist/adapters/CodexAdapter.d.ts +0 -109
- package/dist/adapters/CodexAdapter.d.ts.map +0 -1
- package/dist/adapters/CodexAdapter.js +0 -710
- package/dist/adapters/CodexAdapter.js.map +0 -1
- package/dist/adapters/PiAdapter.d.ts +0 -63
- package/dist/adapters/PiAdapter.d.ts.map +0 -1
- package/dist/adapters/PiAdapter.js +0 -453
- package/dist/adapters/PiAdapter.js.map +0 -1
- package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
- package/src/adapters/CodexAdapter.ts +0 -923
- package/src/adapters/PiAdapter.ts +0 -598
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for OpenCodeAdapter
|
|
3
|
-
*/ import * as fs from
|
|
4
|
-
import * as path from
|
|
5
|
-
import { OpenCodeAdapter } from
|
|
6
|
-
import { AgentStatus } from
|
|
7
|
-
import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from
|
|
8
|
-
import { generateAgentName } from
|
|
9
|
-
import * as os from
|
|
10
|
-
vi.mock(
|
|
3
|
+
*/ import * as fs from "fs";
|
|
4
|
+
import * as path from "path";
|
|
5
|
+
import { OpenCodeAdapter } from "../../adapters/OpenCodeAdapter.js";
|
|
6
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
7
|
+
import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from "../../utils/process.js";
|
|
8
|
+
import { generateAgentName } from "../../utils/matching.js";
|
|
9
|
+
import * as os from "os";
|
|
10
|
+
vi.mock("../../utils/process.js", async (importOriginal)=>{
|
|
11
11
|
const actual = await importOriginal();
|
|
12
12
|
return {
|
|
13
13
|
...actual,
|
|
@@ -16,7 +16,7 @@ vi.mock('../../utils/process.js', async (importOriginal)=>{
|
|
|
16
16
|
captureProcessSnapshot: vi.fn()
|
|
17
17
|
};
|
|
18
18
|
});
|
|
19
|
-
vi.mock(
|
|
19
|
+
vi.mock("../../utils/matching.js", ()=>({
|
|
20
20
|
generateAgentName: vi.fn(),
|
|
21
21
|
matchProcessesToSessions: vi.fn()
|
|
22
22
|
}));
|
|
@@ -26,8 +26,8 @@ const mockedCaptureProcessSnapshot = captureProcessSnapshot;
|
|
|
26
26
|
const mockedGenerateAgentName = generateAgentName;
|
|
27
27
|
function makeDb(queries) {
|
|
28
28
|
const prepareImpl = (sql)=>{
|
|
29
|
-
const normalized = sql.replace(/\s+/g,
|
|
30
|
-
if (normalized.includes(
|
|
29
|
+
const normalized = sql.replace(/\s+/g, " ").trim().toLowerCase();
|
|
30
|
+
if (normalized.includes("from session")) {
|
|
31
31
|
return {
|
|
32
32
|
all: ()=>(queries.session ?? []).map((r)=>({
|
|
33
33
|
id: r.id,
|
|
@@ -45,14 +45,14 @@ function makeDb(queries) {
|
|
|
45
45
|
}
|
|
46
46
|
};
|
|
47
47
|
}
|
|
48
|
-
if (normalized.includes(
|
|
48
|
+
if (normalized.includes("max(time_updated)")) {
|
|
49
49
|
return {
|
|
50
50
|
get: ()=>({
|
|
51
51
|
maxUpdated: queries.lastMessage?.timeUpdated ?? 0
|
|
52
52
|
})
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
-
if (normalized.includes(
|
|
55
|
+
if (normalized.includes("from message") && !normalized.includes("'$.time.completed'") && !normalized.includes("order by p.time_created")) {
|
|
56
56
|
return {
|
|
57
57
|
get: ()=>queries.lastMessage ?? undefined
|
|
58
58
|
};
|
|
@@ -67,7 +67,7 @@ function makeDb(queries) {
|
|
|
67
67
|
get: ()=>queries.firstUserText === undefined ? undefined : queries.firstUserText ?? undefined
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
-
if (normalized.includes(
|
|
70
|
+
if (normalized.includes("order by p.time_created asc")) {
|
|
71
71
|
return {
|
|
72
72
|
all: ()=>queries.parts ?? []
|
|
73
73
|
};
|
|
@@ -85,7 +85,7 @@ function makeDb(queries) {
|
|
|
85
85
|
function makeDbConstructor(db) {
|
|
86
86
|
return vi.fn().mockReturnValue(db);
|
|
87
87
|
}
|
|
88
|
-
describe(
|
|
88
|
+
describe("OpenCodeAdapter", ()=>{
|
|
89
89
|
let adapter;
|
|
90
90
|
let tmpDir;
|
|
91
91
|
let dbPath;
|
|
@@ -99,11 +99,11 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
99
99
|
// Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.
|
|
100
100
|
mockedCaptureProcessSnapshot.mockImplementation(async (names)=>enrichProcesses(names.flatMap((name)=>listAgentProcesses(name))));
|
|
101
101
|
mockedGenerateAgentName.mockImplementation((cwd, pid)=>{
|
|
102
|
-
const folder = path.basename(cwd) ||
|
|
102
|
+
const folder = path.basename(cwd) || "unknown";
|
|
103
103
|
return `${folder}-${pid}`;
|
|
104
104
|
});
|
|
105
|
-
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(),
|
|
106
|
-
dbPath = path.join(tmpDir,
|
|
105
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "opencode-test-"));
|
|
106
|
+
dbPath = path.join(tmpDir, "opencode.db");
|
|
107
107
|
adapter.dbPath = dbPath;
|
|
108
108
|
adapter.db = null;
|
|
109
109
|
});
|
|
@@ -114,67 +114,67 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
114
114
|
});
|
|
115
115
|
vi.restoreAllMocks();
|
|
116
116
|
});
|
|
117
|
-
describe(
|
|
118
|
-
it(
|
|
119
|
-
expect(adapter.type).toBe(
|
|
117
|
+
describe("type", ()=>{
|
|
118
|
+
it("exposes opencode type", ()=>{
|
|
119
|
+
expect(adapter.type).toBe("opencode");
|
|
120
120
|
});
|
|
121
121
|
});
|
|
122
|
-
describe(
|
|
123
|
-
it(
|
|
122
|
+
describe("canHandle", ()=>{
|
|
123
|
+
it("returns true for opencode command", ()=>{
|
|
124
124
|
expect(adapter.canHandle({
|
|
125
125
|
pid: 1,
|
|
126
|
-
command:
|
|
127
|
-
cwd:
|
|
128
|
-
tty:
|
|
126
|
+
command: "opencode",
|
|
127
|
+
cwd: "/repo",
|
|
128
|
+
tty: "ttys001"
|
|
129
129
|
})).toBe(true);
|
|
130
130
|
});
|
|
131
|
-
it(
|
|
131
|
+
it("returns true for full path opencode", ()=>{
|
|
132
132
|
expect(adapter.canHandle({
|
|
133
133
|
pid: 2,
|
|
134
|
-
command:
|
|
135
|
-
cwd:
|
|
136
|
-
tty:
|
|
134
|
+
command: "/usr/local/bin/opencode serve",
|
|
135
|
+
cwd: "/repo",
|
|
136
|
+
tty: "ttys002"
|
|
137
137
|
})).toBe(true);
|
|
138
138
|
});
|
|
139
|
-
it(
|
|
139
|
+
it("returns true for opencode.exe with unix-style path", ()=>{
|
|
140
140
|
expect(adapter.canHandle({
|
|
141
141
|
pid: 3,
|
|
142
|
-
command:
|
|
143
|
-
cwd:
|
|
144
|
-
tty:
|
|
142
|
+
command: "/usr/bin/opencode.exe",
|
|
143
|
+
cwd: "/repo",
|
|
144
|
+
tty: "ttys003"
|
|
145
145
|
})).toBe(true);
|
|
146
146
|
});
|
|
147
|
-
it(
|
|
147
|
+
it("returns false for non-opencode processes", ()=>{
|
|
148
148
|
expect(adapter.canHandle({
|
|
149
149
|
pid: 4,
|
|
150
|
-
command:
|
|
151
|
-
cwd:
|
|
152
|
-
tty:
|
|
150
|
+
command: "node server.js",
|
|
151
|
+
cwd: "/repo",
|
|
152
|
+
tty: "ttys004"
|
|
153
153
|
})).toBe(false);
|
|
154
154
|
});
|
|
155
|
-
it(
|
|
155
|
+
it("returns false when opencode appears only in path args", ()=>{
|
|
156
156
|
expect(adapter.canHandle({
|
|
157
157
|
pid: 5,
|
|
158
|
-
command:
|
|
159
|
-
cwd:
|
|
160
|
-
tty:
|
|
158
|
+
command: "node /projects/opencode-plugin/index.js",
|
|
159
|
+
cwd: "/repo",
|
|
160
|
+
tty: "ttys005"
|
|
161
161
|
})).toBe(false);
|
|
162
162
|
});
|
|
163
163
|
});
|
|
164
|
-
describe(
|
|
165
|
-
it(
|
|
164
|
+
describe("detectAgents", ()=>{
|
|
165
|
+
it("returns empty list when no opencode processes running", async ()=>{
|
|
166
166
|
mockedListAgentProcesses.mockReturnValue([]);
|
|
167
167
|
const agents = await adapter.detectAgents();
|
|
168
168
|
expect(agents).toEqual([]);
|
|
169
|
-
expect(mockedListAgentProcesses).toHaveBeenCalledWith(
|
|
169
|
+
expect(mockedListAgentProcesses).toHaveBeenCalledWith("opencode");
|
|
170
170
|
});
|
|
171
|
-
it(
|
|
171
|
+
it("returns process-only agent when DB does not exist", async ()=>{
|
|
172
172
|
const procs = [
|
|
173
173
|
{
|
|
174
174
|
pid: 100,
|
|
175
|
-
command:
|
|
176
|
-
cwd:
|
|
177
|
-
tty:
|
|
175
|
+
command: "opencode",
|
|
176
|
+
cwd: "/repo",
|
|
177
|
+
tty: "ttys001"
|
|
178
178
|
}
|
|
179
179
|
];
|
|
180
180
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -182,47 +182,47 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
182
182
|
const agents = await adapter.detectAgents();
|
|
183
183
|
expect(agents).toHaveLength(1);
|
|
184
184
|
expect(agents[0]).toMatchObject({
|
|
185
|
-
type:
|
|
185
|
+
type: "opencode",
|
|
186
186
|
status: AgentStatus.RUNNING,
|
|
187
187
|
pid: 100,
|
|
188
|
-
projectPath:
|
|
189
|
-
sessionId:
|
|
190
|
-
summary:
|
|
188
|
+
projectPath: "/repo",
|
|
189
|
+
sessionId: "pid-100",
|
|
190
|
+
summary: "OpenCode process running"
|
|
191
191
|
});
|
|
192
192
|
});
|
|
193
|
-
it(
|
|
193
|
+
it("returns process-only agent when no session matches CWD", async ()=>{
|
|
194
194
|
const procs = [
|
|
195
195
|
{
|
|
196
196
|
pid: 100,
|
|
197
|
-
command:
|
|
198
|
-
cwd:
|
|
199
|
-
tty:
|
|
197
|
+
command: "opencode",
|
|
198
|
+
cwd: "/repo",
|
|
199
|
+
tty: "ttys001"
|
|
200
200
|
}
|
|
201
201
|
];
|
|
202
202
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
203
203
|
mockedEnrichProcesses.mockReturnValue(procs);
|
|
204
|
-
fs.writeFileSync(dbPath,
|
|
204
|
+
fs.writeFileSync(dbPath, ""); // file exists but empty → sqlite throws
|
|
205
205
|
const db = makeDb({
|
|
206
206
|
session: []
|
|
207
207
|
}); // no matching session
|
|
208
|
-
vi.doMock(
|
|
208
|
+
vi.doMock("better-sqlite3", ()=>makeDbConstructor(db));
|
|
209
209
|
adapter.db = db;
|
|
210
210
|
const agents = await adapter.detectAgents();
|
|
211
211
|
expect(agents).toHaveLength(1);
|
|
212
212
|
expect(agents[0]).toMatchObject({
|
|
213
|
-
type:
|
|
213
|
+
type: "opencode",
|
|
214
214
|
status: AgentStatus.RUNNING,
|
|
215
|
-
sessionId:
|
|
215
|
+
sessionId: "pid-100"
|
|
216
216
|
});
|
|
217
217
|
});
|
|
218
|
-
it(
|
|
218
|
+
it("returns waiting when assistant turn has time.completed set", async ()=>{
|
|
219
219
|
const now = Date.now();
|
|
220
220
|
const procs = [
|
|
221
221
|
{
|
|
222
222
|
pid: 200,
|
|
223
|
-
command:
|
|
224
|
-
cwd:
|
|
225
|
-
tty:
|
|
223
|
+
command: "opencode",
|
|
224
|
+
cwd: "/my-project",
|
|
225
|
+
tty: "ttys002"
|
|
226
226
|
}
|
|
227
227
|
];
|
|
228
228
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -230,13 +230,13 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
230
230
|
const db = makeDb({
|
|
231
231
|
session: [
|
|
232
232
|
{
|
|
233
|
-
id:
|
|
234
|
-
directory:
|
|
233
|
+
id: "sess-001",
|
|
234
|
+
directory: "/my-project",
|
|
235
235
|
time_created: now - 60000
|
|
236
236
|
}
|
|
237
237
|
],
|
|
238
238
|
lastMessage: {
|
|
239
|
-
role:
|
|
239
|
+
role: "assistant",
|
|
240
240
|
timeUpdated: now - 60_000
|
|
241
241
|
},
|
|
242
242
|
lastAssistant: {
|
|
@@ -244,27 +244,27 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
244
244
|
errored: null
|
|
245
245
|
},
|
|
246
246
|
firstUserText: {
|
|
247
|
-
text:
|
|
247
|
+
text: "Refactor the auth module"
|
|
248
248
|
}
|
|
249
249
|
});
|
|
250
250
|
adapter.db = db;
|
|
251
251
|
const agents = await adapter.detectAgents();
|
|
252
252
|
expect(agents).toHaveLength(1);
|
|
253
253
|
expect(agents[0]).toMatchObject({
|
|
254
|
-
type:
|
|
254
|
+
type: "opencode",
|
|
255
255
|
status: AgentStatus.WAITING,
|
|
256
|
-
sessionId:
|
|
257
|
-
summary:
|
|
256
|
+
sessionId: "sess-001",
|
|
257
|
+
summary: "Refactor the auth module"
|
|
258
258
|
});
|
|
259
259
|
});
|
|
260
|
-
it(
|
|
260
|
+
it("returns running when assistant turn has no time.completed (in-progress, any age)", async ()=>{
|
|
261
261
|
const now = Date.now();
|
|
262
262
|
const procs = [
|
|
263
263
|
{
|
|
264
264
|
pid: 250,
|
|
265
|
-
command:
|
|
266
|
-
cwd:
|
|
267
|
-
tty:
|
|
265
|
+
command: "opencode",
|
|
266
|
+
cwd: "/proj",
|
|
267
|
+
tty: "ttys004"
|
|
268
268
|
}
|
|
269
269
|
];
|
|
270
270
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -272,13 +272,13 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
272
272
|
const db = makeDb({
|
|
273
273
|
session: [
|
|
274
274
|
{
|
|
275
|
-
id:
|
|
276
|
-
directory:
|
|
275
|
+
id: "sess-tool",
|
|
276
|
+
directory: "/proj",
|
|
277
277
|
time_created: now - 180_000
|
|
278
278
|
}
|
|
279
279
|
],
|
|
280
280
|
lastMessage: {
|
|
281
|
-
role:
|
|
281
|
+
role: "assistant",
|
|
282
282
|
timeUpdated: now - 120_000
|
|
283
283
|
},
|
|
284
284
|
lastAssistant: {
|
|
@@ -286,24 +286,24 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
286
286
|
errored: null
|
|
287
287
|
},
|
|
288
288
|
firstUserText: {
|
|
289
|
-
text:
|
|
289
|
+
text: "Run the build"
|
|
290
290
|
}
|
|
291
291
|
});
|
|
292
292
|
adapter.db = db;
|
|
293
293
|
const agents = await adapter.detectAgents();
|
|
294
294
|
expect(agents[0]).toMatchObject({
|
|
295
295
|
status: AgentStatus.RUNNING,
|
|
296
|
-
sessionId:
|
|
296
|
+
sessionId: "sess-tool"
|
|
297
297
|
});
|
|
298
298
|
});
|
|
299
|
-
it(
|
|
299
|
+
it("returns running between steps (the bug fix) — no time.completed even during quiet moment", async ()=>{
|
|
300
300
|
const now = Date.now();
|
|
301
301
|
const procs = [
|
|
302
302
|
{
|
|
303
303
|
pid: 260,
|
|
304
|
-
command:
|
|
305
|
-
cwd:
|
|
306
|
-
tty:
|
|
304
|
+
command: "opencode",
|
|
305
|
+
cwd: "/proj-b",
|
|
306
|
+
tty: "ttys005"
|
|
307
307
|
}
|
|
308
308
|
];
|
|
309
309
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -311,13 +311,13 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
311
311
|
const db = makeDb({
|
|
312
312
|
session: [
|
|
313
313
|
{
|
|
314
|
-
id:
|
|
315
|
-
directory:
|
|
314
|
+
id: "sess-mid",
|
|
315
|
+
directory: "/proj-b",
|
|
316
316
|
time_created: now - 60_000
|
|
317
317
|
}
|
|
318
318
|
],
|
|
319
319
|
lastMessage: {
|
|
320
|
-
role:
|
|
320
|
+
role: "assistant",
|
|
321
321
|
timeUpdated: now - 45_000
|
|
322
322
|
},
|
|
323
323
|
lastAssistant: {
|
|
@@ -330,7 +330,7 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
330
330
|
const agents = await adapter.detectAgents();
|
|
331
331
|
expect(agents[0].status).toBe(AgentStatus.RUNNING);
|
|
332
332
|
});
|
|
333
|
-
it(
|
|
333
|
+
it("returns waiting even when latest user message was metadata-updated after assistant completion", async ()=>{
|
|
334
334
|
// Regression: OpenCode updates user.message.time_updated when appending
|
|
335
335
|
// summary diffs after a turn finishes. Ordering by time_created (not
|
|
336
336
|
// time_updated) keeps the assistant message correctly identified as latest.
|
|
@@ -338,9 +338,9 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
338
338
|
const procs = [
|
|
339
339
|
{
|
|
340
340
|
pid: 270,
|
|
341
|
-
command:
|
|
342
|
-
cwd:
|
|
343
|
-
tty:
|
|
341
|
+
command: "opencode",
|
|
342
|
+
cwd: "/proj-c",
|
|
343
|
+
tty: "ttys006"
|
|
344
344
|
}
|
|
345
345
|
];
|
|
346
346
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -349,13 +349,13 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
349
349
|
const db = makeDb({
|
|
350
350
|
session: [
|
|
351
351
|
{
|
|
352
|
-
id:
|
|
353
|
-
directory:
|
|
352
|
+
id: "sess-meta",
|
|
353
|
+
directory: "/proj-c",
|
|
354
354
|
time_created: now - 120_000
|
|
355
355
|
}
|
|
356
356
|
],
|
|
357
357
|
lastMessage: {
|
|
358
|
-
role:
|
|
358
|
+
role: "assistant",
|
|
359
359
|
timeUpdated: now - 30_000
|
|
360
360
|
},
|
|
361
361
|
lastAssistant: {
|
|
@@ -368,14 +368,14 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
368
368
|
const agents = await adapter.detectAgents();
|
|
369
369
|
expect(agents[0].status).toBe(AgentStatus.WAITING);
|
|
370
370
|
});
|
|
371
|
-
it(
|
|
371
|
+
it("returns running agent when last role is user (no assistant message yet)", async ()=>{
|
|
372
372
|
const now = Date.now();
|
|
373
373
|
const procs = [
|
|
374
374
|
{
|
|
375
375
|
pid: 300,
|
|
376
|
-
command:
|
|
377
|
-
cwd:
|
|
378
|
-
tty:
|
|
376
|
+
command: "opencode",
|
|
377
|
+
cwd: "/work",
|
|
378
|
+
tty: "ttys003"
|
|
379
379
|
}
|
|
380
380
|
];
|
|
381
381
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -383,36 +383,36 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
383
383
|
const db = makeDb({
|
|
384
384
|
session: [
|
|
385
385
|
{
|
|
386
|
-
id:
|
|
387
|
-
directory:
|
|
386
|
+
id: "sess-002",
|
|
387
|
+
directory: "/work",
|
|
388
388
|
time_created: now - 30000
|
|
389
389
|
}
|
|
390
390
|
],
|
|
391
391
|
lastMessage: {
|
|
392
|
-
role:
|
|
392
|
+
role: "user",
|
|
393
393
|
timeUpdated: now - 30_000
|
|
394
394
|
},
|
|
395
395
|
lastAssistant: null,
|
|
396
396
|
firstUserText: {
|
|
397
|
-
text:
|
|
397
|
+
text: "Add unit tests"
|
|
398
398
|
}
|
|
399
399
|
});
|
|
400
400
|
adapter.db = db;
|
|
401
401
|
const agents = await adapter.detectAgents();
|
|
402
402
|
expect(agents[0]).toMatchObject({
|
|
403
403
|
status: AgentStatus.RUNNING,
|
|
404
|
-
sessionId:
|
|
404
|
+
sessionId: "sess-002"
|
|
405
405
|
});
|
|
406
406
|
});
|
|
407
|
-
it(
|
|
407
|
+
it("returns idle agent when last activity exceeds threshold", async ()=>{
|
|
408
408
|
const now = Date.now();
|
|
409
409
|
const staleTime = now - 10 * 60 * 1000; // 10 minutes ago
|
|
410
410
|
const procs = [
|
|
411
411
|
{
|
|
412
412
|
pid: 400,
|
|
413
|
-
command:
|
|
414
|
-
cwd:
|
|
415
|
-
tty:
|
|
413
|
+
command: "opencode",
|
|
414
|
+
cwd: "/old-work",
|
|
415
|
+
tty: "ttys004"
|
|
416
416
|
}
|
|
417
417
|
];
|
|
418
418
|
mockedListAgentProcesses.mockReturnValue(procs);
|
|
@@ -420,13 +420,13 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
420
420
|
const db = makeDb({
|
|
421
421
|
session: [
|
|
422
422
|
{
|
|
423
|
-
id:
|
|
424
|
-
directory:
|
|
423
|
+
id: "sess-003",
|
|
424
|
+
directory: "/old-work",
|
|
425
425
|
time_created: staleTime
|
|
426
426
|
}
|
|
427
427
|
],
|
|
428
428
|
lastMessage: {
|
|
429
|
-
role:
|
|
429
|
+
role: "assistant",
|
|
430
430
|
timeUpdated: staleTime
|
|
431
431
|
},
|
|
432
432
|
lastAssistant: {
|
|
@@ -439,31 +439,31 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
439
439
|
const agents = await adapter.detectAgents();
|
|
440
440
|
expect(agents[0]).toMatchObject({
|
|
441
441
|
status: AgentStatus.IDLE,
|
|
442
|
-
sessionId:
|
|
442
|
+
sessionId: "sess-003"
|
|
443
443
|
});
|
|
444
444
|
});
|
|
445
445
|
});
|
|
446
|
-
describe(
|
|
447
|
-
it(
|
|
448
|
-
const messages = adapter.getConversation(
|
|
446
|
+
describe("getConversation", ()=>{
|
|
447
|
+
it("returns empty array for invalid session ref", ()=>{
|
|
448
|
+
const messages = adapter.getConversation("/no-separator-here");
|
|
449
449
|
expect(messages).toEqual([]);
|
|
450
450
|
});
|
|
451
|
-
it(
|
|
451
|
+
it("returns text messages from session parts", ()=>{
|
|
452
452
|
const db = makeDb({
|
|
453
453
|
parts: [
|
|
454
454
|
{
|
|
455
|
-
role:
|
|
455
|
+
role: "user",
|
|
456
456
|
partData: JSON.stringify({
|
|
457
|
-
type:
|
|
458
|
-
text:
|
|
457
|
+
type: "text",
|
|
458
|
+
text: "Hello agent"
|
|
459
459
|
}),
|
|
460
460
|
timeCreated: 1000
|
|
461
461
|
},
|
|
462
462
|
{
|
|
463
|
-
role:
|
|
463
|
+
role: "assistant",
|
|
464
464
|
partData: JSON.stringify({
|
|
465
|
-
type:
|
|
466
|
-
text:
|
|
465
|
+
type: "text",
|
|
466
|
+
text: "Hi, how can I help?"
|
|
467
467
|
}),
|
|
468
468
|
timeCreated: 2000
|
|
469
469
|
}
|
|
@@ -474,30 +474,30 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
474
474
|
const messages = adapter.getConversation(ref);
|
|
475
475
|
expect(messages).toHaveLength(2);
|
|
476
476
|
expect(messages[0]).toEqual({
|
|
477
|
-
role:
|
|
478
|
-
content:
|
|
477
|
+
role: "user",
|
|
478
|
+
content: "Hello agent"
|
|
479
479
|
});
|
|
480
480
|
expect(messages[1]).toEqual({
|
|
481
|
-
role:
|
|
482
|
-
content:
|
|
481
|
+
role: "assistant",
|
|
482
|
+
content: "Hi, how can I help?"
|
|
483
483
|
});
|
|
484
484
|
});
|
|
485
|
-
it(
|
|
485
|
+
it("skips reasoning parts when verbose is false", ()=>{
|
|
486
486
|
const db = makeDb({
|
|
487
487
|
parts: [
|
|
488
488
|
{
|
|
489
|
-
role:
|
|
489
|
+
role: "assistant",
|
|
490
490
|
partData: JSON.stringify({
|
|
491
|
-
type:
|
|
492
|
-
reasoning:
|
|
491
|
+
type: "reasoning",
|
|
492
|
+
reasoning: "internal thought"
|
|
493
493
|
}),
|
|
494
494
|
timeCreated: 1000
|
|
495
495
|
},
|
|
496
496
|
{
|
|
497
|
-
role:
|
|
497
|
+
role: "assistant",
|
|
498
498
|
partData: JSON.stringify({
|
|
499
|
-
type:
|
|
500
|
-
text:
|
|
499
|
+
type: "text",
|
|
500
|
+
text: "Answer"
|
|
501
501
|
}),
|
|
502
502
|
timeCreated: 2000
|
|
503
503
|
}
|
|
@@ -506,24 +506,24 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
506
506
|
adapter.db = db;
|
|
507
507
|
const messages = adapter.getConversation(`${dbPath}::sess-x`);
|
|
508
508
|
expect(messages).toHaveLength(1);
|
|
509
|
-
expect(messages[0].content).toBe(
|
|
509
|
+
expect(messages[0].content).toBe("Answer");
|
|
510
510
|
});
|
|
511
|
-
it(
|
|
511
|
+
it("includes reasoning and tool parts when verbose is true", ()=>{
|
|
512
512
|
const db = makeDb({
|
|
513
513
|
parts: [
|
|
514
514
|
{
|
|
515
|
-
role:
|
|
515
|
+
role: "assistant",
|
|
516
516
|
partData: JSON.stringify({
|
|
517
|
-
type:
|
|
518
|
-
reasoning:
|
|
517
|
+
type: "reasoning",
|
|
518
|
+
reasoning: "my thinking"
|
|
519
519
|
}),
|
|
520
520
|
timeCreated: 1000
|
|
521
521
|
},
|
|
522
522
|
{
|
|
523
|
-
role:
|
|
523
|
+
role: "assistant",
|
|
524
524
|
partData: JSON.stringify({
|
|
525
|
-
type:
|
|
526
|
-
tool:
|
|
525
|
+
type: "tool",
|
|
526
|
+
tool: "read_file"
|
|
527
527
|
}),
|
|
528
528
|
timeCreated: 2000
|
|
529
529
|
}
|
|
@@ -534,68 +534,68 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
534
534
|
verbose: true
|
|
535
535
|
});
|
|
536
536
|
expect(messages).toHaveLength(2);
|
|
537
|
-
expect(messages[0].content).toContain(
|
|
538
|
-
expect(messages[1].content).toContain(
|
|
537
|
+
expect(messages[0].content).toContain("my thinking");
|
|
538
|
+
expect(messages[1].content).toContain("read_file");
|
|
539
539
|
});
|
|
540
|
-
it(
|
|
540
|
+
it("returns empty array when DB cannot be opened", ()=>{
|
|
541
541
|
adapter.db = null;
|
|
542
542
|
const messages = adapter.getConversation(`${dbPath}::sess-z`);
|
|
543
543
|
expect(messages).toEqual([]);
|
|
544
544
|
});
|
|
545
545
|
});
|
|
546
|
-
describe(
|
|
547
|
-
it(
|
|
546
|
+
describe("listSessions", ()=>{
|
|
547
|
+
it("returns empty array when DB does not exist", async ()=>{
|
|
548
548
|
const sessions = await adapter.listSessions();
|
|
549
549
|
expect(sessions).toEqual([]);
|
|
550
550
|
});
|
|
551
|
-
it(
|
|
551
|
+
it("returns all sessions from DB", async ()=>{
|
|
552
552
|
const now = Date.now();
|
|
553
553
|
const db = makeDb({
|
|
554
554
|
session: [
|
|
555
555
|
{
|
|
556
|
-
id:
|
|
557
|
-
directory:
|
|
556
|
+
id: "sess-a",
|
|
557
|
+
directory: "/proj-a",
|
|
558
558
|
time_created: now - 3000
|
|
559
559
|
},
|
|
560
560
|
{
|
|
561
|
-
id:
|
|
562
|
-
directory:
|
|
561
|
+
id: "sess-b",
|
|
562
|
+
directory: "/proj-b",
|
|
563
563
|
time_created: now - 6000
|
|
564
564
|
}
|
|
565
565
|
],
|
|
566
566
|
lastMessage: null,
|
|
567
567
|
lastAssistant: null,
|
|
568
568
|
firstUserText: {
|
|
569
|
-
text:
|
|
569
|
+
text: "Build the feature"
|
|
570
570
|
}
|
|
571
571
|
});
|
|
572
572
|
adapter.db = db;
|
|
573
573
|
const sessions = await adapter.listSessions();
|
|
574
574
|
expect(sessions).toHaveLength(2);
|
|
575
575
|
expect(sessions[0]).toMatchObject({
|
|
576
|
-
type:
|
|
577
|
-
sessionId:
|
|
578
|
-
cwd:
|
|
576
|
+
type: "opencode",
|
|
577
|
+
sessionId: "sess-a",
|
|
578
|
+
cwd: "/proj-a"
|
|
579
579
|
});
|
|
580
580
|
expect(sessions[1]).toMatchObject({
|
|
581
|
-
type:
|
|
582
|
-
sessionId:
|
|
583
|
-
cwd:
|
|
581
|
+
type: "opencode",
|
|
582
|
+
sessionId: "sess-b",
|
|
583
|
+
cwd: "/proj-b"
|
|
584
584
|
});
|
|
585
|
-
expect(sessions[0].sessionFilePath).toContain(
|
|
585
|
+
expect(sessions[0].sessionFilePath).toContain("sess-a");
|
|
586
586
|
});
|
|
587
|
-
it(
|
|
587
|
+
it("filters sessions by cwd when opts.cwd is set", async ()=>{
|
|
588
588
|
const now = Date.now();
|
|
589
589
|
const db = makeDb({
|
|
590
590
|
session: [
|
|
591
591
|
{
|
|
592
|
-
id:
|
|
593
|
-
directory:
|
|
592
|
+
id: "sess-a",
|
|
593
|
+
directory: "/proj-a",
|
|
594
594
|
time_created: now - 3000
|
|
595
595
|
},
|
|
596
596
|
{
|
|
597
|
-
id:
|
|
598
|
-
directory:
|
|
597
|
+
id: "sess-b",
|
|
598
|
+
directory: "/proj-b",
|
|
599
599
|
time_created: now - 6000
|
|
600
600
|
}
|
|
601
601
|
],
|
|
@@ -605,18 +605,18 @@ describe('OpenCodeAdapter', ()=>{
|
|
|
605
605
|
});
|
|
606
606
|
adapter.db = db;
|
|
607
607
|
const sessions = await adapter.listSessions({
|
|
608
|
-
cwd:
|
|
608
|
+
cwd: "/proj-a"
|
|
609
609
|
});
|
|
610
610
|
expect(sessions).toHaveLength(1);
|
|
611
|
-
expect(sessions[0].sessionId).toBe(
|
|
611
|
+
expect(sessions[0].sessionId).toBe("sess-a");
|
|
612
612
|
});
|
|
613
|
-
it(
|
|
613
|
+
it("uses session time_created as startedAt and lastActive when no parts exist", async ()=>{
|
|
614
614
|
const timeCreated = Date.now() - 120000;
|
|
615
615
|
const db = makeDb({
|
|
616
616
|
session: [
|
|
617
617
|
{
|
|
618
|
-
id:
|
|
619
|
-
directory:
|
|
618
|
+
id: "sess-c",
|
|
619
|
+
directory: "/repo",
|
|
620
620
|
time_created: timeCreated
|
|
621
621
|
}
|
|
622
622
|
],
|