@ai-devkit/agent-manager 0.37.0 → 0.39.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 +0 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +2 -2
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/capacity/anthropic.test.js +115 -0
- package/dist/__tests__/capacity/anthropic.test.js.map +1 -0
- package/dist/__tests__/capacity/boundaries.test.js +45 -0
- package/dist/__tests__/capacity/boundaries.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +3 -3
- package/dist/__tests__/capacity/claude.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +3 -1
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/openai.test.js +21 -12
- package/dist/__tests__/capacity/openai.test.js.map +1 -1
- package/dist/__tests__/capacity/wham.test.js +1 -1
- package/dist/__tests__/capacity/wham.test.js.map +1 -1
- package/dist/__tests__/capacity/zai.test.js +7 -8
- package/dist/__tests__/capacity/zai.test.js.map +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js +2 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js +7 -15
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js +3 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js +11 -26
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js +3 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -1
- package/dist/__tests__/harnesses/devin/DevinAdapter.test.js +597 -0
- package/dist/__tests__/harnesses/devin/DevinAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/devin/DevinAgentMapper.test.js +91 -0
- package/dist/__tests__/harnesses/devin/DevinAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/devin/DevinSessionLocator.test.js +192 -0
- package/dist/__tests__/harnesses/devin/DevinSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/devin/DevinSessionParser.test.js +407 -0
- package/dist/__tests__/harnesses/devin/DevinSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/devin/fixtures.js +95 -0
- package/dist/__tests__/harnesses/devin/fixtures.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js +5 -11
- package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js +9 -19
- package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js +3 -7
- package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{readiness → harnesses/readiness}/AgentReadiness.test.js +95 -11
- package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/__tests__/harnesses/runtimeProfiles.test.js +89 -0
- package/dist/__tests__/harnesses/runtimeProfiles.test.js.map +1 -0
- package/dist/__tests__/print/DurableAgent.test.js +4 -6
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +1 -12
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/terminal/GhosttyBackend.test.js +334 -0
- package/dist/__tests__/terminal/GhosttyBackend.test.js.map +1 -0
- package/dist/__tests__/terminal/TmuxManager.test.js +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +1 -1
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +2 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/index.d.ts +9 -19
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +11 -4
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/providers/anthropic.d.ts +9 -0
- package/dist/capacity/providers/anthropic.d.ts.map +1 -0
- package/dist/capacity/{claude.js → providers/anthropic.js} +10 -128
- package/dist/capacity/providers/anthropic.js.map +1 -0
- package/dist/capacity/providers/openai-platform.d.ts +14 -0
- package/dist/capacity/providers/openai-platform.d.ts.map +1 -0
- package/dist/capacity/providers/openai-platform.js +120 -0
- package/dist/capacity/providers/openai-platform.js.map +1 -0
- package/dist/capacity/providers/openai-subscription.d.ts +20 -0
- package/dist/capacity/providers/openai-subscription.d.ts.map +1 -0
- package/dist/capacity/providers/openai-subscription.js +129 -0
- package/dist/capacity/providers/openai-subscription.js.map +1 -0
- package/dist/capacity/providers/zai.d.ts +8 -0
- package/dist/capacity/providers/zai.d.ts.map +1 -0
- package/dist/capacity/{zai.js → providers/zai.js} +17 -62
- package/dist/capacity/providers/zai.js.map +1 -0
- package/dist/capacity/sources/claude.d.ts +9 -0
- package/dist/capacity/sources/claude.d.ts.map +1 -0
- package/dist/capacity/sources/claude.js +17 -0
- package/dist/capacity/sources/claude.js.map +1 -0
- package/dist/capacity/{codex.d.ts → sources/codex.d.ts} +5 -9
- package/dist/capacity/sources/codex.d.ts.map +1 -0
- package/dist/capacity/{codex.js → sources/codex.js} +31 -84
- package/dist/capacity/sources/codex.js.map +1 -0
- package/dist/capacity/sources/pi.d.ts +30 -0
- package/dist/capacity/sources/pi.d.ts.map +1 -0
- package/dist/capacity/sources/pi.js +81 -0
- package/dist/capacity/sources/pi.js.map +1 -0
- package/dist/capacity/types.d.ts +2 -0
- package/dist/capacity/types.d.ts.map +1 -1
- package/dist/capacity/types.js +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/harnesses/claude/credentials.d.ts +10 -0
- package/dist/harnesses/claude/credentials.d.ts.map +1 -0
- package/dist/harnesses/claude/credentials.js +112 -0
- package/dist/harnesses/claude/credentials.js.map +1 -0
- package/dist/harnesses/claude/readiness.d.ts +3 -0
- package/dist/harnesses/claude/readiness.d.ts.map +1 -0
- package/dist/harnesses/claude/readiness.js +63 -0
- package/dist/harnesses/claude/readiness.js.map +1 -0
- package/dist/harnesses/codex/credentials.d.ts +15 -0
- package/dist/harnesses/codex/credentials.d.ts.map +1 -0
- package/dist/harnesses/codex/credentials.js +58 -0
- package/dist/harnesses/codex/credentials.js.map +1 -0
- package/dist/harnesses/codex/readiness.d.ts +3 -0
- package/dist/harnesses/codex/readiness.d.ts.map +1 -0
- package/dist/harnesses/codex/readiness.js +60 -0
- package/dist/harnesses/codex/readiness.js.map +1 -0
- package/dist/harnesses/copilot/readiness.d.ts +3 -0
- package/dist/harnesses/copilot/readiness.d.ts.map +1 -0
- package/dist/harnesses/copilot/readiness.js +39 -0
- package/dist/harnesses/copilot/readiness.js.map +1 -0
- package/dist/harnesses/devin/DevinAdapter.d.ts +39 -0
- package/dist/harnesses/devin/DevinAdapter.d.ts.map +1 -0
- package/dist/harnesses/devin/DevinAdapter.js +177 -0
- package/dist/harnesses/devin/DevinAdapter.js.map +1 -0
- package/dist/harnesses/devin/DevinAgentMapper.d.ts +11 -0
- package/dist/harnesses/devin/DevinAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/devin/DevinAgentMapper.js +35 -0
- package/dist/harnesses/devin/DevinAgentMapper.js.map +1 -0
- package/dist/harnesses/devin/DevinSessionLocator.d.ts +46 -0
- package/dist/harnesses/devin/DevinSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/devin/DevinSessionLocator.js +176 -0
- package/dist/harnesses/devin/DevinSessionLocator.js.map +1 -0
- package/dist/harnesses/devin/DevinSessionParser.d.ts +29 -0
- package/dist/harnesses/devin/DevinSessionParser.d.ts.map +1 -0
- package/dist/harnesses/devin/DevinSessionParser.js +166 -0
- package/dist/harnesses/devin/DevinSessionParser.js.map +1 -0
- package/dist/harnesses/devin/readiness.d.ts +3 -0
- package/dist/harnesses/devin/readiness.d.ts.map +1 -0
- package/dist/harnesses/devin/readiness.js +39 -0
- package/dist/harnesses/devin/readiness.js.map +1 -0
- package/dist/harnesses/index.d.ts.map +1 -1
- package/dist/harnesses/index.js +3 -1
- package/dist/harnesses/index.js.map +1 -1
- package/dist/harnesses/opencode/readiness.d.ts +3 -0
- package/dist/harnesses/opencode/readiness.d.ts.map +1 -0
- package/dist/harnesses/opencode/readiness.js +50 -0
- package/dist/harnesses/opencode/readiness.js.map +1 -0
- package/dist/harnesses/pi/credentials.d.ts +22 -0
- package/dist/harnesses/pi/credentials.d.ts.map +1 -0
- package/dist/harnesses/pi/credentials.js +98 -0
- package/dist/harnesses/pi/credentials.js.map +1 -0
- package/dist/harnesses/pi/readiness.d.ts +3 -0
- package/dist/harnesses/pi/readiness.d.ts.map +1 -0
- package/dist/harnesses/pi/readiness.js +96 -0
- package/dist/harnesses/pi/readiness.js.map +1 -0
- package/dist/harnesses/readiness/AgentReadiness.d.ts +6 -0
- package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/harnesses/readiness/AgentReadiness.js +70 -0
- package/dist/harnesses/readiness/AgentReadiness.js.map +1 -0
- package/dist/harnesses/readiness/checks.d.ts +31 -0
- package/dist/harnesses/readiness/checks.d.ts.map +1 -0
- package/dist/harnesses/readiness/checks.js +270 -0
- package/dist/harnesses/readiness/checks.js.map +1 -0
- package/dist/{readiness/AgentReadiness.d.ts → harnesses/readiness/types.d.ts} +19 -10
- package/dist/harnesses/readiness/types.d.ts.map +1 -0
- package/dist/harnesses/readiness/types.js +4 -0
- package/dist/harnesses/readiness/types.js.map +1 -0
- package/dist/harnesses/runtimeProfiles.d.ts +11 -0
- package/dist/harnesses/runtimeProfiles.d.ts.map +1 -0
- package/dist/harnesses/runtimeProfiles.js +100 -0
- package/dist/harnesses/runtimeProfiles.js.map +1 -0
- package/dist/index.d.ts +16 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -23
- package/dist/index.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +3 -3
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +6 -20
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +2 -43
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/runtime/tmux/PidPolling.d.ts +1 -1
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -1
- package/dist/runtime/tmux/PidPolling.js.map +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.js +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -1
- package/dist/runtime/tmux/TmuxManager.d.ts +12 -0
- package/dist/runtime/tmux/TmuxManager.d.ts.map +1 -0
- package/dist/{terminal → runtime/tmux}/TmuxManager.js +9 -28
- package/dist/runtime/tmux/TmuxManager.js.map +1 -0
- package/dist/runtime/types.d.ts +1 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/terminal/TerminalFocusManager.d.ts +4 -32
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +17 -267
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -44
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +12 -347
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/backends/ghostty.d.ts +3 -0
- package/dist/terminal/backends/ghostty.d.ts.map +1 -0
- package/dist/terminal/backends/ghostty.js +161 -0
- package/dist/terminal/backends/ghostty.js.map +1 -0
- package/dist/terminal/backends/index.d.ts +5 -0
- package/dist/terminal/backends/index.d.ts.map +1 -0
- package/dist/terminal/backends/index.js +21 -0
- package/dist/terminal/backends/index.js.map +1 -0
- package/dist/terminal/backends/iterm2.d.ts +3 -0
- package/dist/terminal/backends/iterm2.d.ts.map +1 -0
- package/dist/terminal/backends/iterm2.js +135 -0
- package/dist/terminal/backends/iterm2.js.map +1 -0
- package/dist/terminal/backends/shared.d.ts +9 -0
- package/dist/terminal/backends/shared.d.ts.map +1 -0
- package/dist/terminal/backends/shared.js +38 -0
- package/dist/terminal/backends/shared.js.map +1 -0
- package/dist/terminal/backends/terminal-app.d.ts +3 -0
- package/dist/terminal/backends/terminal-app.d.ts.map +1 -0
- package/dist/terminal/backends/terminal-app.js +129 -0
- package/dist/terminal/backends/terminal-app.js.map +1 -0
- package/dist/terminal/backends/tmux.d.ts +3 -0
- package/dist/terminal/backends/tmux.d.ts.map +1 -0
- package/dist/terminal/backends/tmux.js +76 -0
- package/dist/terminal/backends/tmux.js.map +1 -0
- package/dist/terminal/backends/wezterm.d.ts +3 -0
- package/dist/terminal/backends/wezterm.d.ts.map +1 -0
- package/dist/terminal/backends/wezterm.js +71 -0
- package/dist/terminal/backends/wezterm.js.map +1 -0
- package/dist/terminal/types.d.ts +22 -0
- package/dist/terminal/types.d.ts.map +1 -0
- package/dist/terminal/types.js +11 -0
- package/dist/terminal/types.js.map +1 -0
- package/dist/utils/process.d.ts +2 -0
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +3 -0
- package/dist/utils/process.js.map +1 -1
- package/package.json +1 -1
- package/src/AgentManager.ts +1 -1
- package/src/__tests__/capacity/anthropic.test.ts +105 -0
- package/src/__tests__/capacity/boundaries.test.ts +36 -0
- package/src/__tests__/capacity/claude.test.ts +3 -8
- package/src/__tests__/capacity/codex.test.ts +12 -35
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +1 -1
- package/src/__tests__/capacity/openai.test.ts +15 -15
- package/src/__tests__/capacity/wham.test.ts +1 -1
- package/src/__tests__/capacity/zai.test.ts +27 -62
- package/src/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.ts +2 -2
- package/src/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.ts +1 -1
- package/src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts +14 -19
- package/src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts +3 -3
- package/src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts +24 -30
- package/src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts +4 -8
- package/src/__tests__/harnesses/devin/DevinAdapter.test.ts +292 -0
- package/src/__tests__/harnesses/devin/DevinAgentMapper.test.ts +88 -0
- package/src/__tests__/harnesses/devin/DevinSessionLocator.test.ts +139 -0
- package/src/__tests__/harnesses/devin/DevinSessionParser.test.ts +218 -0
- package/src/__tests__/harnesses/devin/fixtures.ts +144 -0
- package/src/__tests__/harnesses/pi/durable/PiCliProbe.test.ts +7 -11
- package/src/__tests__/harnesses/pi/durable/PiPrintAgentService.test.ts +19 -22
- package/src/__tests__/harnesses/pi/durable/PiPrintRunner.test.ts +7 -8
- package/src/__tests__/{readiness → harnesses/readiness}/AgentReadiness.test.ts +77 -9
- package/src/__tests__/harnesses/runtimeProfiles.test.ts +110 -0
- package/src/__tests__/print/DurableAgent.test.ts +4 -13
- package/src/__tests__/print/DurableAgentRepository.test.ts +1 -13
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +1 -1
- package/src/__tests__/terminal/GhosttyBackend.test.ts +271 -0
- package/src/__tests__/terminal/TmuxManager.test.ts +1 -1
- package/src/adapters/AgentAdapter.ts +1 -0
- package/src/capacity/index.ts +29 -23
- package/src/capacity/{claude.ts → providers/anthropic.ts} +16 -131
- package/src/capacity/providers/openai-platform.ts +150 -0
- package/src/capacity/{wham.ts → providers/openai-subscription.ts} +86 -8
- package/src/capacity/{zai.ts → providers/zai.ts} +29 -111
- package/src/capacity/sources/claude.ts +30 -0
- package/src/capacity/{codex.ts → sources/codex.ts} +54 -124
- package/src/capacity/sources/pi.ts +131 -0
- package/src/capacity/types.ts +3 -0
- package/src/harnesses/claude/credentials.ts +122 -0
- package/src/harnesses/claude/readiness.ts +69 -0
- package/src/harnesses/codex/credentials.ts +81 -0
- package/src/harnesses/codex/readiness.ts +72 -0
- package/src/harnesses/copilot/readiness.ts +33 -0
- package/src/harnesses/devin/DevinAdapter.ts +224 -0
- package/src/harnesses/devin/DevinAgentMapper.ts +43 -0
- package/src/harnesses/devin/DevinSessionLocator.ts +230 -0
- package/src/harnesses/devin/DevinSessionParser.ts +236 -0
- package/src/harnesses/devin/readiness.ts +36 -0
- package/src/harnesses/index.ts +2 -0
- package/src/harnesses/opencode/readiness.ts +48 -0
- package/src/harnesses/pi/credentials.ts +129 -0
- package/src/harnesses/pi/readiness.ts +104 -0
- package/src/harnesses/readiness/AgentReadiness.ts +89 -0
- package/src/harnesses/readiness/checks.ts +336 -0
- package/src/harnesses/readiness/types.ts +90 -0
- package/src/{utils/agents.ts → harnesses/runtimeProfiles.ts} +35 -38
- package/src/index.ts +15 -128
- package/src/runtime/ManagedAgentRuntime.ts +7 -22
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +3 -19
- package/src/runtime/tmux/PidPolling.ts +1 -1
- package/src/runtime/tmux/TmuxAgentRuntime.ts +1 -1
- package/src/{terminal → runtime/tmux}/TmuxManager.ts +9 -30
- package/src/runtime/types.ts +1 -1
- package/src/terminal/TerminalFocusManager.ts +19 -292
- package/src/terminal/TtyWriter.ts +15 -335
- package/src/terminal/backends/ghostty.ts +180 -0
- package/src/terminal/backends/index.ts +23 -0
- package/src/terminal/backends/iterm2.ts +126 -0
- package/src/terminal/backends/shared.ts +47 -0
- package/src/terminal/backends/terminal-app.ts +122 -0
- package/src/terminal/backends/tmux.ts +62 -0
- package/src/terminal/backends/wezterm.ts +65 -0
- package/src/terminal/types.ts +23 -0
- package/src/utils/process.ts +5 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +0 -1
- package/dist/__tests__/utils/agents.test.js +0 -93
- package/dist/__tests__/utils/agents.test.js.map +0 -1
- package/dist/capacity/claude.d.ts +0 -17
- package/dist/capacity/claude.d.ts.map +0 -1
- package/dist/capacity/claude.js.map +0 -1
- package/dist/capacity/codex.d.ts.map +0 -1
- package/dist/capacity/codex.js.map +0 -1
- package/dist/capacity/openai.d.ts +0 -47
- package/dist/capacity/openai.d.ts.map +0 -1
- package/dist/capacity/openai.js +0 -307
- package/dist/capacity/openai.js.map +0 -1
- package/dist/capacity/wham.d.ts +0 -16
- package/dist/capacity/wham.d.ts.map +0 -1
- package/dist/capacity/wham.js +0 -66
- package/dist/capacity/wham.js.map +0 -1
- package/dist/capacity/zai.d.ts +0 -14
- package/dist/capacity/zai.d.ts.map +0 -1
- package/dist/capacity/zai.js.map +0 -1
- package/dist/readiness/AgentReadiness.d.ts.map +0 -1
- package/dist/readiness/AgentReadiness.js +0 -614
- package/dist/readiness/AgentReadiness.js.map +0 -1
- package/dist/terminal/TmuxManager.d.ts +0 -28
- package/dist/terminal/TmuxManager.d.ts.map +0 -1
- package/dist/terminal/TmuxManager.js.map +0 -1
- package/dist/terminal/index.d.ts +0 -5
- package/dist/terminal/index.d.ts.map +0 -1
- package/dist/terminal/index.js +0 -5
- package/dist/terminal/index.js.map +0 -1
- package/dist/utils/agents.d.ts +0 -16
- package/dist/utils/agents.d.ts.map +0 -1
- package/dist/utils/agents.js +0 -117
- package/dist/utils/agents.js.map +0 -1
- package/dist/utils/index.d.ts +0 -8
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/src/__tests__/utils/agents.test.ts +0 -105
- package/src/capacity/openai.ts +0 -355
- package/src/readiness/AgentReadiness.ts +0 -730
- package/src/terminal/index.ts +0 -4
- package/src/utils/index.ts +0 -14
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { claudeReadiness } from "../claude/readiness.js";
|
|
2
|
+
import { codexReadiness } from "../codex/readiness.js";
|
|
3
|
+
import { copilotReadiness } from "../copilot/readiness.js";
|
|
4
|
+
import { openCodeReadiness } from "../opencode/readiness.js";
|
|
5
|
+
import { piReadiness } from "../pi/readiness.js";
|
|
6
|
+
import { devinReadiness } from "../devin/readiness.js";
|
|
7
|
+
import { builtInSkillsCheck, createReadinessRuntime, directoryCheck, executableCheck, worstReadinessStatus } from "./checks.js";
|
|
8
|
+
import { READINESS_AGENT_TYPES } from "./types.js";
|
|
9
|
+
const READINESS_PROFILES = {
|
|
10
|
+
claude: claudeReadiness,
|
|
11
|
+
codex: codexReadiness,
|
|
12
|
+
gemini_cli: {
|
|
13
|
+
configDir: ".gemini"
|
|
14
|
+
},
|
|
15
|
+
grok_cli: {
|
|
16
|
+
configDir: ".grok"
|
|
17
|
+
},
|
|
18
|
+
kiro: {
|
|
19
|
+
configDir: ".kiro"
|
|
20
|
+
},
|
|
21
|
+
antigravity_cli: {
|
|
22
|
+
configDir: ".gemini/antigravity-cli"
|
|
23
|
+
},
|
|
24
|
+
opencode: openCodeReadiness,
|
|
25
|
+
copilot: copilotReadiness,
|
|
26
|
+
pi: piReadiness,
|
|
27
|
+
devin: devinReadiness
|
|
28
|
+
};
|
|
29
|
+
export async function getAgentReadinessReport(agent, options = {}) {
|
|
30
|
+
return agentReadiness(agent, createReadinessRuntime(options));
|
|
31
|
+
}
|
|
32
|
+
async function agentReadiness(agent, runtime) {
|
|
33
|
+
const profile = READINESS_PROFILES[agent];
|
|
34
|
+
const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([
|
|
35
|
+
executableCheck(agent, runtime),
|
|
36
|
+
directoryCheck(profile.configDir, runtime),
|
|
37
|
+
builtInSkillsCheck(agent, runtime),
|
|
38
|
+
profile.auth?.(runtime),
|
|
39
|
+
profile.integration?.(runtime)
|
|
40
|
+
]);
|
|
41
|
+
return {
|
|
42
|
+
type: agent,
|
|
43
|
+
executable,
|
|
44
|
+
globalConfig,
|
|
45
|
+
builtInSkills,
|
|
46
|
+
auth,
|
|
47
|
+
integration,
|
|
48
|
+
status: worstReadinessStatus([
|
|
49
|
+
executable.status,
|
|
50
|
+
globalConfig.status,
|
|
51
|
+
...auth ? [
|
|
52
|
+
auth.status
|
|
53
|
+
] : [],
|
|
54
|
+
...integration ? [
|
|
55
|
+
integration.status
|
|
56
|
+
] : []
|
|
57
|
+
])
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export async function getAgentReadinessReports(options = {}) {
|
|
61
|
+
const runtime = createReadinessRuntime(options);
|
|
62
|
+
const entries = await Promise.all(READINESS_AGENT_TYPES.map(async (agent)=>[
|
|
63
|
+
agent,
|
|
64
|
+
await agentReadiness(agent, runtime)
|
|
65
|
+
]));
|
|
66
|
+
return Object.fromEntries(entries);
|
|
67
|
+
}
|
|
68
|
+
export { worstReadinessStatus } from "./checks.js";
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=AgentReadiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"sourcesContent":["import { claudeReadiness } from \"../claude/readiness.js\";\nimport { codexReadiness } from \"../codex/readiness.js\";\nimport { copilotReadiness } from \"../copilot/readiness.js\";\nimport { openCodeReadiness } from \"../opencode/readiness.js\";\nimport { piReadiness } from \"../pi/readiness.js\";\nimport { devinReadiness } from \"../devin/readiness.js\";\nimport {\n builtInSkillsCheck,\n createReadinessRuntime,\n directoryCheck,\n executableCheck,\n worstReadinessStatus,\n} from \"./checks.js\";\nimport {\n READINESS_AGENT_TYPES,\n type AgentReadinessOptions,\n type AgentReadinessReport,\n type HarnessReadinessProfile,\n type ReadinessAgentType,\n type ReadinessRuntime,\n} from \"./types.js\";\n\nconst READINESS_PROFILES: Record<ReadinessAgentType, HarnessReadinessProfile> = {\n claude: claudeReadiness,\n codex: codexReadiness,\n gemini_cli: { configDir: \".gemini\" },\n grok_cli: { configDir: \".grok\" },\n kiro: { configDir: \".kiro\" },\n antigravity_cli: { configDir: \".gemini/antigravity-cli\" },\n opencode: openCodeReadiness,\n copilot: copilotReadiness,\n pi: piReadiness,\n devin: devinReadiness,\n};\n\nexport async function getAgentReadinessReport(\n agent: ReadinessAgentType,\n options: AgentReadinessOptions = {},\n): Promise<AgentReadinessReport> {\n return agentReadiness(agent, createReadinessRuntime(options));\n}\n\nasync function agentReadiness(\n agent: ReadinessAgentType,\n runtime: ReadinessRuntime,\n): Promise<AgentReadinessReport> {\n const profile = READINESS_PROFILES[agent];\n const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([\n executableCheck(agent, runtime),\n directoryCheck(profile.configDir, runtime),\n builtInSkillsCheck(agent, runtime),\n profile.auth?.(runtime),\n profile.integration?.(runtime),\n ]);\n return {\n type: agent,\n executable,\n globalConfig,\n builtInSkills,\n auth,\n integration,\n status: worstReadinessStatus([\n executable.status,\n globalConfig.status,\n ...(auth ? [auth.status] : []),\n ...(integration ? [integration.status] : []),\n ]),\n };\n}\n\nexport async function getAgentReadinessReports(\n options: AgentReadinessOptions = {},\n): Promise<Record<ReadinessAgentType, AgentReadinessReport>> {\n const runtime = createReadinessRuntime(options);\n const entries = await Promise.all(\n READINESS_AGENT_TYPES.map(\n async (agent) => [agent, await agentReadiness(agent, runtime)] as const,\n ),\n );\n return Object.fromEntries(entries) as Record<ReadinessAgentType, AgentReadinessReport>;\n}\n\nexport { worstReadinessStatus } from \"./checks.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n ReadinessAgentType,\n ReadinessStatus,\n} from \"./types.js\";\n"],"names":["claudeReadiness","codexReadiness","copilotReadiness","openCodeReadiness","piReadiness","devinReadiness","builtInSkillsCheck","createReadinessRuntime","directoryCheck","executableCheck","worstReadinessStatus","READINESS_AGENT_TYPES","READINESS_PROFILES","claude","codex","gemini_cli","configDir","grok_cli","kiro","antigravity_cli","opencode","copilot","pi","devin","getAgentReadinessReport","agent","options","agentReadiness","runtime","profile","executable","globalConfig","builtInSkills","auth","integration","Promise","all","type","status","getAgentReadinessReports","entries","map","Object","fromEntries"],"mappings":"AAAA,SAASA,eAAe,QAAQ,yBAAyB;AACzD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,gBAAgB,QAAQ,0BAA0B;AAC3D,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,cAAc,EACdC,eAAe,EACfC,oBAAoB,QACf,cAAc;AACrB,SACEC,qBAAqB,QAMhB,aAAa;AAEpB,MAAMC,qBAA0E;IAC9EC,QAAQb;IACRc,OAAOb;IACPc,YAAY;QAAEC,WAAW;IAAU;IACnCC,UAAU;QAAED,WAAW;IAAQ;IAC/BE,MAAM;QAAEF,WAAW;IAAQ;IAC3BG,iBAAiB;QAAEH,WAAW;IAA0B;IACxDI,UAAUjB;IACVkB,SAASnB;IACToB,IAAIlB;IACJmB,OAAOlB;AACT;AAEA,OAAO,eAAemB,wBACpBC,KAAyB,EACzBC,UAAiC,CAAC,CAAC;IAEnC,OAAOC,eAAeF,OAAOlB,uBAAuBmB;AACtD;AAEA,eAAeC,eACbF,KAAyB,EACzBG,OAAyB;IAEzB,MAAMC,UAAUjB,kBAAkB,CAACa,MAAM;IACzC,MAAM,CAACK,YAAYC,cAAcC,eAAeC,MAAMC,YAAY,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACrF3B,gBAAgBgB,OAAOG;QACvBpB,eAAeqB,QAAQb,SAAS,EAAEY;QAClCtB,mBAAmBmB,OAAOG;QAC1BC,QAAQI,IAAI,GAAGL;QACfC,QAAQK,WAAW,GAAGN;KACvB;IACD,OAAO;QACLS,MAAMZ;QACNK;QACAC;QACAC;QACAC;QACAC;QACAI,QAAQ5B,qBAAqB;YAC3BoB,WAAWQ,MAAM;YACjBP,aAAaO,MAAM;eACfL,OAAO;gBAACA,KAAKK,MAAM;aAAC,GAAG,EAAE;eACzBJ,cAAc;gBAACA,YAAYI,MAAM;aAAC,GAAG,EAAE;SAC5C;IACH;AACF;AAEA,OAAO,eAAeC,yBACpBb,UAAiC,CAAC,CAAC;IAEnC,MAAME,UAAUrB,uBAAuBmB;IACvC,MAAMc,UAAU,MAAML,QAAQC,GAAG,CAC/BzB,sBAAsB8B,GAAG,CACvB,OAAOhB,QAAU;YAACA;YAAO,MAAME,eAAeF,OAAOG;SAAS;IAGlE,OAAOc,OAAOC,WAAW,CAACH;AAC5B;AAEA,SAAS9B,oBAAoB,QAAQ,cAAc"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AgentReadinessOptions, BuiltInSkillsReadinessCheck, DirectoryReadinessCheck, ExecutableReadinessCheck, ReadinessAgentType, ReadinessCheck, ReadinessRuntime, ReadinessStatus } from "./types.js";
|
|
2
|
+
export declare function createReadinessRuntime(options: AgentReadinessOptions): ReadinessRuntime;
|
|
3
|
+
export declare function worstReadinessStatus(statuses: ReadinessStatus[]): ReadinessStatus;
|
|
4
|
+
export declare function displayHome(target: string, homeDir: string): string;
|
|
5
|
+
export declare function record(value: unknown): Record<string, unknown> | null;
|
|
6
|
+
export declare function nonEmpty(value: unknown): boolean;
|
|
7
|
+
export declare function accessible(target: string, runtime: ReadinessRuntime, mode?: number): Promise<boolean>;
|
|
8
|
+
export declare function executableCheck(agent: ReadinessAgentType, runtime: ReadinessRuntime): Promise<ExecutableReadinessCheck>;
|
|
9
|
+
export declare function directoryCheck(configDir: string, runtime: ReadinessRuntime): Promise<DirectoryReadinessCheck>;
|
|
10
|
+
export declare function builtInSkillsCheck(agent: ReadinessAgentType, runtime: ReadinessRuntime): Promise<BuiltInSkillsReadinessCheck>;
|
|
11
|
+
export declare function scriptCheck(installed: string, bundled: string, runtime: ReadinessRuntime): Promise<ReadinessCheck & {
|
|
12
|
+
path: string;
|
|
13
|
+
present: boolean;
|
|
14
|
+
readable: boolean;
|
|
15
|
+
matchesBundledAsset: boolean;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function registrationCheck(target: string, event: string, command: string, runtime: ReadinessRuntime): Promise<ReadinessCheck & {
|
|
18
|
+
path: string;
|
|
19
|
+
event: string;
|
|
20
|
+
command: string;
|
|
21
|
+
present: boolean;
|
|
22
|
+
valid: boolean;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function mappingCheck(target: string, runtime: ReadinessRuntime): Promise<ReadinessCheck & {
|
|
25
|
+
path: string;
|
|
26
|
+
present: boolean;
|
|
27
|
+
valid: boolean;
|
|
28
|
+
invalidEntries: number;
|
|
29
|
+
staleEntries: number;
|
|
30
|
+
}>;
|
|
31
|
+
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/checks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAY,CAAC;AAIpB,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG,gBAAgB,CAYvF;AAeD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,CAKjF;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAIrE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEhD;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,EACzB,IAAI,SAAiB,GACpB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAmBD,wBAAsB,eAAe,CACnC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,wBAAwB,CAAC,CASnC;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,uBAAuB,CAAC,CAUlC;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,2BAA2B,CAAC,CA6BtC;AAED,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,GACxB,OAAO,CACR,cAAc,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,CACF,CAmCA;AAkBD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,gBAAgB,GACxB,OAAO,CACR,cAAc,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB,CACF,CAwBA;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gBAAgB,GACxB,OAAO,CACR,cAAc,GAAG;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;CACtB,CACF,CAwDA"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { constants } from "node:fs";
|
|
3
|
+
import { access as fsAccess, readFile as fsReadFile } from "node:fs/promises";
|
|
4
|
+
import { delimiter, join } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { getCodexCapacityReport } from "../../capacity/index.js";
|
|
7
|
+
import { HARNESS_RUNTIME_PROFILES } from "../runtimeProfiles.js";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
export function createReadinessRuntime(options) {
|
|
10
|
+
return {
|
|
11
|
+
homeDir: options.homeDir ?? process.env.HOME ?? "",
|
|
12
|
+
path: options.path ?? process.env.PATH ?? "",
|
|
13
|
+
assetRoot: options.assetRoot ?? null,
|
|
14
|
+
builtInSkillNames: options.builtInSkillNames ?? [],
|
|
15
|
+
skillRoots: options.skillRoots ?? {},
|
|
16
|
+
readFile: options.readFile ?? ((target)=>fsReadFile(target, "utf8")),
|
|
17
|
+
access: options.access ?? ((target, mode = constants.R_OK)=>fsAccess(target, mode)),
|
|
18
|
+
runCommand: options.runCommand ?? defaultRunCommand,
|
|
19
|
+
codexAuth: options.codexAuth ?? (async ()=>(await getCodexCapacityReport()).authenticated)
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
async function defaultRunCommand(command, args) {
|
|
23
|
+
const result = await execFileAsync(command, args, {
|
|
24
|
+
encoding: "utf8",
|
|
25
|
+
timeout: 5000,
|
|
26
|
+
maxBuffer: 1024 * 1024
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
stdout: result.stdout,
|
|
30
|
+
stderr: result.stderr
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function statusRank(status) {
|
|
34
|
+
return status === "fail" ? 2 : status === "warn" ? 1 : 0;
|
|
35
|
+
}
|
|
36
|
+
export function worstReadinessStatus(statuses) {
|
|
37
|
+
return statuses.reduce((worst, current)=>statusRank(current) > statusRank(worst) ? current : worst, "pass");
|
|
38
|
+
}
|
|
39
|
+
export function displayHome(target, homeDir) {
|
|
40
|
+
return target === homeDir ? "~" : target.startsWith(`${homeDir}/`) ? `~${target.slice(homeDir.length)}` : target;
|
|
41
|
+
}
|
|
42
|
+
export function record(value) {
|
|
43
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
44
|
+
}
|
|
45
|
+
export function nonEmpty(value) {
|
|
46
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
47
|
+
}
|
|
48
|
+
export async function accessible(target, runtime, mode = constants.R_OK) {
|
|
49
|
+
try {
|
|
50
|
+
await runtime.access(target, mode);
|
|
51
|
+
return true;
|
|
52
|
+
} catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function resolveExecutable(command, runtime) {
|
|
57
|
+
const candidates = runtime.path.split(delimiter).filter(Boolean).map((directory)=>join(directory, command));
|
|
58
|
+
const checks = await Promise.all(candidates.map(async (target)=>({
|
|
59
|
+
target,
|
|
60
|
+
available: await accessible(target, runtime, constants.X_OK)
|
|
61
|
+
})));
|
|
62
|
+
return checks.find((check)=>check.available)?.target ?? null;
|
|
63
|
+
}
|
|
64
|
+
export async function executableCheck(agent, runtime) {
|
|
65
|
+
const command = HARNESS_RUNTIME_PROFILES[agent].command;
|
|
66
|
+
const resolvedPath = await resolveExecutable(command, runtime);
|
|
67
|
+
return {
|
|
68
|
+
command,
|
|
69
|
+
path: resolvedPath,
|
|
70
|
+
status: resolvedPath ? "pass" : "fail",
|
|
71
|
+
errors: resolvedPath ? [] : [
|
|
72
|
+
`${command} was not found on PATH`
|
|
73
|
+
]
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
export async function directoryCheck(configDir, runtime) {
|
|
77
|
+
const target = join(runtime.homeDir, configDir);
|
|
78
|
+
const readable = await accessible(target, runtime);
|
|
79
|
+
return {
|
|
80
|
+
path: displayHome(target, runtime.homeDir),
|
|
81
|
+
present: readable,
|
|
82
|
+
readable,
|
|
83
|
+
status: readable ? "pass" : "fail",
|
|
84
|
+
errors: readable ? [] : [
|
|
85
|
+
"global configuration directory is unavailable"
|
|
86
|
+
]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export async function builtInSkillsCheck(agent, runtime) {
|
|
90
|
+
const relativeRoot = runtime.skillRoots[agent];
|
|
91
|
+
if (!relativeRoot) {
|
|
92
|
+
return {
|
|
93
|
+
path: null,
|
|
94
|
+
required: runtime.builtInSkillNames.length,
|
|
95
|
+
present: 0,
|
|
96
|
+
missing: [
|
|
97
|
+
...runtime.builtInSkillNames
|
|
98
|
+
],
|
|
99
|
+
status: "info",
|
|
100
|
+
errors: []
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const root = join(runtime.homeDir, relativeRoot);
|
|
104
|
+
const checks = await Promise.all(runtime.builtInSkillNames.map(async (name)=>({
|
|
105
|
+
name,
|
|
106
|
+
present: await accessible(join(root, name, "SKILL.md"), runtime)
|
|
107
|
+
})));
|
|
108
|
+
const present = checks.filter((check)=>check.present).map((check)=>check.name);
|
|
109
|
+
const missing = runtime.builtInSkillNames.filter((name)=>!present.includes(name));
|
|
110
|
+
return {
|
|
111
|
+
path: displayHome(root, runtime.homeDir),
|
|
112
|
+
required: runtime.builtInSkillNames.length,
|
|
113
|
+
present: present.length,
|
|
114
|
+
missing: [
|
|
115
|
+
...missing
|
|
116
|
+
],
|
|
117
|
+
status: "info",
|
|
118
|
+
errors: []
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
export async function scriptCheck(installed, bundled, runtime) {
|
|
122
|
+
let installedText;
|
|
123
|
+
try {
|
|
124
|
+
installedText = await runtime.readFile(installed);
|
|
125
|
+
} catch {
|
|
126
|
+
return {
|
|
127
|
+
path: displayHome(installed, runtime.homeDir),
|
|
128
|
+
present: false,
|
|
129
|
+
readable: false,
|
|
130
|
+
matchesBundledAsset: false,
|
|
131
|
+
status: "fail",
|
|
132
|
+
errors: [
|
|
133
|
+
"hook script is unavailable"
|
|
134
|
+
]
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
const bundledText = await runtime.readFile(bundled);
|
|
139
|
+
const matches = installedText === bundledText;
|
|
140
|
+
return {
|
|
141
|
+
path: displayHome(installed, runtime.homeDir),
|
|
142
|
+
present: true,
|
|
143
|
+
readable: true,
|
|
144
|
+
matchesBundledAsset: matches,
|
|
145
|
+
status: matches ? "pass" : "fail",
|
|
146
|
+
errors: matches ? [] : [
|
|
147
|
+
"hook script differs from the bundled AI DevKit asset"
|
|
148
|
+
]
|
|
149
|
+
};
|
|
150
|
+
} catch {
|
|
151
|
+
return {
|
|
152
|
+
path: displayHome(installed, runtime.homeDir),
|
|
153
|
+
present: true,
|
|
154
|
+
readable: true,
|
|
155
|
+
matchesBundledAsset: false,
|
|
156
|
+
status: "fail",
|
|
157
|
+
errors: [
|
|
158
|
+
"bundled hook asset is unavailable"
|
|
159
|
+
]
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
function containsHook(root, event, command) {
|
|
164
|
+
const hooks = record(record(root)?.hooks);
|
|
165
|
+
const entries = hooks?.[event];
|
|
166
|
+
if (!Array.isArray(entries)) return false;
|
|
167
|
+
return entries.some((entry)=>{
|
|
168
|
+
const commands = record(entry)?.hooks;
|
|
169
|
+
return Array.isArray(commands) && commands.some((hook)=>{
|
|
170
|
+
const item = record(hook);
|
|
171
|
+
return item?.type === "command" && item.command === command;
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
export async function registrationCheck(target, event, command, runtime) {
|
|
176
|
+
try {
|
|
177
|
+
const parsed = JSON.parse(await runtime.readFile(target));
|
|
178
|
+
const valid = containsHook(parsed, event, command);
|
|
179
|
+
return {
|
|
180
|
+
path: displayHome(target, runtime.homeDir),
|
|
181
|
+
event,
|
|
182
|
+
command,
|
|
183
|
+
present: true,
|
|
184
|
+
valid,
|
|
185
|
+
status: valid ? "pass" : "fail",
|
|
186
|
+
errors: valid ? [] : [
|
|
187
|
+
"required hook registration is missing"
|
|
188
|
+
]
|
|
189
|
+
};
|
|
190
|
+
} catch {
|
|
191
|
+
return {
|
|
192
|
+
path: displayHome(target, runtime.homeDir),
|
|
193
|
+
event,
|
|
194
|
+
command,
|
|
195
|
+
present: false,
|
|
196
|
+
valid: false,
|
|
197
|
+
status: "fail",
|
|
198
|
+
errors: [
|
|
199
|
+
"hook configuration is missing or invalid"
|
|
200
|
+
]
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export async function mappingCheck(target, runtime) {
|
|
205
|
+
let text;
|
|
206
|
+
try {
|
|
207
|
+
text = await runtime.readFile(target);
|
|
208
|
+
} catch {
|
|
209
|
+
return {
|
|
210
|
+
path: displayHome(target, runtime.homeDir),
|
|
211
|
+
present: false,
|
|
212
|
+
valid: false,
|
|
213
|
+
invalidEntries: 0,
|
|
214
|
+
staleEntries: 0,
|
|
215
|
+
status: "warn",
|
|
216
|
+
errors: [
|
|
217
|
+
"session mapping has not been created"
|
|
218
|
+
]
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
let parsed = null;
|
|
222
|
+
try {
|
|
223
|
+
parsed = record(JSON.parse(text));
|
|
224
|
+
} catch {
|
|
225
|
+
// Fixed safe error below.
|
|
226
|
+
}
|
|
227
|
+
if (!parsed) {
|
|
228
|
+
return {
|
|
229
|
+
path: displayHome(target, runtime.homeDir),
|
|
230
|
+
present: true,
|
|
231
|
+
valid: false,
|
|
232
|
+
invalidEntries: 0,
|
|
233
|
+
staleEntries: 0,
|
|
234
|
+
status: "fail",
|
|
235
|
+
errors: [
|
|
236
|
+
"session mapping is invalid"
|
|
237
|
+
]
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
const entries = await Promise.all(Object.entries(parsed).map(async ([pid, sessionPath])=>{
|
|
241
|
+
if (!/^\d+$/.test(pid) || typeof sessionPath !== "string" || !sessionPath) {
|
|
242
|
+
return {
|
|
243
|
+
valid: false,
|
|
244
|
+
stale: false
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
valid: true,
|
|
249
|
+
stale: !await accessible(sessionPath, runtime)
|
|
250
|
+
};
|
|
251
|
+
}));
|
|
252
|
+
const invalidEntries = entries.filter((entry)=>!entry.valid).length;
|
|
253
|
+
const staleEntries = entries.filter((entry)=>entry.stale).length;
|
|
254
|
+
const valid = invalidEntries === 0;
|
|
255
|
+
return {
|
|
256
|
+
path: displayHome(target, runtime.homeDir),
|
|
257
|
+
present: true,
|
|
258
|
+
valid,
|
|
259
|
+
invalidEntries,
|
|
260
|
+
staleEntries,
|
|
261
|
+
status: !valid ? "fail" : staleEntries ? "warn" : "pass",
|
|
262
|
+
errors: !valid ? [
|
|
263
|
+
"session mapping contains invalid entries"
|
|
264
|
+
] : staleEntries ? [
|
|
265
|
+
"session mapping contains stale entries"
|
|
266
|
+
] : []
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/readiness/checks.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { constants } from \"node:fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"node:fs/promises\";\nimport { delimiter, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getCodexCapacityReport } from \"../../capacity/index.js\";\nimport { HARNESS_RUNTIME_PROFILES } from \"../runtimeProfiles.js\";\nimport type {\n AgentReadinessOptions,\n BuiltInSkillsReadinessCheck,\n DirectoryReadinessCheck,\n ExecutableReadinessCheck,\n ReadinessAgentType,\n ReadinessCheck,\n ReadinessRuntime,\n ReadinessStatus,\n} from \"./types.js\";\n\nconst execFileAsync = promisify(execFile);\n\nexport function createReadinessRuntime(options: AgentReadinessOptions): ReadinessRuntime {\n return {\n homeDir: options.homeDir ?? process.env.HOME ?? \"\",\n path: options.path ?? process.env.PATH ?? \"\",\n assetRoot: options.assetRoot ?? null,\n builtInSkillNames: options.builtInSkillNames ?? [],\n skillRoots: options.skillRoots ?? {},\n readFile: options.readFile ?? ((target) => fsReadFile(target, \"utf8\")),\n access: options.access ?? ((target, mode = constants.R_OK) => fsAccess(target, mode)),\n runCommand: options.runCommand ?? defaultRunCommand,\n codexAuth: options.codexAuth ?? (async () => (await getCodexCapacityReport()).authenticated),\n };\n}\n\nasync function defaultRunCommand(command: string, args: string[]) {\n const result = await execFileAsync(command, args, {\n encoding: \"utf8\",\n timeout: 5000,\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nfunction statusRank(status: ReadinessStatus): number {\n return status === \"fail\" ? 2 : status === \"warn\" ? 1 : 0;\n}\n\nexport function worstReadinessStatus(statuses: ReadinessStatus[]): ReadinessStatus {\n return statuses.reduce<ReadinessStatus>(\n (worst, current) => (statusRank(current) > statusRank(worst) ? current : worst),\n \"pass\",\n );\n}\n\nexport function displayHome(target: string, homeDir: string): string {\n return target === homeDir\n ? \"~\"\n : target.startsWith(`${homeDir}/`)\n ? `~${target.slice(homeDir.length)}`\n : target;\n}\n\nexport function record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nexport function nonEmpty(value: unknown): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport async function accessible(\n target: string,\n runtime: ReadinessRuntime,\n mode = constants.R_OK,\n): Promise<boolean> {\n try {\n await runtime.access(target, mode);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveExecutable(\n command: string,\n runtime: ReadinessRuntime,\n): Promise<string | null> {\n const candidates = runtime.path\n .split(delimiter)\n .filter(Boolean)\n .map((directory) => join(directory, command));\n const checks = await Promise.all(\n candidates.map(async (target) => ({\n target,\n available: await accessible(target, runtime, constants.X_OK),\n })),\n );\n return checks.find((check) => check.available)?.target ?? null;\n}\n\nexport async function executableCheck(\n agent: ReadinessAgentType,\n runtime: ReadinessRuntime,\n): Promise<ExecutableReadinessCheck> {\n const command = HARNESS_RUNTIME_PROFILES[agent].command;\n const resolvedPath = await resolveExecutable(command, runtime);\n return {\n command,\n path: resolvedPath,\n status: resolvedPath ? \"pass\" : \"fail\",\n errors: resolvedPath ? [] : [`${command} was not found on PATH`],\n };\n}\n\nexport async function directoryCheck(\n configDir: string,\n runtime: ReadinessRuntime,\n): Promise<DirectoryReadinessCheck> {\n const target = join(runtime.homeDir, configDir);\n const readable = await accessible(target, runtime);\n return {\n path: displayHome(target, runtime.homeDir),\n present: readable,\n readable,\n status: readable ? \"pass\" : \"fail\",\n errors: readable ? [] : [\"global configuration directory is unavailable\"],\n };\n}\n\nexport async function builtInSkillsCheck(\n agent: ReadinessAgentType,\n runtime: ReadinessRuntime,\n): Promise<BuiltInSkillsReadinessCheck> {\n const relativeRoot = runtime.skillRoots[agent];\n if (!relativeRoot) {\n return {\n path: null,\n required: runtime.builtInSkillNames.length,\n present: 0,\n missing: [...runtime.builtInSkillNames],\n status: \"info\",\n errors: [],\n };\n }\n const root = join(runtime.homeDir, relativeRoot);\n const checks = await Promise.all(\n runtime.builtInSkillNames.map(async (name) => ({\n name,\n present: await accessible(join(root, name, \"SKILL.md\"), runtime),\n })),\n );\n const present = checks.filter((check) => check.present).map((check) => check.name);\n const missing = runtime.builtInSkillNames.filter((name) => !present.includes(name));\n return {\n path: displayHome(root, runtime.homeDir),\n required: runtime.builtInSkillNames.length,\n present: present.length,\n missing: [...missing],\n status: \"info\",\n errors: [],\n };\n}\n\nexport async function scriptCheck(\n installed: string,\n bundled: string,\n runtime: ReadinessRuntime,\n): Promise<\n ReadinessCheck & {\n path: string;\n present: boolean;\n readable: boolean;\n matchesBundledAsset: boolean;\n }\n> {\n let installedText: string;\n try {\n installedText = await runtime.readFile(installed);\n } catch {\n return {\n path: displayHome(installed, runtime.homeDir),\n present: false,\n readable: false,\n matchesBundledAsset: false,\n status: \"fail\",\n errors: [\"hook script is unavailable\"],\n };\n }\n try {\n const bundledText = await runtime.readFile(bundled);\n const matches = installedText === bundledText;\n return {\n path: displayHome(installed, runtime.homeDir),\n present: true,\n readable: true,\n matchesBundledAsset: matches,\n status: matches ? \"pass\" : \"fail\",\n errors: matches ? [] : [\"hook script differs from the bundled AI DevKit asset\"],\n };\n } catch {\n return {\n path: displayHome(installed, runtime.homeDir),\n present: true,\n readable: true,\n matchesBundledAsset: false,\n status: \"fail\",\n errors: [\"bundled hook asset is unavailable\"],\n };\n }\n}\n\nfunction containsHook(root: unknown, event: string, command: string): boolean {\n const hooks = record(record(root)?.hooks);\n const entries = hooks?.[event];\n if (!Array.isArray(entries)) return false;\n return entries.some((entry) => {\n const commands = record(entry)?.hooks;\n return (\n Array.isArray(commands) &&\n commands.some((hook) => {\n const item = record(hook);\n return item?.type === \"command\" && item.command === command;\n })\n );\n });\n}\n\nexport async function registrationCheck(\n target: string,\n event: string,\n command: string,\n runtime: ReadinessRuntime,\n): Promise<\n ReadinessCheck & {\n path: string;\n event: string;\n command: string;\n present: boolean;\n valid: boolean;\n }\n> {\n try {\n const parsed = JSON.parse(await runtime.readFile(target));\n const valid = containsHook(parsed, event, command);\n return {\n path: displayHome(target, runtime.homeDir),\n event,\n command,\n present: true,\n valid,\n status: valid ? \"pass\" : \"fail\",\n errors: valid ? [] : [\"required hook registration is missing\"],\n };\n } catch {\n return {\n path: displayHome(target, runtime.homeDir),\n event,\n command,\n present: false,\n valid: false,\n status: \"fail\",\n errors: [\"hook configuration is missing or invalid\"],\n };\n }\n}\n\nexport async function mappingCheck(\n target: string,\n runtime: ReadinessRuntime,\n): Promise<\n ReadinessCheck & {\n path: string;\n present: boolean;\n valid: boolean;\n invalidEntries: number;\n staleEntries: number;\n }\n> {\n let text: string;\n try {\n text = await runtime.readFile(target);\n } catch {\n return {\n path: displayHome(target, runtime.homeDir),\n present: false,\n valid: false,\n invalidEntries: 0,\n staleEntries: 0,\n status: \"warn\",\n errors: [\"session mapping has not been created\"],\n };\n }\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = record(JSON.parse(text));\n } catch {\n // Fixed safe error below.\n }\n if (!parsed) {\n return {\n path: displayHome(target, runtime.homeDir),\n present: true,\n valid: false,\n invalidEntries: 0,\n staleEntries: 0,\n status: \"fail\",\n errors: [\"session mapping is invalid\"],\n };\n }\n const entries = await Promise.all(\n Object.entries(parsed).map(async ([pid, sessionPath]) => {\n if (!/^\\d+$/.test(pid) || typeof sessionPath !== \"string\" || !sessionPath) {\n return { valid: false, stale: false };\n }\n return { valid: true, stale: !(await accessible(sessionPath, runtime)) };\n }),\n );\n const invalidEntries = entries.filter((entry) => !entry.valid).length;\n const staleEntries = entries.filter((entry) => entry.stale).length;\n const valid = invalidEntries === 0;\n return {\n path: displayHome(target, runtime.homeDir),\n present: true,\n valid,\n invalidEntries,\n staleEntries,\n status: !valid ? \"fail\" : staleEntries ? \"warn\" : \"pass\",\n errors: !valid\n ? [\"session mapping contains invalid entries\"]\n : staleEntries\n ? [\"session mapping contains stale entries\"]\n : [],\n };\n}\n"],"names":["execFile","constants","access","fsAccess","readFile","fsReadFile","delimiter","join","promisify","getCodexCapacityReport","HARNESS_RUNTIME_PROFILES","execFileAsync","createReadinessRuntime","options","homeDir","process","env","HOME","path","PATH","assetRoot","builtInSkillNames","skillRoots","target","mode","R_OK","runCommand","defaultRunCommand","codexAuth","authenticated","command","args","result","encoding","timeout","maxBuffer","stdout","stderr","statusRank","status","worstReadinessStatus","statuses","reduce","worst","current","displayHome","startsWith","slice","length","record","value","Array","isArray","nonEmpty","trim","accessible","runtime","resolveExecutable","candidates","split","filter","Boolean","map","directory","checks","Promise","all","available","X_OK","find","check","executableCheck","agent","resolvedPath","errors","directoryCheck","configDir","readable","present","builtInSkillsCheck","relativeRoot","required","missing","root","name","includes","scriptCheck","installed","bundled","installedText","matchesBundledAsset","bundledText","matches","containsHook","event","hooks","entries","some","entry","commands","hook","item","type","registrationCheck","parsed","JSON","parse","valid","mappingCheck","text","invalidEntries","staleEntries","Object","pid","sessionPath","test","stale"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
|
|
1
|
+
export declare const READINESS_AGENT_TYPES: readonly ["claude", "codex", "gemini_cli", "grok_cli", "kiro", "antigravity_cli", "opencode", "copilot", "pi", "devin"];
|
|
2
2
|
export type ReadinessStatus = "pass" | "warn" | "fail";
|
|
3
3
|
export type ReadinessAuthState = "authenticated" | "unauthenticated" | "unknown";
|
|
4
|
-
export type ReadinessAgentType =
|
|
4
|
+
export type ReadinessAgentType = (typeof READINESS_AGENT_TYPES)[number];
|
|
5
5
|
type ReadinessInfoStatus = ReadinessStatus | "info";
|
|
6
|
-
type CommandResult = {
|
|
6
|
+
export type CommandResult = {
|
|
7
7
|
stdout: string;
|
|
8
8
|
stderr: string;
|
|
9
9
|
};
|
|
10
|
-
type ReadFile = (target: string) => Promise<string>;
|
|
11
|
-
type Access = (target: string, mode?: number) => Promise<void>;
|
|
12
|
-
type RunCommand = (command: string, args: string[]) => Promise<CommandResult>;
|
|
10
|
+
export type ReadFile = (target: string) => Promise<string>;
|
|
11
|
+
export type Access = (target: string, mode?: number) => Promise<void>;
|
|
12
|
+
export type RunCommand = (command: string, args: string[]) => Promise<CommandResult>;
|
|
13
13
|
export interface ReadinessCheck<S extends ReadinessInfoStatus = ReadinessStatus> {
|
|
14
14
|
status: S;
|
|
15
15
|
errors: string[];
|
|
@@ -60,8 +60,17 @@ export interface AgentReadinessOptions {
|
|
|
60
60
|
runCommand?: RunCommand;
|
|
61
61
|
codexAuth?: () => Promise<boolean | null>;
|
|
62
62
|
}
|
|
63
|
-
export
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
export type ReadinessRuntime = Required<Omit<AgentReadinessOptions, "assetRoot" | "builtInSkillNames" | "skillRoots">> & {
|
|
64
|
+
assetRoot: string | null;
|
|
65
|
+
builtInSkillNames: readonly string[];
|
|
66
|
+
skillRoots: Partial<Record<ReadinessAgentType, string>>;
|
|
67
|
+
};
|
|
68
|
+
export type AuthReadinessProbe = (runtime: ReadinessRuntime) => Promise<AuthReadinessCheck>;
|
|
69
|
+
export type IntegrationReadinessProbe = (runtime: ReadinessRuntime) => Promise<IntegrationReadinessCheck>;
|
|
70
|
+
export interface HarnessReadinessProfile {
|
|
71
|
+
configDir: string;
|
|
72
|
+
auth?: AuthReadinessProbe;
|
|
73
|
+
integration?: IntegrationReadinessProbe;
|
|
74
|
+
}
|
|
66
75
|
export {};
|
|
67
|
-
//# sourceMappingURL=
|
|
76
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/readiness/types.ts"],"sourcesContent":["import { AGENT_TYPES } from \"../../adapters/AgentAdapter.js\";\n\nexport const READINESS_AGENT_TYPES = AGENT_TYPES;\n\nexport type ReadinessStatus = \"pass\" | \"warn\" | \"fail\";\nexport type ReadinessAuthState = \"authenticated\" | \"unauthenticated\" | \"unknown\";\nexport type ReadinessAgentType = (typeof READINESS_AGENT_TYPES)[number];\ntype ReadinessInfoStatus = ReadinessStatus | \"info\";\n\nexport type CommandResult = { stdout: string; stderr: string };\nexport type ReadFile = (target: string) => Promise<string>;\nexport type Access = (target: string, mode?: number) => Promise<void>;\nexport type RunCommand = (command: string, args: string[]) => Promise<CommandResult>;\n\nexport interface ReadinessCheck<S extends ReadinessInfoStatus = ReadinessStatus> {\n status: S;\n errors: string[];\n}\n\nexport interface ExecutableReadinessCheck extends ReadinessCheck {\n command: string;\n path: string | null;\n}\n\nexport interface DirectoryReadinessCheck extends ReadinessCheck {\n path: string;\n present: boolean;\n readable: boolean;\n}\n\nexport interface BuiltInSkillsReadinessCheck extends ReadinessCheck<\"info\"> {\n path: string | null;\n required: number;\n present: number;\n missing: string[];\n}\n\nexport interface AuthReadinessCheck extends ReadinessCheck {\n state: ReadinessAuthState;\n source: string;\n provider: string | null;\n availableProviders: string[];\n}\n\nexport interface IntegrationReadinessCheck extends ReadinessCheck {\n label: string;\n installed: boolean;\n details?: Record<string, unknown>;\n}\n\nexport interface AgentReadinessReport {\n type: ReadinessAgentType;\n executable: ExecutableReadinessCheck;\n globalConfig: DirectoryReadinessCheck;\n builtInSkills: BuiltInSkillsReadinessCheck;\n auth?: AuthReadinessCheck;\n integration?: IntegrationReadinessCheck;\n status: ReadinessStatus;\n}\n\nexport interface AgentReadinessOptions {\n homeDir?: string;\n path?: string;\n assetRoot?: string;\n builtInSkillNames?: readonly string[];\n skillRoots?: Partial<Record<ReadinessAgentType, string>>;\n readFile?: ReadFile;\n access?: Access;\n runCommand?: RunCommand;\n codexAuth?: () => Promise<boolean | null>;\n}\n\nexport type ReadinessRuntime = Required<\n Omit<AgentReadinessOptions, \"assetRoot\" | \"builtInSkillNames\" | \"skillRoots\">\n> & {\n assetRoot: string | null;\n builtInSkillNames: readonly string[];\n skillRoots: Partial<Record<ReadinessAgentType, string>>;\n};\n\nexport type AuthReadinessProbe = (runtime: ReadinessRuntime) => Promise<AuthReadinessCheck>;\nexport type IntegrationReadinessProbe = (\n runtime: ReadinessRuntime,\n) => Promise<IntegrationReadinessCheck>;\n\nexport interface HarnessReadinessProfile {\n configDir: string;\n auth?: AuthReadinessProbe;\n integration?: IntegrationReadinessProbe;\n}\n"],"names":["AGENT_TYPES","READINESS_AGENT_TYPES"],"mappings":"AAAA,SAASA,WAAW,QAAQ,iCAAiC;AAE7D,OAAO,MAAMC,wBAAwBD,YAAY"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AGENT_TYPES, type AgentType } from "../adapters/AgentAdapter.js";
|
|
2
|
+
export type StartableAgentType = (typeof AGENT_TYPES)[number];
|
|
3
|
+
export interface HarnessRuntimeProfile {
|
|
4
|
+
command: string;
|
|
5
|
+
runtimeKind: string;
|
|
6
|
+
discoveryAliases: readonly string[];
|
|
7
|
+
matches: (psCommand: string) => boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare const HARNESS_RUNTIME_PROFILES: Record<StartableAgentType, HarnessRuntimeProfile>;
|
|
10
|
+
export declare function runtimeAgentMatchesHarness(runtimeAgent: string, type: AgentType): boolean;
|
|
11
|
+
//# sourceMappingURL=runtimeProfiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeProfiles.d.ts","sourceRoot":"","sources":["../../src/harnesses/runtimeProfiles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG1E,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAED,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAWtF,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAGzF"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { executablePath } from "../utils/process.js";
|
|
3
|
+
export const HARNESS_RUNTIME_PROFILES = {
|
|
4
|
+
claude: profile("claude", matchArgv0("claude")),
|
|
5
|
+
codex: profile("codex", matchArgv0("codex")),
|
|
6
|
+
copilot: profile("copilot", matchArgv0Name("copilot-cli")),
|
|
7
|
+
gemini_cli: profile("gemini", matchAnyBasename([
|
|
8
|
+
"gemini"
|
|
9
|
+
]), [
|
|
10
|
+
"gemini_cli"
|
|
11
|
+
]),
|
|
12
|
+
grok_cli: profile("grok", matchArgv0("grok"), [
|
|
13
|
+
"grok_cli"
|
|
14
|
+
]),
|
|
15
|
+
antigravity_cli: profile("agy", matchArgv0("agy"), [
|
|
16
|
+
"antigravity",
|
|
17
|
+
"antigravity_cli"
|
|
18
|
+
]),
|
|
19
|
+
opencode: profile("opencode", matchArgv0("opencode")),
|
|
20
|
+
pi: profile("pi", matchAnyBasename([
|
|
21
|
+
"pi"
|
|
22
|
+
])),
|
|
23
|
+
kiro: profile("kiro", matchAnyBasename([
|
|
24
|
+
"kiro-cli",
|
|
25
|
+
"kiro"
|
|
26
|
+
]), [
|
|
27
|
+
"kiro_cli",
|
|
28
|
+
"kiro-cli"
|
|
29
|
+
]),
|
|
30
|
+
devin: profile("devin", matchArgv0("devin"))
|
|
31
|
+
};
|
|
32
|
+
export function runtimeAgentMatchesHarness(runtimeAgent, type) {
|
|
33
|
+
if (type === "other") return runtimeAgent.toLowerCase() === "other";
|
|
34
|
+
return HARNESS_RUNTIME_PROFILES[type].discoveryAliases.includes(runtimeAgent.toLowerCase());
|
|
35
|
+
}
|
|
36
|
+
function profile(runtimeKind, matches, extraAliases = []) {
|
|
37
|
+
return {
|
|
38
|
+
command: runtimeKind === "kiro" ? "kiro-cli" : runtimeKind,
|
|
39
|
+
runtimeKind,
|
|
40
|
+
discoveryAliases: [
|
|
41
|
+
runtimeKind,
|
|
42
|
+
...extraAliases
|
|
43
|
+
],
|
|
44
|
+
matches
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const ABSOLUTE_PATH = /^(?:\/|[a-zA-Z]:[\\/])/;
|
|
48
|
+
const PATH_SEPARATOR = /[\\/]/;
|
|
49
|
+
function basenameOf(token) {
|
|
50
|
+
return path.basename(token).toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
function tokensOf(psCommand) {
|
|
53
|
+
return psCommand.trim().split(/\s+/).filter(Boolean);
|
|
54
|
+
}
|
|
55
|
+
function splitArgv0(psCommand) {
|
|
56
|
+
const command = psCommand.trim();
|
|
57
|
+
const argv0 = executablePath(command);
|
|
58
|
+
return {
|
|
59
|
+
argv0,
|
|
60
|
+
args: tokensOf(command.slice(argv0.length))
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function mayContinueArgv0(tokens, test) {
|
|
64
|
+
return ABSOLUTE_PATH.test(tokens[0]) && tokens.slice(1).some((token)=>PATH_SEPARATOR.test(token) && test(token));
|
|
65
|
+
}
|
|
66
|
+
function matchArgv0(name) {
|
|
67
|
+
const lower = name.toLowerCase();
|
|
68
|
+
const test = (token)=>basenameOf(token) === lower;
|
|
69
|
+
return (psCommand)=>{
|
|
70
|
+
const tokens = tokensOf(psCommand);
|
|
71
|
+
if (tokens.length === 0) return false;
|
|
72
|
+
if (test(tokens[0])) return true;
|
|
73
|
+
return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function matchArgv0Name(name) {
|
|
77
|
+
const lower = name.toLowerCase();
|
|
78
|
+
const test = (token)=>token.toLowerCase().includes(lower);
|
|
79
|
+
return (psCommand)=>{
|
|
80
|
+
const tokens = tokensOf(psCommand);
|
|
81
|
+
if (tokens.length === 0) return false;
|
|
82
|
+
if (test(tokens[0])) return true;
|
|
83
|
+
return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function matchAnyBasename(names) {
|
|
87
|
+
const lowers = new Set(names.map((name)=>name.toLowerCase()));
|
|
88
|
+
const test = (token)=>lowers.has(basenameOf(token));
|
|
89
|
+
return (psCommand)=>{
|
|
90
|
+
const tokens = tokensOf(psCommand);
|
|
91
|
+
if (tokens.length === 0) return false;
|
|
92
|
+
if (test(tokens[0])) return true;
|
|
93
|
+
if (!tokens.slice(1).some(test)) return false;
|
|
94
|
+
if (!ABSOLUTE_PATH.test(tokens[0])) return true;
|
|
95
|
+
const { argv0, args } = splitArgv0(psCommand);
|
|
96
|
+
return test(argv0) || args.some(test);
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=runtimeProfiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/harnesses/runtimeProfiles.ts"],"sourcesContent":["import path from \"node:path\";\nimport { AGENT_TYPES, type AgentType } from \"../adapters/AgentAdapter.js\";\nimport { executablePath } from \"../utils/process.js\";\n\nexport type StartableAgentType = (typeof AGENT_TYPES)[number];\n\nexport interface HarnessRuntimeProfile {\n command: string;\n runtimeKind: string;\n discoveryAliases: readonly string[];\n matches: (psCommand: string) => boolean;\n}\n\nexport const HARNESS_RUNTIME_PROFILES: Record<StartableAgentType, HarnessRuntimeProfile> = {\n claude: profile(\"claude\", matchArgv0(\"claude\")),\n codex: profile(\"codex\", matchArgv0(\"codex\")),\n copilot: profile(\"copilot\", matchArgv0Name(\"copilot-cli\")),\n gemini_cli: profile(\"gemini\", matchAnyBasename([\"gemini\"]), [\"gemini_cli\"]),\n grok_cli: profile(\"grok\", matchArgv0(\"grok\"), [\"grok_cli\"]),\n antigravity_cli: profile(\"agy\", matchArgv0(\"agy\"), [\"antigravity\", \"antigravity_cli\"]),\n opencode: profile(\"opencode\", matchArgv0(\"opencode\")),\n pi: profile(\"pi\", matchAnyBasename([\"pi\"])),\n kiro: profile(\"kiro\", matchAnyBasename([\"kiro-cli\", \"kiro\"]), [\"kiro_cli\", \"kiro-cli\"]),\n devin: profile(\"devin\", matchArgv0(\"devin\")),\n};\n\nexport function runtimeAgentMatchesHarness(runtimeAgent: string, type: AgentType): boolean {\n if (type === \"other\") return runtimeAgent.toLowerCase() === \"other\";\n return HARNESS_RUNTIME_PROFILES[type].discoveryAliases.includes(runtimeAgent.toLowerCase());\n}\n\nfunction profile(\n runtimeKind: string,\n matches: (psCommand: string) => boolean,\n extraAliases: readonly string[] = [],\n): HarnessRuntimeProfile {\n return {\n command: runtimeKind === \"kiro\" ? \"kiro-cli\" : runtimeKind,\n runtimeKind,\n discoveryAliases: [runtimeKind, ...extraAliases],\n matches,\n };\n}\n\nconst ABSOLUTE_PATH = /^(?:\\/|[a-zA-Z]:[\\\\/])/;\nconst PATH_SEPARATOR = /[\\\\/]/;\n\nfunction basenameOf(token: string): string {\n return path.basename(token).toLowerCase();\n}\n\nfunction tokensOf(psCommand: string): string[] {\n return psCommand.trim().split(/\\s+/).filter(Boolean);\n}\n\nfunction splitArgv0(psCommand: string): { argv0: string; args: string[] } {\n const command = psCommand.trim();\n const argv0 = executablePath(command);\n return { argv0, args: tokensOf(command.slice(argv0.length)) };\n}\n\nfunction mayContinueArgv0(tokens: string[], test: (token: string) => boolean): boolean {\n return (\n ABSOLUTE_PATH.test(tokens[0]) &&\n tokens.slice(1).some((token) => PATH_SEPARATOR.test(token) && test(token))\n );\n}\n\nfunction matchArgv0(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => basenameOf(token) === lower;\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchArgv0Name(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => token.toLowerCase().includes(lower);\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchAnyBasename(names: string[]): (psCommand: string) => boolean {\n const lowers = new Set(names.map((name) => name.toLowerCase()));\n const test = (token: string) => lowers.has(basenameOf(token));\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n if (!tokens.slice(1).some(test)) return false;\n if (!ABSOLUTE_PATH.test(tokens[0])) return true;\n\n const { argv0, args } = splitArgv0(psCommand);\n return test(argv0) || args.some(test);\n };\n}\n"],"names":["path","executablePath","HARNESS_RUNTIME_PROFILES","claude","profile","matchArgv0","codex","copilot","matchArgv0Name","gemini_cli","matchAnyBasename","grok_cli","antigravity_cli","opencode","pi","kiro","devin","runtimeAgentMatchesHarness","runtimeAgent","type","toLowerCase","discoveryAliases","includes","runtimeKind","matches","extraAliases","command","ABSOLUTE_PATH","PATH_SEPARATOR","basenameOf","token","basename","tokensOf","psCommand","trim","split","filter","Boolean","splitArgv0","argv0","args","slice","length","mayContinueArgv0","tokens","test","some","name","lower","names","lowers","Set","map","has"],"mappings":"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"}
|