@ai-devkit/agent-manager 0.32.0 → 0.33.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +13 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +116 -84
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +623 -391
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +170 -169
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +93 -93
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/index.test.js +17 -17
- package/dist/__tests__/capacity/index.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgent.test.js +9 -9
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +641 -0
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +1398 -0
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js +164 -0
- package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +488 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
- package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
- package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
- package/dist/__tests__/utils/AgentRegistry.test.js +343 -218
- package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/__tests__/utils/agent-requests.test.js +43 -43
- package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
- package/dist/__tests__/utils/agents.test.js +17 -17
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/matching.test.js +92 -92
- package/dist/__tests__/utils/matching.test.js.map +1 -1
- package/dist/__tests__/utils/process.test.js +108 -108
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/__tests__/utils/session.test.js +53 -53
- package/dist/__tests__/utils/session.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +2 -2
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +1 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GrokCliAdapter.js +80 -80
- package/dist/adapters/GrokCliAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts +2 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +41 -37
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +9 -9
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -8
- package/dist/adapters/index.js.map +1 -1
- package/dist/capacity/codex.d.ts +3 -3
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +57 -57
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +3 -3
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +8 -8
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/types.d.ts +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/database/connection.d.ts +1 -1
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +15 -15
- package/dist/database/connection.js.map +1 -1
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/migrations/005_agent_runtime.sql +2 -0
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +7 -7
- package/dist/database/schema.js.map +1 -1
- package/dist/durable/DurableAgent.d.ts +9 -9
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +16 -16
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +4 -4
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +49 -48
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +1 -1
- package/dist/durable/process.d.ts.map +1 -1
- package/dist/durable/process.js +14 -14
- package/dist/durable/process.js.map +1 -1
- package/dist/durable/run.d.ts +2 -2
- package/dist/durable/run.d.ts.map +1 -1
- package/dist/durable/run.js +6 -6
- package/dist/durable/run.js.map +1 -1
- package/dist/durable/utils.d.ts +1 -1
- package/dist/durable/utils.d.ts.map +1 -1
- package/dist/durable/utils.js +4 -4
- package/dist/durable/utils.js.map +1 -1
- package/dist/index.d.ts +48 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -26
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js +99 -99
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/providers/codex/CodexAdapter.d.ts +27 -0
- package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/providers/codex/CodexAdapter.js +162 -0
- package/dist/providers/codex/CodexAdapter.js.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.js +35 -0
- package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.js +207 -0
- package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.js +68 -0
- package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
- package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
- package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionParser.js +262 -0
- package/dist/providers/codex/CodexSessionParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotAdapter.js +108 -0
- package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
- package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
- package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
- package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
- package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotSessionParser.js +181 -0
- package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
- package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
- package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
- package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
- package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiSessionParser.js +166 -0
- package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiAdapter.d.ts +28 -0
- package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
- package/dist/providers/pi/PiAdapter.js +153 -0
- package/dist/providers/pi/PiAdapter.js.map +1 -0
- package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
- package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/providers/pi/PiAgentMapper.js +37 -0
- package/dist/providers/pi/PiAgentMapper.js.map +1 -0
- package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
- package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionLocator.js +79 -0
- package/dist/providers/pi/PiSessionLocator.js.map +1 -0
- package/dist/providers/pi/PiSessionParser.d.ts +36 -0
- package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionParser.js +191 -0
- package/dist/providers/pi/PiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
- package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionTracker.js +69 -0
- package/dist/providers/pi/PiSessionTracker.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiCliProbe.js +15 -15
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.js +16 -16
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +6 -6
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js +130 -130
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.js +156 -0
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
- package/dist/runtime/RuntimeFactory.d.ts +4 -0
- package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
- package/dist/runtime/RuntimeFactory.js +11 -0
- package/dist/runtime/RuntimeFactory.js.map +1 -0
- package/dist/runtime/errors.d.ts +27 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +42 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts +18 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +36 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +202 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.js +60 -0
- package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.js +10 -0
- package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts +16 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +107 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
- package/dist/runtime/tmux/PidPolling.d.ts +5 -0
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
- package/dist/runtime/tmux/PidPolling.js +24 -0
- package/dist/runtime/tmux/PidPolling.js.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
- package/dist/runtime/types.d.ts +54 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +50 -50
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TmuxManager.d.ts.map +1 -1
- package/dist/terminal/TmuxManager.js +47 -47
- package/dist/terminal/TmuxManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -1
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +89 -89
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/index.d.ts +4 -4
- package/dist/terminal/index.js +3 -3
- package/dist/terminal/index.js.map +1 -1
- package/dist/utils/AgentRegistry.d.ts +10 -2
- package/dist/utils/AgentRegistry.d.ts.map +1 -1
- package/dist/utils/AgentRegistry.js +59 -26
- package/dist/utils/AgentRegistry.js.map +1 -1
- package/dist/utils/agent-requests.d.ts.map +1 -1
- package/dist/utils/agent-requests.js +5 -5
- package/dist/utils/agent-requests.js.map +1 -1
- package/dist/utils/agents.d.ts +2 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +15 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/applescript.js +1 -1
- package/dist/utils/applescript.js.map +1 -1
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matching.d.ts +2 -2
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +4 -4
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/process.d.ts +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +74 -74
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/session.d.ts +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +7 -7
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/sortAgents.d.ts +2 -2
- package/dist/utils/sortAgents.d.ts.map +1 -1
- package/dist/utils/sortAgents.js +5 -5
- package/dist/utils/sortAgents.js.map +1 -1
- package/package.json +18 -19
- package/src/AgentManager.ts +338 -274
- package/src/__tests__/AgentManager.test.ts +1143 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +511 -455
- package/src/__tests__/capacity/codex.test.ts +178 -91
- package/src/__tests__/capacity/index.test.ts +27 -18
- package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
- package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
- package/src/__tests__/fixtures/fake-claude.cjs +20 -13
- package/src/__tests__/fixtures/fake-codex.cjs +41 -30
- package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
- package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
- package/src/__tests__/print/DurableAgent.test.ts +19 -16
- package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
- package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +602 -0
- package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +1299 -0
- package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
- package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +377 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
- package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
- package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
- package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
- package/src/__tests__/utils/AgentRegistry.test.ts +516 -402
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
- package/src/__tests__/utils/agent-requests.test.ts +76 -56
- package/src/__tests__/utils/agents.test.ts +20 -20
- package/src/__tests__/utils/matching.test.ts +206 -171
- package/src/__tests__/utils/process.test.ts +276 -262
- package/src/__tests__/utils/session.test.ts +133 -139
- package/src/adapters/AgentAdapter.ts +134 -126
- package/src/adapters/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +289 -259
- package/src/adapters/index.ts +15 -9
- package/src/capacity/codex.ts +137 -84
- package/src/capacity/index.ts +18 -13
- package/src/capacity/types.ts +1 -1
- package/src/database/connection.ts +73 -68
- package/src/database/index.ts +6 -6
- package/src/database/migrations/005_agent_runtime.sql +2 -0
- package/src/database/schema.ts +40 -38
- package/src/durable/DurableAgent.ts +85 -85
- package/src/durable/DurableAgentRepository.ts +409 -260
- package/src/durable/process.ts +22 -21
- package/src/durable/run.ts +61 -51
- package/src/durable/utils.ts +46 -41
- package/src/index.ts +151 -103
- package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
- package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
- package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
- package/src/providers/claude/ClaudeSessionParser.ts +322 -338
- package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
- package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
- package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
- package/src/providers/codex/CodexAdapter.ts +205 -0
- package/src/providers/codex/CodexAgentMapper.ts +35 -0
- package/src/providers/codex/CodexSessionLocator.ts +279 -0
- package/src/providers/codex/CodexSessionMapping.ts +89 -0
- package/src/providers/codex/CodexSessionParser.ts +385 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
- package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
- package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
- package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
- package/src/providers/copilot/CopilotAdapter.ts +145 -0
- package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
- package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
- package/src/providers/copilot/CopilotSessionParser.ts +289 -0
- package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
- package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
- package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
- package/src/providers/gemini/GeminiSessionParser.ts +271 -0
- package/src/providers/pi/PiAdapter.ts +183 -0
- package/src/providers/pi/PiAgentMapper.ts +36 -0
- package/src/providers/pi/PiSessionLocator.ts +95 -0
- package/src/providers/pi/PiSessionParser.ts +284 -0
- package/src/providers/pi/PiSessionTracker.ts +87 -0
- package/src/providers/pi/durable/PiCliProbe.ts +42 -34
- package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
- package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
- package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
- package/src/providers/pi/durable/PiStreamParser.ts +82 -72
- package/src/readiness/AgentReadiness.ts +585 -513
- package/src/runtime/ManagedAgentRuntime.ts +266 -0
- package/src/runtime/RuntimeFactory.ts +13 -0
- package/src/runtime/errors.ts +50 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +178 -0
- package/src/runtime/herdr/HerdrAgentRuntime.ts +216 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +86 -0
- package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
- package/src/runtime/tmux/PidPolling.ts +34 -0
- package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
- package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
- package/src/runtime/types.ts +56 -0
- package/src/terminal/TerminalFocusManager.ts +215 -212
- package/src/terminal/TmuxManager.ts +99 -92
- package/src/terminal/TtyWriter.ts +203 -194
- package/src/terminal/index.ts +4 -4
- package/src/utils/AgentRegistry.ts +301 -238
- package/src/utils/agent-requests.ts +16 -16
- package/src/utils/agents.ts +41 -38
- package/src/utils/applescript.ts +4 -4
- package/src/utils/index.ts +12 -6
- package/src/utils/matching.ts +43 -43
- package/src/utils/process.ts +261 -258
- package/src/utils/session.ts +66 -66
- package/src/utils/sortAgents.ts +35 -33
- package/tsconfig.json +2 -8
- package/vitest.config.ts +16 -16
- package/.eslintrc.json +0 -31
- package/dist/__tests__/adapters/CopilotAdapter.test.js +0 -630
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +0 -1384
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
- package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
- package/dist/adapters/CodexAdapter.d.ts +0 -109
- package/dist/adapters/CodexAdapter.d.ts.map +0 -1
- package/dist/adapters/CodexAdapter.js +0 -710
- package/dist/adapters/CodexAdapter.js.map +0 -1
- package/dist/adapters/CopilotAdapter.d.ts.map +0 -1
- package/dist/adapters/CopilotAdapter.js +0 -329
- package/dist/adapters/CopilotAdapter.js.map +0 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
- package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/adapters/GeminiCliAdapter.js +0 -513
- package/dist/adapters/GeminiCliAdapter.js.map +0 -1
- package/dist/adapters/PiAdapter.d.ts +0 -63
- package/dist/adapters/PiAdapter.d.ts.map +0 -1
- package/dist/adapters/PiAdapter.js +0 -453
- package/dist/adapters/PiAdapter.js.map +0 -1
- package/src/__tests__/adapters/CopilotAdapter.test.ts +0 -510
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +0 -1259
- package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
- package/src/adapters/CodexAdapter.ts +0 -923
- package/src/adapters/CopilotAdapter.ts +0 -473
- package/src/adapters/GeminiCliAdapter.ts +0 -701
- package/src/adapters/PiAdapter.ts +0 -598
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
*
|
|
10
10
|
* sessionFilePath encodes "<dbPath>::<sessionId>" so getConversation() can open the right
|
|
11
11
|
* DB row without extending the AgentAdapter interface.
|
|
12
|
-
*/ import * as fs from
|
|
13
|
-
import * as path from
|
|
14
|
-
import Database from
|
|
15
|
-
import { AgentStatus } from
|
|
16
|
-
import { captureProcessSnapshot, executableBasename, filterByProcessNames } from
|
|
17
|
-
import { generateAgentName } from
|
|
18
|
-
const SESSION_REF_SEP =
|
|
12
|
+
*/ import * as fs from "fs";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import Database from "better-sqlite3";
|
|
15
|
+
import { AgentStatus } from "./AgentAdapter.js";
|
|
16
|
+
import { captureProcessSnapshot, executableBasename, filterByProcessNames } from "../utils/process.js";
|
|
17
|
+
import { generateAgentName } from "../utils/matching.js";
|
|
18
|
+
const SESSION_REF_SEP = "::";
|
|
19
19
|
function encodeSessionRef(dbPath, sessionId) {
|
|
20
20
|
return `${dbPath}${SESSION_REF_SEP}${sessionId}`;
|
|
21
21
|
}
|
|
@@ -28,37 +28,41 @@ function decodeSessionRef(ref) {
|
|
|
28
28
|
};
|
|
29
29
|
}
|
|
30
30
|
export class OpenCodeAdapter {
|
|
31
|
-
type =
|
|
31
|
+
type = "opencode";
|
|
32
32
|
processNames = [
|
|
33
|
-
|
|
33
|
+
"opencode"
|
|
34
34
|
];
|
|
35
35
|
static IDLE_THRESHOLD_MINUTES = 5;
|
|
36
36
|
dbPath;
|
|
37
|
+
cleanup = ()=>this.close();
|
|
37
38
|
db = null;
|
|
38
39
|
constructor(){
|
|
39
40
|
this.dbPath = OpenCodeAdapter.resolveDbPath();
|
|
40
|
-
|
|
41
|
-
process.once(
|
|
42
|
-
process.once(
|
|
43
|
-
process.once('SIGTERM', cleanup);
|
|
41
|
+
process.once("exit", this.cleanup);
|
|
42
|
+
process.once("SIGINT", this.cleanup);
|
|
43
|
+
process.once("SIGTERM", this.cleanup);
|
|
44
44
|
}
|
|
45
45
|
close() {
|
|
46
|
+
process.off("exit", this.cleanup);
|
|
47
|
+
process.off("SIGINT", this.cleanup);
|
|
48
|
+
process.off("SIGTERM", this.cleanup);
|
|
46
49
|
if (this.db) {
|
|
47
50
|
try {
|
|
48
51
|
this.db.close();
|
|
49
|
-
} catch {
|
|
52
|
+
} catch {
|
|
53
|
+
/* ignore */ }
|
|
50
54
|
this.db = null;
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
static resolveDbPath() {
|
|
54
58
|
const xdg = process.env.XDG_DATA_HOME;
|
|
55
|
-
const home = process.env.HOME || process.env.USERPROFILE ||
|
|
56
|
-
const base = xdg || path.join(home,
|
|
57
|
-
return path.join(base,
|
|
59
|
+
const home = process.env.HOME || process.env.USERPROFILE || "";
|
|
60
|
+
const base = xdg || path.join(home, ".local", "share");
|
|
61
|
+
return path.join(base, "opencode", "opencode.db");
|
|
58
62
|
}
|
|
59
63
|
canHandle(processInfo) {
|
|
60
64
|
const base = executableBasename(processInfo.command);
|
|
61
|
-
return base ===
|
|
65
|
+
return base === "opencode" || base === "opencode.exe";
|
|
62
66
|
}
|
|
63
67
|
async detectAgents(context) {
|
|
64
68
|
const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
|
|
@@ -107,22 +111,22 @@ export class OpenCodeAdapter {
|
|
|
107
111
|
} catch {
|
|
108
112
|
continue;
|
|
109
113
|
}
|
|
110
|
-
const role = row.role ===
|
|
111
|
-
if (partData.type ===
|
|
114
|
+
const role = row.role === "user" ? "user" : "assistant";
|
|
115
|
+
if (partData.type === "text" && partData.text) {
|
|
112
116
|
messages.push({
|
|
113
117
|
role,
|
|
114
118
|
content: partData.text
|
|
115
119
|
});
|
|
116
|
-
} else if (partData.type ===
|
|
117
|
-
const text = partData.reasoning || partData.text ||
|
|
120
|
+
} else if (partData.type === "reasoning" && verbose) {
|
|
121
|
+
const text = partData.reasoning || partData.text || "";
|
|
118
122
|
if (text) messages.push({
|
|
119
|
-
role:
|
|
123
|
+
role: "assistant",
|
|
120
124
|
content: `[thinking] ${text}`
|
|
121
125
|
});
|
|
122
|
-
} else if (partData.type ===
|
|
123
|
-
const toolName = partData.tool ||
|
|
126
|
+
} else if (partData.type === "tool" && verbose) {
|
|
127
|
+
const toolName = partData.tool || "tool";
|
|
124
128
|
messages.push({
|
|
125
|
-
role:
|
|
129
|
+
role: "assistant",
|
|
126
130
|
content: `[tool: ${toolName}]`
|
|
127
131
|
});
|
|
128
132
|
}
|
|
@@ -149,7 +153,7 @@ export class OpenCodeAdapter {
|
|
|
149
153
|
const lastActive = stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(row.timeCreated);
|
|
150
154
|
const startedAt = new Date(row.timeCreated);
|
|
151
155
|
summaries.push({
|
|
152
|
-
type:
|
|
156
|
+
type: "opencode",
|
|
153
157
|
sessionId: row.id,
|
|
154
158
|
cwd: row.directory,
|
|
155
159
|
firstUserMessage: stats.summary,
|
|
@@ -189,7 +193,7 @@ export class OpenCodeAdapter {
|
|
|
189
193
|
lastTimeUpdated: 0,
|
|
190
194
|
lastAssistantCompleted: false,
|
|
191
195
|
lastAssistantErrored: false,
|
|
192
|
-
summary:
|
|
196
|
+
summary: ""
|
|
193
197
|
};
|
|
194
198
|
try {
|
|
195
199
|
// Order by time_created — time_updated can lag when OpenCode appends
|
|
@@ -229,7 +233,7 @@ export class OpenCodeAdapter {
|
|
|
229
233
|
lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,
|
|
230
234
|
lastAssistantCompleted: lastAssistant?.completed != null,
|
|
231
235
|
lastAssistantErrored: lastAssistant?.errored != null,
|
|
232
|
-
summary: first?.text?.trim() ??
|
|
236
|
+
summary: first?.text?.trim() ?? ""
|
|
233
237
|
};
|
|
234
238
|
} catch {
|
|
235
239
|
return empty;
|
|
@@ -238,12 +242,12 @@ export class OpenCodeAdapter {
|
|
|
238
242
|
mapSessionToAgent(session, stats, proc) {
|
|
239
243
|
const lastActive = stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(session.timeCreated);
|
|
240
244
|
return {
|
|
241
|
-
name: generateAgentName(session.directory || proc.cwd ||
|
|
245
|
+
name: generateAgentName(session.directory || proc.cwd || "", proc.pid),
|
|
242
246
|
type: this.type,
|
|
243
247
|
status: this.determineStatus(stats, lastActive),
|
|
244
|
-
summary: stats.summary ||
|
|
248
|
+
summary: stats.summary || "OpenCode session active",
|
|
245
249
|
pid: proc.pid,
|
|
246
|
-
projectPath: session.directory || proc.cwd ||
|
|
250
|
+
projectPath: session.directory || proc.cwd || "",
|
|
247
251
|
sessionId: session.sessionId,
|
|
248
252
|
lastActive,
|
|
249
253
|
sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId)
|
|
@@ -251,12 +255,12 @@ export class OpenCodeAdapter {
|
|
|
251
255
|
}
|
|
252
256
|
mapProcessOnlyAgent(proc) {
|
|
253
257
|
return {
|
|
254
|
-
name: generateAgentName(proc.cwd ||
|
|
258
|
+
name: generateAgentName(proc.cwd || "", proc.pid),
|
|
255
259
|
type: this.type,
|
|
256
260
|
status: AgentStatus.RUNNING,
|
|
257
|
-
summary:
|
|
261
|
+
summary: "OpenCode process running",
|
|
258
262
|
pid: proc.pid,
|
|
259
|
-
projectPath: proc.cwd ||
|
|
263
|
+
projectPath: proc.cwd || "",
|
|
260
264
|
sessionId: `pid-${proc.pid}`,
|
|
261
265
|
lastActive: new Date()
|
|
262
266
|
};
|
|
@@ -264,8 +268,8 @@ export class OpenCodeAdapter {
|
|
|
264
268
|
determineStatus(stats, lastActive) {
|
|
265
269
|
const ageMin = (Date.now() - lastActive.getTime()) / 60000;
|
|
266
270
|
if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;
|
|
267
|
-
if (stats.lastRole ===
|
|
268
|
-
if (stats.lastRole ===
|
|
271
|
+
if (stats.lastRole === "assistant" && !stats.lastAssistantCompleted) return AgentStatus.RUNNING;
|
|
272
|
+
if (stats.lastRole === "assistant") return AgentStatus.WAITING;
|
|
269
273
|
return AgentStatus.RUNNING;
|
|
270
274
|
}
|
|
271
275
|
openDb() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/OpenCodeAdapter.ts"],"sourcesContent":["/**\n * OpenCode Adapter\n *\n * Detects running OpenCode agents by:\n * 1. Filtering OpenCode processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Querying OpenCode's SQLite DB (~/.local/share/opencode/opencode.db) to\n * find the session matching each process's CWD and read status from message.time.completed\n *\n * sessionFilePath encodes \"<dbPath>::<sessionId>\" so getConversation() can open the right\n * DB row without extending the AgentAdapter interface.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport Database from 'better-sqlite3';\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from './AgentAdapter.js';\nimport { AgentStatus } from './AgentAdapter.js';\nimport { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../utils/process.js';\nimport { generateAgentName } from '../utils/matching.js';\n\nconst SESSION_REF_SEP = '::';\n\nfunction encodeSessionRef(dbPath: string, sessionId: string): string {\n return `${dbPath}${SESSION_REF_SEP}${sessionId}`;\n}\n\nfunction decodeSessionRef(ref: string): { dbPath: string; sessionId: string } | null {\n const idx = ref.lastIndexOf(SESSION_REF_SEP);\n if (idx === -1) return null;\n return { dbPath: ref.slice(0, idx), sessionId: ref.slice(idx + SESSION_REF_SEP.length) };\n}\n\ninterface OpenCodeSession {\n sessionId: string;\n directory: string;\n timeCreated: number;\n}\n\ninterface OpenCodeSessionStats {\n lastRole: string | null;\n lastTimeUpdated: number;\n /** OpenCode writes `time.completed` on the assistant message only when the turn finishes. */\n lastAssistantCompleted: boolean;\n lastAssistantErrored: boolean;\n summary: string;\n}\n\nexport class OpenCodeAdapter implements AgentAdapter {\n readonly type = 'opencode' as const;\n readonly processNames = ['opencode'] as const;\n\n private static readonly IDLE_THRESHOLD_MINUTES = 5;\n\n private readonly dbPath: string;\n private db: Database.Database | null = null;\n\n constructor() {\n this.dbPath = OpenCodeAdapter.resolveDbPath();\n const cleanup = (): void => this.close();\n process.once('exit', cleanup);\n process.once('SIGINT', cleanup);\n process.once('SIGTERM', cleanup);\n }\n\n close(): void {\n if (this.db) {\n try { this.db.close(); } catch { /* ignore */ }\n this.db = null;\n }\n }\n\n private static resolveDbPath(): string {\n const xdg = process.env.XDG_DATA_HOME;\n const home = process.env.HOME || process.env.USERPROFILE || '';\n const base = xdg || path.join(home, '.local', 'share');\n return path.join(base, 'opencode', 'opencode.db');\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n const base = executableBasename(processInfo.command);\n return base === 'opencode' || base === 'opencode.exe';\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) return [];\n\n const db = this.openDb();\n if (!db) return processes.map((p) => this.mapProcessOnlyAgent(p));\n\n const agents: AgentInfo[] = [];\n for (const proc of processes) {\n if (!proc.cwd) {\n agents.push(this.mapProcessOnlyAgent(proc));\n continue;\n }\n\n const session = this.findSessionForDirectory(db, proc.cwd);\n if (!session) {\n agents.push(this.mapProcessOnlyAgent(proc));\n continue;\n }\n\n const stats = this.getSessionStats(db, session.sessionId);\n agents.push(this.mapSessionToAgent(session, stats, proc));\n }\n\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const ref = decodeSessionRef(sessionFilePath);\n if (!ref) return [];\n\n const db = this.openDb();\n if (!db) return [];\n\n try {\n const rows = db.prepare<[string], { role: string; partData: string; timeCreated: number }>(`\n SELECT json_extract(m.data, '$.role') AS role,\n p.data AS partData,\n p.time_created AS timeCreated\n FROM part p\n JOIN message m ON p.message_id = m.id\n WHERE p.session_id = ?\n ORDER BY p.time_created ASC\n `).all(ref.sessionId);\n\n const messages: ConversationMessage[] = [];\n\n for (const row of rows) {\n let partData: { type?: string; text?: string; reasoning?: string; tool?: string } = {};\n try {\n partData = JSON.parse(row.partData);\n } catch {\n continue;\n }\n\n const role = row.role === 'user' ? 'user' : 'assistant';\n\n if (partData.type === 'text' && partData.text) {\n messages.push({ role, content: partData.text });\n } else if (partData.type === 'reasoning' && verbose) {\n const text = partData.reasoning || partData.text || '';\n if (text) messages.push({ role: 'assistant', content: `[thinking] ${text}` });\n } else if (partData.type === 'tool' && verbose) {\n const toolName = partData.tool || 'tool';\n messages.push({ role: 'assistant', content: `[tool: ${toolName}]` });\n }\n }\n\n return messages;\n } catch {\n this.close();\n return [];\n }\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const db = this.openDb();\n if (!db) return [];\n\n try {\n const rows = db.prepare<[], { id: string; directory: string; timeCreated: number }>(`\n SELECT id, directory, time_created AS timeCreated\n FROM session\n ORDER BY time_created DESC\n `).all();\n\n const summaries: SessionSummary[] = [];\n\n for (const row of rows) {\n if (opts?.cwd !== undefined && row.directory !== opts.cwd) continue;\n\n const stats = this.getSessionStats(db, row.id);\n const lastActive = stats.lastTimeUpdated > 0\n ? new Date(stats.lastTimeUpdated)\n : new Date(row.timeCreated);\n const startedAt = new Date(row.timeCreated);\n\n summaries.push({\n type: 'opencode',\n sessionId: row.id,\n cwd: row.directory,\n firstUserMessage: stats.summary,\n lastActive,\n startedAt,\n sessionFilePath: encodeSessionRef(this.dbPath, row.id),\n });\n }\n\n return summaries;\n } catch {\n this.close();\n return [];\n }\n }\n\n private findSessionForDirectory(db: Database.Database, directory: string): OpenCodeSession | null {\n try {\n const row = db.prepare<[string], { id: string; directory: string; time_created: number }>(`\n SELECT id, directory, time_created\n FROM session\n WHERE directory = ?\n ORDER BY time_created DESC\n LIMIT 1\n `).get(directory);\n\n if (!row) return null;\n return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };\n } catch {\n return null;\n }\n }\n\n private getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats {\n const empty: OpenCodeSessionStats = {\n lastRole: null,\n lastTimeUpdated: 0,\n lastAssistantCompleted: false,\n lastAssistantErrored: false,\n summary: '',\n };\n\n try {\n // Order by time_created — time_updated can lag when OpenCode appends\n // metadata (e.g. summary diffs) to user messages after a turn finishes.\n const last = db.prepare<[string], { role: string; timeUpdated: number }>(`\n SELECT json_extract(data, '$.role') AS role,\n time_updated AS timeUpdated\n FROM message\n WHERE session_id = ?\n ORDER BY time_created DESC\n LIMIT 1\n `).get(sessionId);\n\n const heartbeat = db.prepare<[string], { maxUpdated: number }>(`\n SELECT MAX(time_updated) AS maxUpdated FROM message WHERE session_id = ?\n `).get(sessionId);\n\n const lastAssistant = db.prepare<[string], {\n completed: number | null;\n errored: number | null;\n }>(`\n SELECT json_extract(data, '$.time.completed') AS completed,\n json_extract(data, '$.time.error') AS errored\n FROM message\n WHERE session_id = ? AND json_extract(data, '$.role') = 'assistant'\n ORDER BY time_created DESC\n LIMIT 1\n `).get(sessionId);\n\n const first = db.prepare<[string], { text: string }>(`\n SELECT json_extract(p.data, '$.text') AS text\n FROM part p\n JOIN message m ON p.message_id = m.id\n WHERE p.session_id = ?\n AND json_extract(m.data, '$.role') = 'user'\n AND json_extract(p.data, '$.type') = 'text'\n AND json_extract(p.data, '$.text') IS NOT NULL\n ORDER BY p.time_created ASC\n LIMIT 1\n `).get(sessionId);\n\n return {\n lastRole: last?.role ?? null,\n lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,\n lastAssistantCompleted: lastAssistant?.completed != null,\n lastAssistantErrored: lastAssistant?.errored != null,\n summary: first?.text?.trim() ?? '',\n };\n } catch {\n return empty;\n }\n }\n\n private mapSessionToAgent(\n session: OpenCodeSession,\n stats: OpenCodeSessionStats,\n proc: ProcessInfo,\n ): AgentInfo {\n const lastActive = stats.lastTimeUpdated > 0\n ? new Date(stats.lastTimeUpdated)\n : new Date(session.timeCreated);\n\n return {\n name: generateAgentName(session.directory || proc.cwd || '', proc.pid),\n type: this.type,\n status: this.determineStatus(stats, lastActive),\n summary: stats.summary || 'OpenCode session active',\n pid: proc.pid,\n projectPath: session.directory || proc.cwd || '',\n sessionId: session.sessionId,\n lastActive,\n sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),\n };\n }\n\n private mapProcessOnlyAgent(proc: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(proc.cwd || '', proc.pid),\n type: this.type,\n status: AgentStatus.RUNNING,\n summary: 'OpenCode process running',\n pid: proc.pid,\n projectPath: proc.cwd || '',\n sessionId: `pid-${proc.pid}`,\n lastActive: new Date(),\n };\n }\n\n private determineStatus(stats: OpenCodeSessionStats, lastActive: Date): AgentStatus {\n const ageMin = (Date.now() - lastActive.getTime()) / 60000;\n if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;\n\n if (stats.lastRole === 'assistant' && !stats.lastAssistantCompleted) return AgentStatus.RUNNING;\n if (stats.lastRole === 'assistant') return AgentStatus.WAITING;\n return AgentStatus.RUNNING;\n }\n\n private openDb(): Database.Database | null {\n if (this.db) return this.db;\n if (!fs.existsSync(this.dbPath)) return null;\n try {\n this.db = new Database(this.dbPath, { readonly: true });\n return this.db;\n } catch {\n return null;\n }\n }\n}\n"],"names":["fs","path","Database","AgentStatus","captureProcessSnapshot","executableBasename","filterByProcessNames","generateAgentName","SESSION_REF_SEP","encodeSessionRef","dbPath","sessionId","decodeSessionRef","ref","idx","lastIndexOf","slice","length","OpenCodeAdapter","type","processNames","IDLE_THRESHOLD_MINUTES","db","resolveDbPath","cleanup","close","process","once","xdg","env","XDG_DATA_HOME","home","HOME","USERPROFILE","base","join","canHandle","processInfo","command","detectAgents","context","snapshot","processes","relevant","filter","openDb","map","p","mapProcessOnlyAgent","agents","proc","cwd","push","session","findSessionForDirectory","stats","getSessionStats","mapSessionToAgent","getConversation","sessionFilePath","options","verbose","rows","prepare","all","messages","row","partData","JSON","parse","role","text","content","reasoning","toolName","tool","listSessions","opts","summaries","undefined","directory","id","lastActive","lastTimeUpdated","Date","timeCreated","startedAt","firstUserMessage","summary","get","time_created","empty","lastRole","lastAssistantCompleted","lastAssistantErrored","last","heartbeat","lastAssistant","first","maxUpdated","timeUpdated","completed","errored","trim","name","pid","status","determineStatus","projectPath","RUNNING","ageMin","now","getTime","IDLE","WAITING","existsSync","readonly"],"mappings":"AAAA;;;;;;;;;;;CAWC,GAED,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAC7B,OAAOC,cAAc,iBAAiB;AAUtC,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,sBAAsB,EAAEC,kBAAkB,EAAEC,oBAAoB,QAAQ,sBAAsB;AACvG,SAASC,iBAAiB,QAAQ,uBAAuB;AAEzD,MAAMC,kBAAkB;AAExB,SAASC,iBAAiBC,MAAc,EAAEC,SAAiB;IACvD,OAAO,GAAGD,SAASF,kBAAkBG,WAAW;AACpD;AAEA,SAASC,iBAAiBC,GAAW;IACjC,MAAMC,MAAMD,IAAIE,WAAW,CAACP;IAC5B,IAAIM,QAAQ,CAAC,GAAG,OAAO;IACvB,OAAO;QAAEJ,QAAQG,IAAIG,KAAK,CAAC,GAAGF;QAAMH,WAAWE,IAAIG,KAAK,CAACF,MAAMN,gBAAgBS,MAAM;IAAE;AAC3F;AAiBA,OAAO,MAAMC;IACAC,OAAO,WAAoB;IAC3BC,eAAe;QAAC;KAAW,CAAU;IAE9C,OAAwBC,yBAAyB,EAAE;IAElCX,OAAe;IACxBY,KAA+B,KAAK;IAE5C,aAAc;QACV,IAAI,CAACZ,MAAM,GAAGQ,gBAAgBK,aAAa;QAC3C,MAAMC,UAAU,IAAY,IAAI,CAACC,KAAK;QACtCC,QAAQC,IAAI,CAAC,QAAQH;QACrBE,QAAQC,IAAI,CAAC,UAAUH;QACvBE,QAAQC,IAAI,CAAC,WAAWH;IAC5B;IAEAC,QAAc;QACV,IAAI,IAAI,CAACH,EAAE,EAAE;YACT,IAAI;gBAAE,IAAI,CAACA,EAAE,CAACG,KAAK;YAAI,EAAE,OAAM,CAAe;YAC9C,IAAI,CAACH,EAAE,GAAG;QACd;IACJ;IAEA,OAAeC,gBAAwB;QACnC,MAAMK,MAAMF,QAAQG,GAAG,CAACC,aAAa;QACrC,MAAMC,OAAOL,QAAQG,GAAG,CAACG,IAAI,IAAIN,QAAQG,GAAG,CAACI,WAAW,IAAI;QAC5D,MAAMC,OAAON,OAAO3B,KAAKkC,IAAI,CAACJ,MAAM,UAAU;QAC9C,OAAO9B,KAAKkC,IAAI,CAACD,MAAM,YAAY;IACvC;IAEAE,UAAUC,WAAwB,EAAW;QACzC,MAAMH,OAAO7B,mBAAmBgC,YAAYC,OAAO;QACnD,OAAOJ,SAAS,cAAcA,SAAS;IAC3C;IAEA,MAAMK,aAAaC,OAA+B,EAAwB;QACtE,MAAMC,WAAWD,SAASE,aAAa,MAAMtC,uBAAuB,IAAI,CAACgB,YAAY;QACrF,MAAMuB,WAAWrC,qBAAqBmC,UAAU,IAAI,CAACrB,YAAY;QACjE,MAAMsB,YAAYC,SAASC,MAAM,CAAC,CAAClB,WAAY,IAAI,CAACU,SAAS,CAACV;QAC9D,IAAIgB,UAAUzB,MAAM,KAAK,GAAG,OAAO,EAAE;QAErC,MAAMK,KAAK,IAAI,CAACuB,MAAM;QACtB,IAAI,CAACvB,IAAI,OAAOoB,UAAUI,GAAG,CAAC,CAACC,IAAM,IAAI,CAACC,mBAAmB,CAACD;QAE9D,MAAME,SAAsB,EAAE;QAC9B,KAAK,MAAMC,QAAQR,UAAW;YAC1B,IAAI,CAACQ,KAAKC,GAAG,EAAE;gBACXF,OAAOG,IAAI,CAAC,IAAI,CAACJ,mBAAmB,CAACE;gBACrC;YACJ;YAEA,MAAMG,UAAU,IAAI,CAACC,uBAAuB,CAAChC,IAAI4B,KAAKC,GAAG;YACzD,IAAI,CAACE,SAAS;gBACVJ,OAAOG,IAAI,CAAC,IAAI,CAACJ,mBAAmB,CAACE;gBACrC;YACJ;YAEA,MAAMK,QAAQ,IAAI,CAACC,eAAe,CAAClC,IAAI+B,QAAQ1C,SAAS;YACxDsC,OAAOG,IAAI,CAAC,IAAI,CAACK,iBAAiB,CAACJ,SAASE,OAAOL;QACvD;QAEA,OAAOD;IACX;IAEAS,gBAAgBC,eAAuB,EAAEC,OAA+B,EAAyB;QAC7F,MAAMC,UAAUD,SAASC,WAAW;QACpC,MAAMhD,MAAMD,iBAAiB+C;QAC7B,IAAI,CAAC9C,KAAK,OAAO,EAAE;QAEnB,MAAMS,KAAK,IAAI,CAACuB,MAAM;QACtB,IAAI,CAACvB,IAAI,OAAO,EAAE;QAElB,IAAI;YACA,MAAMwC,OAAOxC,GAAGyC,OAAO,CAAoE,CAAC;;;;;;;;YAQ5F,CAAC,EAAEC,GAAG,CAACnD,IAAIF,SAAS;YAEpB,MAAMsD,WAAkC,EAAE;YAE1C,KAAK,MAAMC,OAAOJ,KAAM;gBACpB,IAAIK,WAAgF,CAAC;gBACrF,IAAI;oBACAA,WAAWC,KAAKC,KAAK,CAACH,IAAIC,QAAQ;gBACtC,EAAE,OAAM;oBACJ;gBACJ;gBAEA,MAAMG,OAAOJ,IAAII,IAAI,KAAK,SAAS,SAAS;gBAE5C,IAAIH,SAAShD,IAAI,KAAK,UAAUgD,SAASI,IAAI,EAAE;oBAC3CN,SAASb,IAAI,CAAC;wBAAEkB;wBAAME,SAASL,SAASI,IAAI;oBAAC;gBACjD,OAAO,IAAIJ,SAAShD,IAAI,KAAK,eAAe0C,SAAS;oBACjD,MAAMU,OAAOJ,SAASM,SAAS,IAAIN,SAASI,IAAI,IAAI;oBACpD,IAAIA,MAAMN,SAASb,IAAI,CAAC;wBAAEkB,MAAM;wBAAaE,SAAS,CAAC,WAAW,EAAED,MAAM;oBAAC;gBAC/E,OAAO,IAAIJ,SAAShD,IAAI,KAAK,UAAU0C,SAAS;oBAC5C,MAAMa,WAAWP,SAASQ,IAAI,IAAI;oBAClCV,SAASb,IAAI,CAAC;wBAAEkB,MAAM;wBAAaE,SAAS,CAAC,OAAO,EAAEE,SAAS,CAAC,CAAC;oBAAC;gBACtE;YACJ;YAEA,OAAOT;QACX,EAAE,OAAM;YACJ,IAAI,CAACxC,KAAK;YACV,OAAO,EAAE;QACb;IACJ;IAEA,MAAMmD,aAAaC,IAA0B,EAA6B;QACtE,MAAMvD,KAAK,IAAI,CAACuB,MAAM;QACtB,IAAI,CAACvB,IAAI,OAAO,EAAE;QAElB,IAAI;YACA,MAAMwC,OAAOxC,GAAGyC,OAAO,CAA6D,CAAC;;;;YAIrF,CAAC,EAAEC,GAAG;YAEN,MAAMc,YAA8B,EAAE;YAEtC,KAAK,MAAMZ,OAAOJ,KAAM;gBACpB,IAAIe,MAAM1B,QAAQ4B,aAAab,IAAIc,SAAS,KAAKH,KAAK1B,GAAG,EAAE;gBAE3D,MAAMI,QAAQ,IAAI,CAACC,eAAe,CAAClC,IAAI4C,IAAIe,EAAE;gBAC7C,MAAMC,aAAa3B,MAAM4B,eAAe,GAAG,IACrC,IAAIC,KAAK7B,MAAM4B,eAAe,IAC9B,IAAIC,KAAKlB,IAAImB,WAAW;gBAC9B,MAAMC,YAAY,IAAIF,KAAKlB,IAAImB,WAAW;gBAE1CP,UAAU1B,IAAI,CAAC;oBACXjC,MAAM;oBACNR,WAAWuD,IAAIe,EAAE;oBACjB9B,KAAKe,IAAIc,SAAS;oBAClBO,kBAAkBhC,MAAMiC,OAAO;oBAC/BN;oBACAI;oBACA3B,iBAAiBlD,iBAAiB,IAAI,CAACC,MAAM,EAAEwD,IAAIe,EAAE;gBACzD;YACJ;YAEA,OAAOH;QACX,EAAE,OAAM;YACJ,IAAI,CAACrD,KAAK;YACV,OAAO,EAAE;QACb;IACJ;IAEQ6B,wBAAwBhC,EAAqB,EAAE0D,SAAiB,EAA0B;QAC9F,IAAI;YACA,MAAMd,MAAM5C,GAAGyC,OAAO,CAAoE,CAAC;;;;;;YAM3F,CAAC,EAAE0B,GAAG,CAACT;YAEP,IAAI,CAACd,KAAK,OAAO;YACjB,OAAO;gBAAEvD,WAAWuD,IAAIe,EAAE;gBAAED,WAAWd,IAAIc,SAAS;gBAAEK,aAAanB,IAAIwB,YAAY;YAAC;QACxF,EAAE,OAAM;YACJ,OAAO;QACX;IACJ;IAEQlC,gBAAgBlC,EAAqB,EAAEX,SAAiB,EAAwB;QACpF,MAAMgF,QAA8B;YAChCC,UAAU;YACVT,iBAAiB;YACjBU,wBAAwB;YACxBC,sBAAsB;YACtBN,SAAS;QACb;QAEA,IAAI;YACA,qEAAqE;YACrE,wEAAwE;YACxE,MAAMO,OAAOzE,GAAGyC,OAAO,CAAkD,CAAC;;;;;;;YAO1E,CAAC,EAAE0B,GAAG,CAAC9E;YAEP,MAAMqF,YAAY1E,GAAGyC,OAAO,CAAmC,CAAC;;YAEhE,CAAC,EAAE0B,GAAG,CAAC9E;YAEP,MAAMsF,gBAAgB3E,GAAGyC,OAAO,CAG7B,CAAC;;;;;;;YAOJ,CAAC,EAAE0B,GAAG,CAAC9E;YAEP,MAAMuF,QAAQ5E,GAAGyC,OAAO,CAA6B,CAAC;;;;;;;;;;YAUtD,CAAC,EAAE0B,GAAG,CAAC9E;YAEP,OAAO;gBACHiF,UAAUG,MAAMzB,QAAQ;gBACxBa,iBAAiBa,WAAWG,cAAcJ,MAAMK,eAAe;gBAC/DP,wBAAwBI,eAAeI,aAAa;gBACpDP,sBAAsBG,eAAeK,WAAW;gBAChDd,SAASU,OAAO3B,MAAMgC,UAAU;YACpC;QACJ,EAAE,OAAM;YACJ,OAAOZ;QACX;IACJ;IAEQlC,kBACJJ,OAAwB,EACxBE,KAA2B,EAC3BL,IAAiB,EACR;QACT,MAAMgC,aAAa3B,MAAM4B,eAAe,GAAG,IACrC,IAAIC,KAAK7B,MAAM4B,eAAe,IAC9B,IAAIC,KAAK/B,QAAQgC,WAAW;QAElC,OAAO;YACHmB,MAAMjG,kBAAkB8C,QAAQ2B,SAAS,IAAI9B,KAAKC,GAAG,IAAI,IAAID,KAAKuD,GAAG;YACrEtF,MAAM,IAAI,CAACA,IAAI;YACfuF,QAAQ,IAAI,CAACC,eAAe,CAACpD,OAAO2B;YACpCM,SAASjC,MAAMiC,OAAO,IAAI;YAC1BiB,KAAKvD,KAAKuD,GAAG;YACbG,aAAavD,QAAQ2B,SAAS,IAAI9B,KAAKC,GAAG,IAAI;YAC9CxC,WAAW0C,QAAQ1C,SAAS;YAC5BuE;YACAvB,iBAAiBlD,iBAAiB,IAAI,CAACC,MAAM,EAAE2C,QAAQ1C,SAAS;QACpE;IACJ;IAEQqC,oBAAoBE,IAAiB,EAAa;QACtD,OAAO;YACHsD,MAAMjG,kBAAkB2C,KAAKC,GAAG,IAAI,IAAID,KAAKuD,GAAG;YAChDtF,MAAM,IAAI,CAACA,IAAI;YACfuF,QAAQvG,YAAY0G,OAAO;YAC3BrB,SAAS;YACTiB,KAAKvD,KAAKuD,GAAG;YACbG,aAAa1D,KAAKC,GAAG,IAAI;YACzBxC,WAAW,CAAC,IAAI,EAAEuC,KAAKuD,GAAG,EAAE;YAC5BvB,YAAY,IAAIE;QACpB;IACJ;IAEQuB,gBAAgBpD,KAA2B,EAAE2B,UAAgB,EAAe;QAChF,MAAM4B,SAAS,AAAC1B,CAAAA,KAAK2B,GAAG,KAAK7B,WAAW8B,OAAO,EAAC,IAAK;QACrD,IAAIF,SAAS5F,gBAAgBG,sBAAsB,EAAE,OAAOlB,YAAY8G,IAAI;QAE5E,IAAI1D,MAAMqC,QAAQ,KAAK,eAAe,CAACrC,MAAMsC,sBAAsB,EAAE,OAAO1F,YAAY0G,OAAO;QAC/F,IAAItD,MAAMqC,QAAQ,KAAK,aAAa,OAAOzF,YAAY+G,OAAO;QAC9D,OAAO/G,YAAY0G,OAAO;IAC9B;IAEQhE,SAAmC;QACvC,IAAI,IAAI,CAACvB,EAAE,EAAE,OAAO,IAAI,CAACA,EAAE;QAC3B,IAAI,CAACtB,GAAGmH,UAAU,CAAC,IAAI,CAACzG,MAAM,GAAG,OAAO;QACxC,IAAI;YACA,IAAI,CAACY,EAAE,GAAG,IAAIpB,SAAS,IAAI,CAACQ,MAAM,EAAE;gBAAE0G,UAAU;YAAK;YACrD,OAAO,IAAI,CAAC9F,EAAE;QAClB,EAAE,OAAM;YACJ,OAAO;QACX;IACJ;AACJ"}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/OpenCodeAdapter.ts"],"sourcesContent":["/**\n * OpenCode Adapter\n *\n * Detects running OpenCode agents by:\n * 1. Filtering OpenCode processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Querying OpenCode's SQLite DB (~/.local/share/opencode/opencode.db) to\n * find the session matching each process's CWD and read status from message.time.completed\n *\n * sessionFilePath encodes \"<dbPath>::<sessionId>\" so getConversation() can open the right\n * DB row without extending the AgentAdapter interface.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport Database from \"better-sqlite3\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"./AgentAdapter.js\";\nimport { AgentStatus } from \"./AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n} from \"../utils/process.js\";\nimport { generateAgentName } from \"../utils/matching.js\";\n\nconst SESSION_REF_SEP = \"::\";\n\nfunction encodeSessionRef(dbPath: string, sessionId: string): string {\n return `${dbPath}${SESSION_REF_SEP}${sessionId}`;\n}\n\nfunction decodeSessionRef(ref: string): { dbPath: string; sessionId: string } | null {\n const idx = ref.lastIndexOf(SESSION_REF_SEP);\n if (idx === -1) return null;\n return { dbPath: ref.slice(0, idx), sessionId: ref.slice(idx + SESSION_REF_SEP.length) };\n}\n\ninterface OpenCodeSession {\n sessionId: string;\n directory: string;\n timeCreated: number;\n}\n\ninterface OpenCodeSessionStats {\n lastRole: string | null;\n lastTimeUpdated: number;\n /** OpenCode writes `time.completed` on the assistant message only when the turn finishes. */\n lastAssistantCompleted: boolean;\n lastAssistantErrored: boolean;\n summary: string;\n}\n\nexport class OpenCodeAdapter implements AgentAdapter {\n readonly type = \"opencode\" as const;\n readonly processNames = [\"opencode\"] as const;\n\n private static readonly IDLE_THRESHOLD_MINUTES = 5;\n\n private readonly dbPath: string;\n private readonly cleanup = (): void => this.close();\n private db: Database.Database | null = null;\n\n constructor() {\n this.dbPath = OpenCodeAdapter.resolveDbPath();\n process.once(\"exit\", this.cleanup);\n process.once(\"SIGINT\", this.cleanup);\n process.once(\"SIGTERM\", this.cleanup);\n }\n\n close(): void {\n process.off(\"exit\", this.cleanup);\n process.off(\"SIGINT\", this.cleanup);\n process.off(\"SIGTERM\", this.cleanup);\n\n if (this.db) {\n try {\n this.db.close();\n } catch {\n /* ignore */\n }\n this.db = null;\n }\n }\n\n private static resolveDbPath(): string {\n const xdg = process.env.XDG_DATA_HOME;\n const home = process.env.HOME || process.env.USERPROFILE || \"\";\n const base = xdg || path.join(home, \".local\", \"share\");\n return path.join(base, \"opencode\", \"opencode.db\");\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n const base = executableBasename(processInfo.command);\n return base === \"opencode\" || base === \"opencode.exe\";\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) return [];\n\n const db = this.openDb();\n if (!db) return processes.map((p) => this.mapProcessOnlyAgent(p));\n\n const agents: AgentInfo[] = [];\n for (const proc of processes) {\n if (!proc.cwd) {\n agents.push(this.mapProcessOnlyAgent(proc));\n continue;\n }\n\n const session = this.findSessionForDirectory(db, proc.cwd);\n if (!session) {\n agents.push(this.mapProcessOnlyAgent(proc));\n continue;\n }\n\n const stats = this.getSessionStats(db, session.sessionId);\n agents.push(this.mapSessionToAgent(session, stats, proc));\n }\n\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const ref = decodeSessionRef(sessionFilePath);\n if (!ref) return [];\n\n const db = this.openDb();\n if (!db) return [];\n\n try {\n const rows = db\n .prepare<[string], { role: string; partData: string; timeCreated: number }>(`\n SELECT json_extract(m.data, '$.role') AS role,\n p.data AS partData,\n p.time_created AS timeCreated\n FROM part p\n JOIN message m ON p.message_id = m.id\n WHERE p.session_id = ?\n ORDER BY p.time_created ASC\n `)\n .all(ref.sessionId);\n\n const messages: ConversationMessage[] = [];\n\n for (const row of rows) {\n let partData: { type?: string; text?: string; reasoning?: string; tool?: string } = {};\n try {\n partData = JSON.parse(row.partData);\n } catch {\n continue;\n }\n\n const role = row.role === \"user\" ? \"user\" : \"assistant\";\n\n if (partData.type === \"text\" && partData.text) {\n messages.push({ role, content: partData.text });\n } else if (partData.type === \"reasoning\" && verbose) {\n const text = partData.reasoning || partData.text || \"\";\n if (text) messages.push({ role: \"assistant\", content: `[thinking] ${text}` });\n } else if (partData.type === \"tool\" && verbose) {\n const toolName = partData.tool || \"tool\";\n messages.push({ role: \"assistant\", content: `[tool: ${toolName}]` });\n }\n }\n\n return messages;\n } catch {\n this.close();\n return [];\n }\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const db = this.openDb();\n if (!db) return [];\n\n try {\n const rows = db\n .prepare<[], { id: string; directory: string; timeCreated: number }>(`\n SELECT id, directory, time_created AS timeCreated\n FROM session\n ORDER BY time_created DESC\n `)\n .all();\n\n const summaries: SessionSummary[] = [];\n\n for (const row of rows) {\n if (opts?.cwd !== undefined && row.directory !== opts.cwd) continue;\n\n const stats = this.getSessionStats(db, row.id);\n const lastActive =\n stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(row.timeCreated);\n const startedAt = new Date(row.timeCreated);\n\n summaries.push({\n type: \"opencode\",\n sessionId: row.id,\n cwd: row.directory,\n firstUserMessage: stats.summary,\n lastActive,\n startedAt,\n sessionFilePath: encodeSessionRef(this.dbPath, row.id),\n });\n }\n\n return summaries;\n } catch {\n this.close();\n return [];\n }\n }\n\n private findSessionForDirectory(\n db: Database.Database,\n directory: string,\n ): OpenCodeSession | null {\n try {\n const row = db\n .prepare<[string], { id: string; directory: string; time_created: number }>(`\n SELECT id, directory, time_created\n FROM session\n WHERE directory = ?\n ORDER BY time_created DESC\n LIMIT 1\n `)\n .get(directory);\n\n if (!row) return null;\n return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };\n } catch {\n return null;\n }\n }\n\n private getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats {\n const empty: OpenCodeSessionStats = {\n lastRole: null,\n lastTimeUpdated: 0,\n lastAssistantCompleted: false,\n lastAssistantErrored: false,\n summary: \"\",\n };\n\n try {\n // Order by time_created — time_updated can lag when OpenCode appends\n // metadata (e.g. summary diffs) to user messages after a turn finishes.\n const last = db\n .prepare<[string], { role: string; timeUpdated: number }>(`\n SELECT json_extract(data, '$.role') AS role,\n time_updated AS timeUpdated\n FROM message\n WHERE session_id = ?\n ORDER BY time_created DESC\n LIMIT 1\n `)\n .get(sessionId);\n\n const heartbeat = db\n .prepare<[string], { maxUpdated: number }>(`\n SELECT MAX(time_updated) AS maxUpdated FROM message WHERE session_id = ?\n `)\n .get(sessionId);\n\n const lastAssistant = db\n .prepare<\n [string],\n {\n completed: number | null;\n errored: number | null;\n }\n >(`\n SELECT json_extract(data, '$.time.completed') AS completed,\n json_extract(data, '$.time.error') AS errored\n FROM message\n WHERE session_id = ? AND json_extract(data, '$.role') = 'assistant'\n ORDER BY time_created DESC\n LIMIT 1\n `)\n .get(sessionId);\n\n const first = db\n .prepare<[string], { text: string }>(`\n SELECT json_extract(p.data, '$.text') AS text\n FROM part p\n JOIN message m ON p.message_id = m.id\n WHERE p.session_id = ?\n AND json_extract(m.data, '$.role') = 'user'\n AND json_extract(p.data, '$.type') = 'text'\n AND json_extract(p.data, '$.text') IS NOT NULL\n ORDER BY p.time_created ASC\n LIMIT 1\n `)\n .get(sessionId);\n\n return {\n lastRole: last?.role ?? null,\n lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,\n lastAssistantCompleted: lastAssistant?.completed != null,\n lastAssistantErrored: lastAssistant?.errored != null,\n summary: first?.text?.trim() ?? \"\",\n };\n } catch {\n return empty;\n }\n }\n\n private mapSessionToAgent(\n session: OpenCodeSession,\n stats: OpenCodeSessionStats,\n proc: ProcessInfo,\n ): AgentInfo {\n const lastActive =\n stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(session.timeCreated);\n\n return {\n name: generateAgentName(session.directory || proc.cwd || \"\", proc.pid),\n type: this.type,\n status: this.determineStatus(stats, lastActive),\n summary: stats.summary || \"OpenCode session active\",\n pid: proc.pid,\n projectPath: session.directory || proc.cwd || \"\",\n sessionId: session.sessionId,\n lastActive,\n sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),\n };\n }\n\n private mapProcessOnlyAgent(proc: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(proc.cwd || \"\", proc.pid),\n type: this.type,\n status: AgentStatus.RUNNING,\n summary: \"OpenCode process running\",\n pid: proc.pid,\n projectPath: proc.cwd || \"\",\n sessionId: `pid-${proc.pid}`,\n lastActive: new Date(),\n };\n }\n\n private determineStatus(stats: OpenCodeSessionStats, lastActive: Date): AgentStatus {\n const ageMin = (Date.now() - lastActive.getTime()) / 60000;\n if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;\n\n if (stats.lastRole === \"assistant\" && !stats.lastAssistantCompleted) return AgentStatus.RUNNING;\n if (stats.lastRole === \"assistant\") return AgentStatus.WAITING;\n return AgentStatus.RUNNING;\n }\n\n private openDb(): Database.Database | null {\n if (this.db) return this.db;\n if (!fs.existsSync(this.dbPath)) return null;\n try {\n this.db = new Database(this.dbPath, { readonly: true });\n return this.db;\n } catch {\n return null;\n }\n }\n}\n"],"names":["fs","path","Database","AgentStatus","captureProcessSnapshot","executableBasename","filterByProcessNames","generateAgentName","SESSION_REF_SEP","encodeSessionRef","dbPath","sessionId","decodeSessionRef","ref","idx","lastIndexOf","slice","length","OpenCodeAdapter","type","processNames","IDLE_THRESHOLD_MINUTES","cleanup","close","db","resolveDbPath","process","once","off","xdg","env","XDG_DATA_HOME","home","HOME","USERPROFILE","base","join","canHandle","processInfo","command","detectAgents","context","snapshot","processes","relevant","filter","openDb","map","p","mapProcessOnlyAgent","agents","proc","cwd","push","session","findSessionForDirectory","stats","getSessionStats","mapSessionToAgent","getConversation","sessionFilePath","options","verbose","rows","prepare","all","messages","row","partData","JSON","parse","role","text","content","reasoning","toolName","tool","listSessions","opts","summaries","undefined","directory","id","lastActive","lastTimeUpdated","Date","timeCreated","startedAt","firstUserMessage","summary","get","time_created","empty","lastRole","lastAssistantCompleted","lastAssistantErrored","last","heartbeat","lastAssistant","first","maxUpdated","timeUpdated","completed","errored","trim","name","pid","status","determineStatus","projectPath","RUNNING","ageMin","now","getTime","IDLE","WAITING","existsSync","readonly"],"mappings":"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"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { ClaudeCodeAdapter } from
|
|
2
|
-
export { CodexAdapter } from
|
|
3
|
-
export { CopilotAdapter } from
|
|
4
|
-
export { GeminiCliAdapter } from
|
|
5
|
-
export { GrokCliAdapter } from
|
|
6
|
-
export { OpenCodeAdapter } from
|
|
7
|
-
export { PiAdapter } from
|
|
8
|
-
export { AgentStatus } from
|
|
9
|
-
export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo, AgentDetectionContext } from
|
|
1
|
+
export { ClaudeCodeAdapter } from "../providers/claude/ClaudeCodeAdapter.js";
|
|
2
|
+
export { CodexAdapter } from "../providers/codex/CodexAdapter.js";
|
|
3
|
+
export { CopilotAdapter } from "../providers/copilot/CopilotAdapter.js";
|
|
4
|
+
export { GeminiCliAdapter } from "../providers/gemini/GeminiCliAdapter.js";
|
|
5
|
+
export { GrokCliAdapter } from "./GrokCliAdapter.js";
|
|
6
|
+
export { OpenCodeAdapter } from "./OpenCodeAdapter.js";
|
|
7
|
+
export { PiAdapter } from "../providers/pi/PiAdapter.js";
|
|
8
|
+
export { AgentStatus } from "./AgentAdapter.js";
|
|
9
|
+
export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo, AgentDetectionContext, } from "./AgentAdapter.js";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,YAAY,EACZ,SAAS,EACT,SAAS,EACT,WAAW,EACX,qBAAqB,GACtB,MAAM,mBAAmB,CAAC"}
|
package/dist/adapters/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { ClaudeCodeAdapter } from
|
|
2
|
-
export { CodexAdapter } from
|
|
3
|
-
export { CopilotAdapter } from
|
|
4
|
-
export { GeminiCliAdapter } from
|
|
5
|
-
export { GrokCliAdapter } from
|
|
6
|
-
export { OpenCodeAdapter } from
|
|
7
|
-
export { PiAdapter } from
|
|
8
|
-
export { AgentStatus } from
|
|
1
|
+
export { ClaudeCodeAdapter } from "../providers/claude/ClaudeCodeAdapter.js";
|
|
2
|
+
export { CodexAdapter } from "../providers/codex/CodexAdapter.js";
|
|
3
|
+
export { CopilotAdapter } from "../providers/copilot/CopilotAdapter.js";
|
|
4
|
+
export { GeminiCliAdapter } from "../providers/gemini/GeminiCliAdapter.js";
|
|
5
|
+
export { GrokCliAdapter } from "./GrokCliAdapter.js";
|
|
6
|
+
export { OpenCodeAdapter } from "./OpenCodeAdapter.js";
|
|
7
|
+
export { PiAdapter } from "../providers/pi/PiAdapter.js";
|
|
8
|
+
export { AgentStatus } from "./AgentAdapter.js";
|
|
9
9
|
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/index.ts"],"sourcesContent":["export { ClaudeCodeAdapter } from
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/index.ts"],"sourcesContent":["export { ClaudeCodeAdapter } from \"../providers/claude/ClaudeCodeAdapter.js\";\nexport { CodexAdapter } from \"../providers/codex/CodexAdapter.js\";\nexport { CopilotAdapter } from \"../providers/copilot/CopilotAdapter.js\";\nexport { GeminiCliAdapter } from \"../providers/gemini/GeminiCliAdapter.js\";\nexport { GrokCliAdapter } from \"./GrokCliAdapter.js\";\nexport { OpenCodeAdapter } from \"./OpenCodeAdapter.js\";\nexport { PiAdapter } from \"../providers/pi/PiAdapter.js\";\nexport { AgentStatus } from \"./AgentAdapter.js\";\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n AgentDetectionContext,\n} from \"./AgentAdapter.js\";\n"],"names":["ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,2CAA2C;AAC7E,SAASC,YAAY,QAAQ,qCAAqC;AAClE,SAASC,cAAc,QAAQ,yCAAyC;AACxE,SAASC,gBAAgB,QAAQ,0CAA0C;AAC3E,SAASC,cAAc,QAAQ,sBAAsB;AACrD,SAASC,eAAe,QAAQ,uBAAuB;AACvD,SAASC,SAAS,QAAQ,+BAA+B;AACzD,SAASC,WAAW,QAAQ,oBAAoB"}
|
package/dist/capacity/codex.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { CapacityReport, CapacityWindow } from
|
|
2
|
-
type CodexUsageSource =
|
|
1
|
+
import type { CapacityReport, CapacityWindow } from "./types.js";
|
|
2
|
+
type CodexUsageSource = "pat" | "oauth" | "cli";
|
|
3
3
|
type UsageSnapshot = {
|
|
4
4
|
windows: CapacityWindow[];
|
|
5
5
|
creditsRemaining: number | null;
|
|
@@ -29,7 +29,7 @@ type CodexProbeOptions = {
|
|
|
29
29
|
};
|
|
30
30
|
export declare function resolveCodexAuthPath(env?: NodeJS.ProcessEnv): string;
|
|
31
31
|
export declare function toRateWindow(value: unknown, id: string, label: string): CapacityWindow | null;
|
|
32
|
-
export declare function parseUsage(raw: unknown, source:
|
|
32
|
+
export declare function parseUsage(raw: unknown, source: "pat" | "oauth"): UsageSnapshot;
|
|
33
33
|
export declare function parseCliUsage(raw: unknown): UsageSnapshot;
|
|
34
34
|
export declare function probeCodexCapacity(options: CodexProbeOptions): Promise<CapacityReport>;
|
|
35
35
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/capacity/codex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,KAAK,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAChD,KAAK,aAAa,GAAG;
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../src/capacity/codex.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,KAAK,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,KAAK,CAAC;AAChD,KAAK,aAAa,GAAG;IACnB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,KAAK,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC7C,KAAK,UAAU,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAC1E,KAAK,YAAY,GAAG;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAC9D,KAAK,QAAQ,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAElE,eAAO,MAAM,qBAAqB,+DAAgE,CAAC;AAEnG,KAAK,iBAAiB,GAAG;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AA+BF,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGjF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAY7F;AAgBD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,GAAG,aAAa,CAa/E;AAwBD,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAWzD;AAoLD,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAoD5F"}
|