@ai-devkit/agent-manager 0.32.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +3 -3
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +80 -79
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +413 -388
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +93 -93
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/index.test.js +17 -17
- package/dist/__tests__/capacity/index.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgent.test.js +9 -9
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
- package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
- package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
- package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
- package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/__tests__/utils/agent-requests.test.js +43 -43
- package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
- package/dist/__tests__/utils/agents.test.js +17 -17
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/matching.test.js +92 -92
- package/dist/__tests__/utils/matching.test.js.map +1 -1
- package/dist/__tests__/utils/process.test.js +108 -108
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/__tests__/utils/session.test.js +53 -53
- package/dist/__tests__/utils/session.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +2 -2
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +1 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/adapters/CopilotAdapter.d.ts +2 -2
- package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
- package/dist/adapters/CopilotAdapter.js +51 -51
- package/dist/adapters/CopilotAdapter.js.map +1 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
- package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GeminiCliAdapter.js +86 -86
- package/dist/adapters/GeminiCliAdapter.js.map +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GrokCliAdapter.js +80 -80
- package/dist/adapters/GrokCliAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +37 -36
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +9 -9
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -8
- package/dist/adapters/index.js.map +1 -1
- package/dist/capacity/codex.d.ts +3 -3
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +57 -57
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +3 -3
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +8 -8
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/types.d.ts +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/database/connection.d.ts +1 -1
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +15 -15
- package/dist/database/connection.js.map +1 -1
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/migrations/005_agent_runtime.sql +2 -0
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +7 -7
- package/dist/database/schema.js.map +1 -1
- package/dist/durable/DurableAgent.d.ts +9 -9
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +16 -16
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +4 -4
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +49 -48
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +1 -1
- package/dist/durable/process.d.ts.map +1 -1
- package/dist/durable/process.js +14 -14
- package/dist/durable/process.js.map +1 -1
- package/dist/durable/run.d.ts +2 -2
- package/dist/durable/run.d.ts.map +1 -1
- package/dist/durable/run.js +6 -6
- package/dist/durable/run.js.map +1 -1
- package/dist/durable/utils.d.ts +1 -1
- package/dist/durable/utils.d.ts.map +1 -1
- package/dist/durable/utils.js +4 -4
- package/dist/durable/utils.js.map +1 -1
- package/dist/index.d.ts +46 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -26
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js +99 -99
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/providers/codex/CodexAdapter.d.ts +27 -0
- package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/providers/codex/CodexAdapter.js +162 -0
- package/dist/providers/codex/CodexAdapter.js.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.js +35 -0
- package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.js +207 -0
- package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.js +68 -0
- package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
- package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
- package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionParser.js +262 -0
- package/dist/providers/codex/CodexSessionParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/providers/pi/PiAdapter.d.ts +28 -0
- package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
- package/dist/providers/pi/PiAdapter.js +153 -0
- package/dist/providers/pi/PiAdapter.js.map +1 -0
- package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
- package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/providers/pi/PiAgentMapper.js +37 -0
- package/dist/providers/pi/PiAgentMapper.js.map +1 -0
- package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
- package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionLocator.js +79 -0
- package/dist/providers/pi/PiSessionLocator.js.map +1 -0
- package/dist/providers/pi/PiSessionParser.d.ts +36 -0
- package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionParser.js +191 -0
- package/dist/providers/pi/PiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
- package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionTracker.js +69 -0
- package/dist/providers/pi/PiSessionTracker.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiCliProbe.js +15 -15
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.js +16 -16
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +6 -6
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js +130 -130
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.js +156 -0
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
- package/dist/runtime/RuntimeFactory.d.ts +4 -0
- package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
- package/dist/runtime/RuntimeFactory.js +11 -0
- package/dist/runtime/RuntimeFactory.js.map +1 -0
- package/dist/runtime/errors.d.ts +27 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +42 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.js +60 -0
- package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.js +10 -0
- package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
- package/dist/runtime/tmux/PidPolling.d.ts +5 -0
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
- package/dist/runtime/tmux/PidPolling.js +24 -0
- package/dist/runtime/tmux/PidPolling.js.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
- package/dist/runtime/types.d.ts +54 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +50 -50
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TmuxManager.d.ts.map +1 -1
- package/dist/terminal/TmuxManager.js +47 -47
- package/dist/terminal/TmuxManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -1
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +89 -89
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/index.d.ts +4 -4
- package/dist/terminal/index.js +3 -3
- package/dist/terminal/index.js.map +1 -1
- package/dist/utils/AgentRegistry.d.ts +10 -2
- package/dist/utils/AgentRegistry.d.ts.map +1 -1
- package/dist/utils/AgentRegistry.js +57 -24
- package/dist/utils/AgentRegistry.js.map +1 -1
- package/dist/utils/agent-requests.d.ts.map +1 -1
- package/dist/utils/agent-requests.js +5 -5
- package/dist/utils/agent-requests.js.map +1 -1
- package/dist/utils/agents.d.ts +2 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +15 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/applescript.js +1 -1
- package/dist/utils/applescript.js.map +1 -1
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matching.d.ts +2 -2
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +4 -4
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/process.d.ts +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +74 -74
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/session.d.ts +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +7 -7
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/sortAgents.d.ts +2 -2
- package/dist/utils/sortAgents.d.ts.map +1 -1
- package/dist/utils/sortAgents.js +5 -5
- package/dist/utils/sortAgents.js.map +1 -1
- package/package.json +18 -19
- package/src/AgentManager.ts +283 -281
- package/src/__tests__/AgentManager.test.ts +917 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
- package/src/__tests__/capacity/codex.test.ts +178 -91
- package/src/__tests__/capacity/index.test.ts +27 -18
- package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
- package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
- package/src/__tests__/fixtures/fake-claude.cjs +20 -13
- package/src/__tests__/fixtures/fake-codex.cjs +41 -30
- package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
- package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
- package/src/__tests__/print/DurableAgent.test.ts +19 -16
- package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
- package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
- package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
- package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
- package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
- package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
- package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
- package/src/__tests__/utils/agent-requests.test.ts +76 -56
- package/src/__tests__/utils/agents.test.ts +20 -20
- package/src/__tests__/utils/matching.test.ts +206 -171
- package/src/__tests__/utils/process.test.ts +276 -262
- package/src/__tests__/utils/session.test.ts +133 -139
- package/src/adapters/AgentAdapter.ts +134 -126
- package/src/adapters/CopilotAdapter.ts +405 -395
- package/src/adapters/GeminiCliAdapter.ts +598 -600
- package/src/adapters/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +285 -259
- package/src/adapters/index.ts +15 -9
- package/src/capacity/codex.ts +137 -84
- package/src/capacity/index.ts +18 -13
- package/src/capacity/types.ts +1 -1
- package/src/database/connection.ts +73 -68
- package/src/database/index.ts +6 -6
- package/src/database/migrations/005_agent_runtime.sql +2 -0
- package/src/database/schema.ts +40 -38
- package/src/durable/DurableAgent.ts +85 -85
- package/src/durable/DurableAgentRepository.ts +409 -260
- package/src/durable/process.ts +22 -21
- package/src/durable/run.ts +61 -51
- package/src/durable/utils.ts +46 -41
- package/src/index.ts +144 -103
- package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
- package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
- package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
- package/src/providers/claude/ClaudeSessionParser.ts +322 -338
- package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
- package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
- package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
- package/src/providers/codex/CodexAdapter.ts +205 -0
- package/src/providers/codex/CodexAgentMapper.ts +35 -0
- package/src/providers/codex/CodexSessionLocator.ts +279 -0
- package/src/providers/codex/CodexSessionMapping.ts +89 -0
- package/src/providers/codex/CodexSessionParser.ts +385 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
- package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
- package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
- package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
- package/src/providers/pi/PiAdapter.ts +183 -0
- package/src/providers/pi/PiAgentMapper.ts +36 -0
- package/src/providers/pi/PiSessionLocator.ts +95 -0
- package/src/providers/pi/PiSessionParser.ts +284 -0
- package/src/providers/pi/PiSessionTracker.ts +87 -0
- package/src/providers/pi/durable/PiCliProbe.ts +42 -34
- package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
- package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
- package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
- package/src/providers/pi/durable/PiStreamParser.ts +82 -72
- package/src/readiness/AgentReadiness.ts +585 -513
- package/src/runtime/ManagedAgentRuntime.ts +266 -0
- package/src/runtime/RuntimeFactory.ts +13 -0
- package/src/runtime/errors.ts +50 -0
- package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
- package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
- package/src/runtime/tmux/PidPolling.ts +34 -0
- package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
- package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
- package/src/runtime/types.ts +56 -0
- package/src/terminal/TerminalFocusManager.ts +215 -212
- package/src/terminal/TmuxManager.ts +99 -92
- package/src/terminal/TtyWriter.ts +203 -194
- package/src/terminal/index.ts +4 -4
- package/src/utils/AgentRegistry.ts +299 -238
- package/src/utils/agent-requests.ts +16 -16
- package/src/utils/agents.ts +41 -38
- package/src/utils/applescript.ts +4 -4
- package/src/utils/index.ts +12 -6
- package/src/utils/matching.ts +43 -43
- package/src/utils/process.ts +261 -258
- package/src/utils/session.ts +66 -66
- package/src/utils/sortAgents.ts +35 -33
- package/tsconfig.json +2 -8
- package/vitest.config.ts +16 -16
- package/.eslintrc.json +0 -31
- package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
- package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
- package/dist/adapters/CodexAdapter.d.ts +0 -109
- package/dist/adapters/CodexAdapter.d.ts.map +0 -1
- package/dist/adapters/CodexAdapter.js +0 -710
- package/dist/adapters/CodexAdapter.js.map +0 -1
- package/dist/adapters/PiAdapter.d.ts +0 -63
- package/dist/adapters/PiAdapter.d.ts.map +0 -1
- package/dist/adapters/PiAdapter.js +0 -453
- package/dist/adapters/PiAdapter.js.map +0 -1
- package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
- package/src/adapters/CodexAdapter.ts +0 -923
- package/src/adapters/PiAdapter.ts +0 -598
package/src/capacity/codex.ts
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import { spawn } from
|
|
2
|
-
import { readFile } from
|
|
3
|
-
import { join } from
|
|
4
|
-
import type { CapacityReport, CapacityWindow } from
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import type { CapacityReport, CapacityWindow } from "./types.js";
|
|
5
5
|
|
|
6
|
-
type CodexUsageSource =
|
|
7
|
-
type UsageSnapshot = {
|
|
6
|
+
type CodexUsageSource = "pat" | "oauth" | "cli";
|
|
7
|
+
type UsageSnapshot = {
|
|
8
|
+
windows: CapacityWindow[];
|
|
9
|
+
creditsRemaining: number | null;
|
|
10
|
+
source: CodexUsageSource;
|
|
11
|
+
};
|
|
8
12
|
|
|
9
13
|
type UnknownRecord = Record<string, unknown>;
|
|
10
14
|
type RpcMessage = { id?: number; method: string; params?: UnknownRecord };
|
|
11
15
|
type CliResponses = { rateLimits: unknown; account: unknown };
|
|
12
16
|
type CodexRpc = (messages: RpcMessage[]) => Promise<CliResponses>;
|
|
13
17
|
|
|
14
|
-
export const CODEX_APP_SERVER_ARGS = [
|
|
18
|
+
export const CODEX_APP_SERVER_ARGS = ["-s", "read-only", "-a", "untrusted", "app-server"] as const;
|
|
15
19
|
|
|
16
20
|
type CodexProbeOptions = {
|
|
17
21
|
installed: boolean;
|
|
@@ -25,23 +29,24 @@ type CodexProbeOptions = {
|
|
|
25
29
|
};
|
|
26
30
|
|
|
27
31
|
function record(value: unknown): UnknownRecord | null {
|
|
28
|
-
return value !== null && typeof value ===
|
|
29
|
-
? value as UnknownRecord
|
|
32
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
33
|
+
? (value as UnknownRecord)
|
|
30
34
|
: null;
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
function finiteNumber(value: unknown): number | null {
|
|
34
|
-
return typeof value ===
|
|
38
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
function nonEmptyText(value: unknown): string | null {
|
|
38
|
-
return typeof value ===
|
|
42
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
function resetTime(value: unknown): string | null {
|
|
42
46
|
const seconds = finiteNumber(value);
|
|
43
47
|
if (seconds !== null) return new Date(seconds * 1000).toISOString();
|
|
44
|
-
if (typeof value ===
|
|
48
|
+
if (typeof value === "string" && !Number.isNaN(Date.parse(value)))
|
|
49
|
+
return new Date(value).toISOString();
|
|
45
50
|
return null;
|
|
46
51
|
}
|
|
47
52
|
|
|
@@ -53,15 +58,11 @@ function safeIdentifier(value: unknown): string | null {
|
|
|
53
58
|
}
|
|
54
59
|
|
|
55
60
|
export function resolveCodexAuthPath(env: NodeJS.ProcessEnv = process.env): string {
|
|
56
|
-
const root = env.CODEX_HOME || join(env.HOME ||
|
|
57
|
-
return join(root,
|
|
61
|
+
const root = env.CODEX_HOME || join(env.HOME || "", ".codex");
|
|
62
|
+
return join(root, "auth.json");
|
|
58
63
|
}
|
|
59
64
|
|
|
60
|
-
export function toRateWindow(
|
|
61
|
-
value: unknown,
|
|
62
|
-
id: string,
|
|
63
|
-
label: string
|
|
64
|
-
): CapacityWindow | null {
|
|
65
|
+
export function toRateWindow(value: unknown, id: string, label: string): CapacityWindow | null {
|
|
65
66
|
const input = record(value);
|
|
66
67
|
if (!input) return null;
|
|
67
68
|
const used = finiteNumber(input.used_percent);
|
|
@@ -71,7 +72,7 @@ export function toRateWindow(
|
|
|
71
72
|
label,
|
|
72
73
|
durationMinutes: seconds === null ? null : seconds / 60,
|
|
73
74
|
usedPercent: used,
|
|
74
|
-
resetsAt: resetTime(input.reset_at)
|
|
75
|
+
resetsAt: resetTime(input.reset_at),
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
|
|
@@ -84,23 +85,23 @@ function extraWindows(value: unknown): CapacityWindow[] {
|
|
|
84
85
|
const windows = record(limit.rate_limit) ?? limit;
|
|
85
86
|
return [
|
|
86
87
|
toRateWindow(windows.primary_window, `${scope}:primary`, `${scope} primary`),
|
|
87
|
-
toRateWindow(windows.secondary_window, `${scope}:secondary`, `${scope} secondary`)
|
|
88
|
+
toRateWindow(windows.secondary_window, `${scope}:secondary`, `${scope} secondary`),
|
|
88
89
|
].filter((window): window is CapacityWindow => window !== null);
|
|
89
90
|
});
|
|
90
91
|
}
|
|
91
92
|
|
|
92
|
-
export function parseUsage(raw: unknown, source:
|
|
93
|
+
export function parseUsage(raw: unknown, source: "pat" | "oauth"): UsageSnapshot {
|
|
93
94
|
const response = record(raw) ?? {};
|
|
94
95
|
const limits = record(response.rate_limit) ?? {};
|
|
95
96
|
const credits = record(response.credits) ?? {};
|
|
96
97
|
return {
|
|
97
98
|
windows: [
|
|
98
|
-
toRateWindow(limits.primary_window,
|
|
99
|
-
toRateWindow(limits.secondary_window,
|
|
100
|
-
...extraWindows(response.additional_rate_limits)
|
|
99
|
+
toRateWindow(limits.primary_window, "session", "Session"),
|
|
100
|
+
toRateWindow(limits.secondary_window, "weekly", "Weekly"),
|
|
101
|
+
...extraWindows(response.additional_rate_limits),
|
|
101
102
|
].filter((window): window is CapacityWindow => window !== null),
|
|
102
103
|
creditsRemaining: finiteNumber(credits.balance),
|
|
103
|
-
source
|
|
104
|
+
source,
|
|
104
105
|
};
|
|
105
106
|
}
|
|
106
107
|
|
|
@@ -112,52 +113,58 @@ function cliWindow(value: unknown, id: string, label: string): CapacityWindow |
|
|
|
112
113
|
label,
|
|
113
114
|
durationMinutes: finiteNumber(input.windowDurationMins),
|
|
114
115
|
usedPercent: finiteNumber(input.usedPercent),
|
|
115
|
-
resetsAt: resetTime(input.resetsAt)
|
|
116
|
+
resetsAt: resetTime(input.resetsAt),
|
|
116
117
|
};
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
function cliSnapshotWindows(value: unknown, fallbackId: string): CapacityWindow[] {
|
|
120
121
|
const snapshot = record(value);
|
|
121
122
|
if (!snapshot) return [];
|
|
122
|
-
const scope = safeIdentifier(snapshot.limitId) ?? safeIdentifier(fallbackId) ??
|
|
123
|
+
const scope = safeIdentifier(snapshot.limitId) ?? safeIdentifier(fallbackId) ?? "codex";
|
|
123
124
|
return [
|
|
124
125
|
cliWindow(snapshot.primary, `${scope}:primary`, `${scope} primary`),
|
|
125
|
-
cliWindow(snapshot.secondary, `${scope}:secondary`, `${scope} secondary`)
|
|
126
|
+
cliWindow(snapshot.secondary, `${scope}:secondary`, `${scope} secondary`),
|
|
126
127
|
].filter((item): item is CapacityWindow => item !== null);
|
|
127
128
|
}
|
|
128
129
|
|
|
129
130
|
export function parseCliUsage(raw: unknown): UsageSnapshot {
|
|
130
131
|
const response = record(raw) ?? {};
|
|
131
132
|
const primary = record(response.rateLimits);
|
|
132
|
-
const windows = primary ? cliSnapshotWindows(primary,
|
|
133
|
+
const windows = primary ? cliSnapshotWindows(primary, "codex") : [];
|
|
133
134
|
const buckets = record(response.rateLimitsByLimitId);
|
|
134
135
|
if (buckets) {
|
|
135
|
-
for (const [id, snapshot] of Object.entries(buckets))
|
|
136
|
+
for (const [id, snapshot] of Object.entries(buckets))
|
|
137
|
+
windows.push(...cliSnapshotWindows(snapshot, id));
|
|
136
138
|
}
|
|
137
|
-
const unique = [...new Map(windows.map(window => [window.id, window])).values()];
|
|
138
|
-
return { windows: unique, creditsRemaining: null, source:
|
|
139
|
+
const unique = [...new Map(windows.map((window) => [window.id, window])).values()];
|
|
140
|
+
return { windows: unique, creditsRemaining: null, source: "cli" };
|
|
139
141
|
}
|
|
140
142
|
|
|
141
|
-
function capacityFromSnapshot(
|
|
142
|
-
|
|
143
|
+
function capacityFromSnapshot(
|
|
144
|
+
snapshot: UsageSnapshot,
|
|
145
|
+
context: CodexProbeOptions,
|
|
146
|
+
raw?: unknown,
|
|
147
|
+
): CapacityReport {
|
|
148
|
+
const hasUsage = snapshot.windows.some((window) => window.usedPercent !== null);
|
|
143
149
|
const rateLimits = record(record(raw)?.rateLimits);
|
|
144
150
|
const reached = nonEmptyText(rateLimits?.rateLimitReachedType);
|
|
145
|
-
const resetCredits =
|
|
151
|
+
const resetCredits =
|
|
152
|
+
record(record(raw)?.rateLimitResetCredits) ?? record(record(raw)?.usageLimitResetCredits);
|
|
146
153
|
return {
|
|
147
|
-
provider:
|
|
154
|
+
provider: "codex",
|
|
148
155
|
generatedAt: context.checkedAt,
|
|
149
156
|
authenticated: true,
|
|
150
|
-
available: reached ?
|
|
157
|
+
available: reached ? "no" : hasUsage ? "yes" : "unknown",
|
|
151
158
|
windows: snapshot.windows,
|
|
152
|
-
creditsRemaining: snapshot.creditsRemaining ?? finiteNumber(resetCredits?.availableCount)
|
|
159
|
+
creditsRemaining: snapshot.creditsRemaining ?? finiteNumber(resetCredits?.availableCount),
|
|
153
160
|
};
|
|
154
161
|
}
|
|
155
162
|
|
|
156
163
|
function jwtExpiry(token: string): number | null {
|
|
157
|
-
const part = token.split(
|
|
164
|
+
const part = token.split(".")[1];
|
|
158
165
|
if (!part) return null;
|
|
159
166
|
try {
|
|
160
|
-
return finiteNumber(record(JSON.parse(Buffer.from(part,
|
|
167
|
+
return finiteNumber(record(JSON.parse(Buffer.from(part, "base64url").toString("utf8")))?.exp);
|
|
161
168
|
} catch {
|
|
162
169
|
return null;
|
|
163
170
|
}
|
|
@@ -166,7 +173,7 @@ function jwtExpiry(token: string): number | null {
|
|
|
166
173
|
function staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {
|
|
167
174
|
const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;
|
|
168
175
|
let expiry: number | null = finiteNumber(metadata);
|
|
169
|
-
if (typeof metadata ===
|
|
176
|
+
if (typeof metadata === "string") {
|
|
170
177
|
const parsed = Date.parse(metadata);
|
|
171
178
|
expiry = Number.isNaN(parsed) ? null : parsed / 1000;
|
|
172
179
|
}
|
|
@@ -174,12 +181,17 @@ function staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {
|
|
|
174
181
|
return expiry !== null && expiry <= now.getTime() / 1000;
|
|
175
182
|
}
|
|
176
183
|
|
|
177
|
-
async function fetchJson(
|
|
184
|
+
async function fetchJson(
|
|
185
|
+
fetcher: typeof globalThis.fetch,
|
|
186
|
+
url: string,
|
|
187
|
+
init: RequestInit,
|
|
188
|
+
timeoutMs: number,
|
|
189
|
+
): Promise<unknown> {
|
|
178
190
|
const controller = new AbortController();
|
|
179
191
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
180
192
|
try {
|
|
181
193
|
const response = await fetcher(url, { ...init, signal: controller.signal });
|
|
182
|
-
if (!response.ok) throw new Error(response.status === 401 ?
|
|
194
|
+
if (!response.ok) throw new Error(response.status === 401 ? "unauthorized" : "request failed");
|
|
183
195
|
return await response.json();
|
|
184
196
|
} finally {
|
|
185
197
|
clearTimeout(timer);
|
|
@@ -189,23 +201,28 @@ async function fetchJson(fetcher: typeof globalThis.fetch, url: string, init: Re
|
|
|
189
201
|
async function apiSnapshot(
|
|
190
202
|
token: string,
|
|
191
203
|
accountId: string,
|
|
192
|
-
source:
|
|
193
|
-
options: CodexProbeOptions
|
|
204
|
+
source: "pat" | "oauth",
|
|
205
|
+
options: CodexProbeOptions,
|
|
194
206
|
): Promise<UsageSnapshot> {
|
|
195
207
|
const fetcher = options.fetch ?? globalThis.fetch;
|
|
196
|
-
const raw = await fetchJson(
|
|
197
|
-
|
|
198
|
-
|
|
208
|
+
const raw = await fetchJson(
|
|
209
|
+
fetcher,
|
|
210
|
+
"https://chatgpt.com/backend-api/wham/usage",
|
|
211
|
+
{
|
|
212
|
+
headers: { Authorization: `Bearer ${token}`, "ChatGPT-Account-Id": accountId },
|
|
213
|
+
},
|
|
214
|
+
options.timeoutMs ?? 5000,
|
|
215
|
+
);
|
|
199
216
|
return parseUsage(raw, source);
|
|
200
217
|
}
|
|
201
218
|
|
|
202
219
|
function appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResponses> {
|
|
203
220
|
return new Promise((resolve, reject) => {
|
|
204
|
-
const child = spawn(
|
|
205
|
-
stdio: [
|
|
221
|
+
const child = spawn("codex", CODEX_APP_SERVER_ARGS, {
|
|
222
|
+
stdio: ["pipe", "pipe", "ignore"],
|
|
206
223
|
});
|
|
207
224
|
const results: Partial<CliResponses> = {};
|
|
208
|
-
let buffer =
|
|
225
|
+
let buffer = "";
|
|
209
226
|
let settled = false;
|
|
210
227
|
const finish = (error?: Error) => {
|
|
211
228
|
if (settled) return;
|
|
@@ -215,30 +232,37 @@ function appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResp
|
|
|
215
232
|
if (error) reject(error);
|
|
216
233
|
else resolve(results as CliResponses);
|
|
217
234
|
};
|
|
218
|
-
const timer = setTimeout(() => finish(new Error(
|
|
219
|
-
child.once(
|
|
220
|
-
child.once(
|
|
221
|
-
|
|
222
|
-
|
|
235
|
+
const timer = setTimeout(() => finish(new Error("codex probe timed out")), timeoutMs);
|
|
236
|
+
child.once("error", () => finish(new Error("codex app-server unavailable")));
|
|
237
|
+
child.once("exit", () => {
|
|
238
|
+
if (!settled) finish(new Error("codex app-server exited"));
|
|
239
|
+
});
|
|
240
|
+
child.stdout.setEncoding("utf8");
|
|
241
|
+
child.stdout.on("data", (chunk: string) => {
|
|
223
242
|
buffer += chunk;
|
|
224
243
|
for (;;) {
|
|
225
|
-
const newline = buffer.indexOf(
|
|
244
|
+
const newline = buffer.indexOf("\n");
|
|
226
245
|
if (newline < 0) break;
|
|
227
246
|
const line = buffer.slice(0, newline).trim();
|
|
228
247
|
buffer = buffer.slice(newline + 1);
|
|
229
248
|
if (!line) continue;
|
|
230
249
|
let message: UnknownRecord;
|
|
231
|
-
try {
|
|
250
|
+
try {
|
|
251
|
+
message = JSON.parse(line) as UnknownRecord;
|
|
252
|
+
} catch {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
232
255
|
if (message.id === 1) {
|
|
233
|
-
for (const request of messages.slice(1))
|
|
256
|
+
for (const request of messages.slice(1))
|
|
257
|
+
child.stdin.write(`${JSON.stringify(request)}\n`);
|
|
234
258
|
} else if (message.id === 2) {
|
|
235
|
-
if (message.error) finish(new Error(
|
|
259
|
+
if (message.error) finish(new Error("codex rate-limit method failed"));
|
|
236
260
|
else results.rateLimits = message.result;
|
|
237
261
|
} else if (message.id === 3) {
|
|
238
|
-
if (message.error) finish(new Error(
|
|
262
|
+
if (message.error) finish(new Error("codex account method failed"));
|
|
239
263
|
else results.account = message.result;
|
|
240
264
|
}
|
|
241
|
-
if (
|
|
265
|
+
if ("rateLimits" in results && "account" in results) finish();
|
|
242
266
|
}
|
|
243
267
|
});
|
|
244
268
|
child.stdin.write(`${JSON.stringify(messages[0])}\n`);
|
|
@@ -247,33 +271,46 @@ function appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResp
|
|
|
247
271
|
|
|
248
272
|
function unavailable(options: CodexProbeOptions): CapacityReport {
|
|
249
273
|
return {
|
|
250
|
-
provider:
|
|
274
|
+
provider: "codex",
|
|
251
275
|
generatedAt: options.checkedAt,
|
|
252
276
|
authenticated: null,
|
|
253
|
-
available:
|
|
277
|
+
available: "unknown",
|
|
254
278
|
windows: [],
|
|
255
|
-
creditsRemaining: null
|
|
279
|
+
creditsRemaining: null,
|
|
256
280
|
};
|
|
257
281
|
}
|
|
258
282
|
|
|
259
283
|
async function cliFallback(options: CodexProbeOptions): Promise<CapacityReport> {
|
|
260
284
|
if (!options.installed) return unavailable(options);
|
|
261
285
|
const messages: RpcMessage[] = [
|
|
262
|
-
{
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
286
|
+
{
|
|
287
|
+
id: 1,
|
|
288
|
+
method: "initialize",
|
|
289
|
+
params: {
|
|
290
|
+
clientInfo: { name: "ai-devkit", title: null, version: "1" },
|
|
291
|
+
capabilities: null,
|
|
292
|
+
},
|
|
293
|
+
},
|
|
294
|
+
{ method: "initialized" },
|
|
295
|
+
{ id: 2, method: "account/rateLimits/read" },
|
|
296
|
+
{ id: 3, method: "account/read" },
|
|
268
297
|
];
|
|
269
298
|
try {
|
|
270
|
-
const rpc = options.rpc ?? (requests => appServerRpc(requests, options.timeoutMs));
|
|
299
|
+
const rpc = options.rpc ?? ((requests) => appServerRpc(requests, options.timeoutMs));
|
|
271
300
|
const response = await rpc(messages);
|
|
272
|
-
const result = capacityFromSnapshot(
|
|
301
|
+
const result = capacityFromSnapshot(
|
|
302
|
+
parseCliUsage(response.rateLimits),
|
|
303
|
+
options,
|
|
304
|
+
response.rateLimits,
|
|
305
|
+
);
|
|
273
306
|
const accountEnvelope = record(response.account);
|
|
274
|
-
if (
|
|
307
|
+
if (
|
|
308
|
+
accountEnvelope &&
|
|
309
|
+
Object.hasOwn(accountEnvelope, "account") &&
|
|
310
|
+
!record(accountEnvelope.account)
|
|
311
|
+
) {
|
|
275
312
|
result.authenticated = false;
|
|
276
|
-
result.available =
|
|
313
|
+
result.available = "unknown";
|
|
277
314
|
}
|
|
278
315
|
return result;
|
|
279
316
|
} catch {
|
|
@@ -284,7 +321,10 @@ async function cliFallback(options: CodexProbeOptions): Promise<CapacityReport>
|
|
|
284
321
|
export async function probeCodexCapacity(options: CodexProbeOptions): Promise<CapacityReport> {
|
|
285
322
|
let parsed: UnknownRecord | null = null;
|
|
286
323
|
try {
|
|
287
|
-
const contents = await (options.readFile ?? readFile)(
|
|
324
|
+
const contents = await (options.readFile ?? readFile)(
|
|
325
|
+
resolveCodexAuthPath(options.env),
|
|
326
|
+
"utf8",
|
|
327
|
+
);
|
|
288
328
|
parsed = record(JSON.parse(contents));
|
|
289
329
|
} catch {
|
|
290
330
|
return cliFallback(options);
|
|
@@ -295,12 +335,17 @@ export async function probeCodexCapacity(options: CodexProbeOptions): Promise<Ca
|
|
|
295
335
|
if (pat) {
|
|
296
336
|
try {
|
|
297
337
|
const fetcher = options.fetch ?? globalThis.fetch;
|
|
298
|
-
const whoami = record(
|
|
299
|
-
|
|
300
|
-
|
|
338
|
+
const whoami = record(
|
|
339
|
+
await fetchJson(
|
|
340
|
+
fetcher,
|
|
341
|
+
"https://auth.openai.com/api/accounts/v1/user-auth-credential/whoami",
|
|
342
|
+
{ headers: { Authorization: `Bearer ${pat}` } },
|
|
343
|
+
options.timeoutMs ?? 5000,
|
|
344
|
+
),
|
|
345
|
+
);
|
|
301
346
|
const accountId = nonEmptyText(whoami?.chatgpt_account_id);
|
|
302
|
-
if (!accountId) throw new Error(
|
|
303
|
-
return capacityFromSnapshot(await apiSnapshot(pat, accountId,
|
|
347
|
+
if (!accountId) throw new Error("account unavailable");
|
|
348
|
+
return capacityFromSnapshot(await apiSnapshot(pat, accountId, "pat", options), options);
|
|
304
349
|
} catch {
|
|
305
350
|
// Continue to a separately available OAuth credential before using the CLI.
|
|
306
351
|
}
|
|
@@ -309,9 +354,17 @@ export async function probeCodexCapacity(options: CodexProbeOptions): Promise<Ca
|
|
|
309
354
|
const tokens = record(auth.tokens);
|
|
310
355
|
const accessToken = nonEmptyText(tokens?.access_token);
|
|
311
356
|
const accountId = nonEmptyText(tokens?.account_id);
|
|
312
|
-
if (
|
|
357
|
+
if (
|
|
358
|
+
tokens &&
|
|
359
|
+
accessToken &&
|
|
360
|
+
accountId &&
|
|
361
|
+
!staleOAuth(tokens, accessToken, (options.now ?? (() => new Date()))())
|
|
362
|
+
) {
|
|
313
363
|
try {
|
|
314
|
-
return capacityFromSnapshot(
|
|
364
|
+
return capacityFromSnapshot(
|
|
365
|
+
await apiSnapshot(accessToken, accountId, "oauth", options),
|
|
366
|
+
options,
|
|
367
|
+
);
|
|
315
368
|
} catch {
|
|
316
369
|
return cliFallback(options);
|
|
317
370
|
}
|
package/src/capacity/index.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { constants } from
|
|
2
|
-
import { access as fsAccess } from
|
|
3
|
-
import path from
|
|
4
|
-
import { probeCodexCapacity } from
|
|
5
|
-
import type { CapacityReport } from
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access as fsAccess } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { probeCodexCapacity } from "./codex.js";
|
|
5
|
+
import type { CapacityReport } from "./types.js";
|
|
6
6
|
|
|
7
|
-
export type { CapacityReport, CapacityWindow } from
|
|
7
|
+
export type { CapacityReport, CapacityWindow } from "./types.js";
|
|
8
8
|
|
|
9
9
|
export type CapacityProbeOptions = {
|
|
10
10
|
now?: () => Date;
|
|
@@ -22,10 +22,13 @@ async function canAccess(target: string, mode: number): Promise<boolean> {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
async function isCodexInstalled(
|
|
25
|
+
async function isCodexInstalled(
|
|
26
|
+
pathValue: string,
|
|
27
|
+
checkAccess?: (target: string) => Promise<void>,
|
|
28
|
+
): Promise<boolean> {
|
|
26
29
|
const directories = pathValue.split(path.delimiter).filter(Boolean);
|
|
27
30
|
for (const directory of directories) {
|
|
28
|
-
const executable = path.join(directory,
|
|
31
|
+
const executable = path.join(directory, "codex");
|
|
29
32
|
if (checkAccess) {
|
|
30
33
|
try {
|
|
31
34
|
await checkAccess(executable);
|
|
@@ -39,19 +42,21 @@ async function isCodexInstalled(pathValue: string, checkAccess?: (target: string
|
|
|
39
42
|
return false;
|
|
40
43
|
}
|
|
41
44
|
|
|
42
|
-
export async function getCodexCapacityReport(
|
|
45
|
+
export async function getCodexCapacityReport(
|
|
46
|
+
options: CapacityProbeOptions = {},
|
|
47
|
+
): Promise<CapacityReport> {
|
|
43
48
|
const generatedAt = (options.now?.() ?? new Date()).toISOString();
|
|
44
|
-
const installed = await isCodexInstalled(options.path ?? process.env.PATH ??
|
|
49
|
+
const installed = await isCodexInstalled(options.path ?? process.env.PATH ?? "", options.access);
|
|
45
50
|
try {
|
|
46
51
|
return await (options.probe ?? probeCodexCapacity)({ installed, checkedAt: generatedAt });
|
|
47
52
|
} catch {
|
|
48
53
|
return {
|
|
49
|
-
provider:
|
|
54
|
+
provider: "codex",
|
|
50
55
|
generatedAt,
|
|
51
56
|
authenticated: null,
|
|
52
|
-
available:
|
|
57
|
+
available: "unknown",
|
|
53
58
|
windows: [],
|
|
54
|
-
creditsRemaining: null
|
|
59
|
+
creditsRemaining: null,
|
|
55
60
|
};
|
|
56
61
|
}
|
|
57
62
|
}
|
package/src/capacity/types.ts
CHANGED
|
@@ -1,91 +1,96 @@
|
|
|
1
|
-
import Database from
|
|
2
|
-
import { existsSync, mkdirSync } from
|
|
3
|
-
import { dirname, join } from
|
|
4
|
-
import { homedir } from
|
|
5
|
-
import { initializeSchema } from
|
|
1
|
+
import Database from "better-sqlite3";
|
|
2
|
+
import { existsSync, mkdirSync } from "fs";
|
|
3
|
+
import { dirname, join } from "path";
|
|
4
|
+
import { homedir } from "os";
|
|
5
|
+
import { initializeSchema } from "./schema.js";
|
|
6
6
|
|
|
7
|
-
export const DEFAULT_AGENT_REGISTRY_DB_PATH = join(homedir(),
|
|
7
|
+
export const DEFAULT_AGENT_REGISTRY_DB_PATH = join(homedir(), ".ai-devkit", "agents.db");
|
|
8
8
|
|
|
9
9
|
export interface DatabaseOptions {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
dbPath?: string;
|
|
11
|
+
verbose?: boolean | ((message: string) => void);
|
|
12
|
+
readonly?: boolean;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export function resolveAgentRegistryDbPath(filePath?: string): string {
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
if (!filePath) return DEFAULT_AGENT_REGISTRY_DB_PATH;
|
|
17
|
+
return filePath.endsWith(".json") ? filePath.replace(/\.json$/, ".db") : filePath;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export class DatabaseConnection {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
private db: Database.Database;
|
|
22
|
+
private readonly dbPath: string;
|
|
23
|
+
private readonly readonly: boolean;
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
25
|
+
constructor(options: DatabaseOptions = {}) {
|
|
26
|
+
this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;
|
|
27
|
+
this.readonly = options.readonly ?? false;
|
|
28
|
+
if (this.readonly && !existsSync(this.dbPath)) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
`Cannot open readonly agent database because it does not exist: ${this.dbPath}`,
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
if (!this.readonly) mkdirSync(dirname(this.dbPath), { recursive: true });
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
this.db = new Database(this.dbPath, {
|
|
36
|
+
readonly: this.readonly,
|
|
37
|
+
timeout: 5000,
|
|
38
|
+
verbose:
|
|
39
|
+
typeof options.verbose === "function"
|
|
40
|
+
? options.verbose
|
|
41
|
+
: options.verbose
|
|
42
|
+
? console.log
|
|
43
|
+
: undefined,
|
|
44
|
+
});
|
|
40
45
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
46
|
+
if (this.readonly) {
|
|
47
|
+
const version = this.db.pragma("user_version", { simple: true }) as number;
|
|
48
|
+
if (version < 3) {
|
|
49
|
+
this.db.close();
|
|
50
|
+
throw new Error(`Readonly agent database requires schema version 3 (found ${version}).`);
|
|
51
|
+
}
|
|
52
|
+
} else {
|
|
53
|
+
this.configure();
|
|
54
|
+
initializeSchema(this);
|
|
51
55
|
}
|
|
56
|
+
}
|
|
52
57
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
private configure(): void {
|
|
59
|
+
const journalMode = this.db.pragma("journal_mode", { simple: true }) as string;
|
|
60
|
+
if (journalMode.toLowerCase() !== "wal") this.db.pragma("journal_mode = WAL");
|
|
61
|
+
this.db.pragma("foreign_keys = ON");
|
|
62
|
+
this.db.pragma("synchronous = NORMAL");
|
|
63
|
+
this.db.pragma("busy_timeout = 5000");
|
|
64
|
+
this.db.pragma("mmap_size = 268435456");
|
|
65
|
+
}
|
|
61
66
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
get instance(): Database.Database {
|
|
68
|
+
return this.db;
|
|
69
|
+
}
|
|
65
70
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
get path(): string {
|
|
72
|
+
return this.dbPath;
|
|
73
|
+
}
|
|
69
74
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
query<T>(sql: string, params: unknown[] = []): T[] {
|
|
76
|
+
return this.db.prepare(sql).all(...params) as T[];
|
|
77
|
+
}
|
|
73
78
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
queryOne<T>(sql: string, params: unknown[] = []): T | undefined {
|
|
80
|
+
return this.db.prepare(sql).get(...params) as T | undefined;
|
|
81
|
+
}
|
|
77
82
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
execute(sql: string, params: unknown[] = []): Database.RunResult {
|
|
84
|
+
return this.db.prepare(sql).run(...params);
|
|
85
|
+
}
|
|
81
86
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
87
|
+
transaction<T>(fn: () => T): T {
|
|
88
|
+
return this.db.transaction(fn)();
|
|
89
|
+
}
|
|
85
90
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
91
|
+
close(): void {
|
|
92
|
+
if (this.db.open) {
|
|
93
|
+
this.db.close();
|
|
90
94
|
}
|
|
95
|
+
}
|
|
91
96
|
}
|