@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,166 @@
|
|
|
1
|
+
import { sliceTail } from "../../utils/jsonlTail.js";
|
|
2
|
+
import { SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
|
|
3
|
+
const EMPTY_STATS = {
|
|
4
|
+
lastRole: null,
|
|
5
|
+
lastTimeUpdated: 0,
|
|
6
|
+
summary: ""
|
|
7
|
+
};
|
|
8
|
+
/** Rows fetched per requested tail message; revisions/tools eat into the window. */ const TAIL_OVERFETCH = 8;
|
|
9
|
+
const TOOL_CONTENT_MAX = 500;
|
|
10
|
+
export class DevinSessionParser {
|
|
11
|
+
getConversation(db, sessionId, options) {
|
|
12
|
+
const verbose = options?.verbose ?? false;
|
|
13
|
+
const tail = options?.tail && Number.isInteger(options.tail) && options.tail > 0 ? options.tail : undefined;
|
|
14
|
+
try {
|
|
15
|
+
// LIMIT -1 = unbounded in SQLite; one query serves the full and tail paths.
|
|
16
|
+
const limit = tail ? tail * TAIL_OVERFETCH : -1;
|
|
17
|
+
const rows = db.prepare(`
|
|
18
|
+
SELECT node_id, chat_message
|
|
19
|
+
FROM message_nodes
|
|
20
|
+
WHERE session_id = ?
|
|
21
|
+
ORDER BY node_id DESC
|
|
22
|
+
LIMIT ?
|
|
23
|
+
`).all(sessionId, limit).reverse();
|
|
24
|
+
const messages = [];
|
|
25
|
+
const latestNodeByMessageId = new Map();
|
|
26
|
+
const parsed = [];
|
|
27
|
+
for (const row of rows){
|
|
28
|
+
const message = this.parseChatMessage(row.chat_message);
|
|
29
|
+
if (!message) continue;
|
|
30
|
+
parsed.push({
|
|
31
|
+
nodeId: row.node_id,
|
|
32
|
+
message
|
|
33
|
+
});
|
|
34
|
+
if (message.message_id) {
|
|
35
|
+
latestNodeByMessageId.set(message.message_id, Math.max(latestNodeByMessageId.get(message.message_id) ?? 0, row.node_id));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const { nodeId, message } of parsed){
|
|
39
|
+
if (message.message_id && latestNodeByMessageId.get(message.message_id) !== nodeId) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const role = message.role;
|
|
43
|
+
if (role === "system") continue;
|
|
44
|
+
const content = typeof message.content === "string" ? message.content : "";
|
|
45
|
+
if (role === "user") {
|
|
46
|
+
if (message.metadata?.is_user_input === false || !content.trim()) continue;
|
|
47
|
+
messages.push({
|
|
48
|
+
role: "user",
|
|
49
|
+
content
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (role === "assistant") {
|
|
54
|
+
const thinking = typeof message.thinking === "string" ? message.thinking : message.thinking?.thinking;
|
|
55
|
+
if (verbose && thinking) {
|
|
56
|
+
messages.push({
|
|
57
|
+
role: "assistant",
|
|
58
|
+
content: `[thinking] ${thinking}`
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (content.trim()) messages.push({
|
|
62
|
+
role: "assistant",
|
|
63
|
+
content
|
|
64
|
+
});
|
|
65
|
+
if (verbose) {
|
|
66
|
+
for (const call of message.tool_calls ?? []){
|
|
67
|
+
const name = call.function?.name ?? call.name ?? "tool";
|
|
68
|
+
messages.push({
|
|
69
|
+
role: "assistant",
|
|
70
|
+
content: `[tool: ${name}]`
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (role === "tool" && verbose) {
|
|
77
|
+
const label = message.name ? `[tool: ${message.name}]` : "[tool]";
|
|
78
|
+
messages.push({
|
|
79
|
+
role: "assistant",
|
|
80
|
+
content: `${label} ${truncate(content.trim(), TOOL_CONTENT_MAX)}`.trim()
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return sliceTail(messages, tail);
|
|
85
|
+
} catch {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
getSessionStats(db, sessionId) {
|
|
90
|
+
try {
|
|
91
|
+
const frontier = db.prepare(`
|
|
92
|
+
SELECT chat_message
|
|
93
|
+
FROM message_nodes
|
|
94
|
+
WHERE session_id = ?
|
|
95
|
+
ORDER BY node_id DESC
|
|
96
|
+
LIMIT 1
|
|
97
|
+
`).get(sessionId);
|
|
98
|
+
const heartbeat = db.prepare(`
|
|
99
|
+
SELECT MAX(created_at) AS maxCreated
|
|
100
|
+
FROM message_nodes
|
|
101
|
+
WHERE session_id = ?
|
|
102
|
+
`).get(sessionId);
|
|
103
|
+
return {
|
|
104
|
+
lastRole: this.parseChatMessage(frontier?.chat_message ?? "")?.role ?? null,
|
|
105
|
+
lastTimeUpdated: (heartbeat?.maxCreated ?? 0) * 1000,
|
|
106
|
+
summary: this.getLastUserPrompt(db, sessionId)
|
|
107
|
+
};
|
|
108
|
+
} catch {
|
|
109
|
+
return EMPTY_STATS;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Most recent typed prompt for the "working on" summary, matching the
|
|
114
|
+
* last-user-message convention of the other adapters.
|
|
115
|
+
*/ getLastUserPrompt(db, sessionId) {
|
|
116
|
+
return this.userPrompt(db, sessionId, "DESC");
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* First typed prompt for session-list identity (`firstUserMessage`).
|
|
120
|
+
*/ getFirstUserMessage(db, sessionId) {
|
|
121
|
+
return this.userPrompt(db, sessionId, "ASC");
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Typed prompt in the given direction. `prompt_history` is authoritative;
|
|
125
|
+
* shell `!` commands and `/` slash commands are skipped. Falls back to a
|
|
126
|
+
* bounded `is_user_input` node scan in the same direction.
|
|
127
|
+
*/ userPrompt(db, sessionId, direction) {
|
|
128
|
+
try {
|
|
129
|
+
const prompt = db.prepare(`
|
|
130
|
+
SELECT content
|
|
131
|
+
FROM prompt_history
|
|
132
|
+
WHERE session_id = ? AND is_shell = 0 AND content NOT LIKE '/%'
|
|
133
|
+
ORDER BY timestamp ${direction}
|
|
134
|
+
LIMIT 1
|
|
135
|
+
`).get(sessionId);
|
|
136
|
+
if (prompt?.content?.trim()) return truncate(prompt.content.trim(), SUMMARY_MAX_LENGTH);
|
|
137
|
+
} catch {
|
|
138
|
+
/* fall through to message_nodes */ }
|
|
139
|
+
try {
|
|
140
|
+
const rows = db.prepare(`
|
|
141
|
+
SELECT chat_message
|
|
142
|
+
FROM message_nodes
|
|
143
|
+
WHERE session_id = ? AND json_extract(chat_message, '$.role') = 'user'
|
|
144
|
+
ORDER BY node_id ${direction}
|
|
145
|
+
LIMIT 8
|
|
146
|
+
`).all(sessionId);
|
|
147
|
+
for (const row of rows){
|
|
148
|
+
const message = this.parseChatMessage(row.chat_message);
|
|
149
|
+
if (message?.role === "user" && message.metadata?.is_user_input !== false && typeof message.content === "string" && message.content.trim()) {
|
|
150
|
+
return truncate(message.content.trim(), SUMMARY_MAX_LENGTH);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
} catch {
|
|
154
|
+
/* ignore */ }
|
|
155
|
+
return "";
|
|
156
|
+
}
|
|
157
|
+
parseChatMessage(raw) {
|
|
158
|
+
try {
|
|
159
|
+
return JSON.parse(raw);
|
|
160
|
+
} catch {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=DevinSessionParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/devin/DevinSessionParser.ts"],"sourcesContent":["import type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { sliceTail } from \"../../utils/jsonlTail.js\";\nimport { SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\nimport type Database from \"better-sqlite3\";\n\nexport interface DevinSessionStats {\n lastRole: string | null;\n /** Epoch milliseconds of the newest message node. */\n lastTimeUpdated: number;\n summary: string;\n}\n\ninterface DevinChatMessage {\n message_id?: string;\n role?: string;\n content?: unknown;\n tool_calls?: { name?: string; function?: { name?: string } }[];\n thinking?: { thinking?: string } | string;\n name?: string;\n metadata?: { is_user_input?: boolean };\n}\n\ninterface MessageNodeRow {\n node_id: number;\n chat_message: string;\n}\n\nconst EMPTY_STATS: DevinSessionStats = {\n lastRole: null,\n lastTimeUpdated: 0,\n summary: \"\",\n};\n\n/** Rows fetched per requested tail message; revisions/tools eat into the window. */\nconst TAIL_OVERFETCH = 8;\nconst TOOL_CONTENT_MAX = 500;\n\nexport class DevinSessionParser {\n getConversation(\n db: Database.Database,\n sessionId: string,\n options?: ConversationOptions,\n ): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const tail =\n options?.tail && Number.isInteger(options.tail) && options.tail > 0\n ? options.tail\n : undefined;\n\n try {\n // LIMIT -1 = unbounded in SQLite; one query serves the full and tail paths.\n const limit = tail ? tail * TAIL_OVERFETCH : -1;\n const rows = db\n .prepare<[string, number], MessageNodeRow>(`\n SELECT node_id, chat_message\n FROM message_nodes\n WHERE session_id = ?\n ORDER BY node_id DESC\n LIMIT ?\n `)\n .all(sessionId, limit)\n .reverse();\n\n const messages: ConversationMessage[] = [];\n const latestNodeByMessageId = new Map<string, number>();\n const parsed: { nodeId: number; message: DevinChatMessage }[] = [];\n\n for (const row of rows) {\n const message = this.parseChatMessage(row.chat_message);\n if (!message) continue;\n parsed.push({ nodeId: row.node_id, message });\n if (message.message_id) {\n latestNodeByMessageId.set(\n message.message_id,\n Math.max(latestNodeByMessageId.get(message.message_id) ?? 0, row.node_id),\n );\n }\n }\n\n for (const { nodeId, message } of parsed) {\n if (\n message.message_id &&\n latestNodeByMessageId.get(message.message_id) !== nodeId\n ) {\n continue;\n }\n\n const role = message.role;\n if (role === \"system\") continue;\n\n const content = typeof message.content === \"string\" ? message.content : \"\";\n\n if (role === \"user\") {\n if (message.metadata?.is_user_input === false || !content.trim()) continue;\n messages.push({ role: \"user\", content });\n continue;\n }\n\n if (role === \"assistant\") {\n const thinking =\n typeof message.thinking === \"string\"\n ? message.thinking\n : message.thinking?.thinking;\n if (verbose && thinking) {\n messages.push({ role: \"assistant\", content: `[thinking] ${thinking}` });\n }\n if (content.trim()) messages.push({ role: \"assistant\", content });\n if (verbose) {\n for (const call of message.tool_calls ?? []) {\n const name = call.function?.name ?? call.name ?? \"tool\";\n messages.push({ role: \"assistant\", content: `[tool: ${name}]` });\n }\n }\n continue;\n }\n\n if (role === \"tool\" && verbose) {\n const label = message.name ? `[tool: ${message.name}]` : \"[tool]\";\n messages.push({\n role: \"assistant\",\n content: `${label} ${truncate(content.trim(), TOOL_CONTENT_MAX)}`.trim(),\n });\n }\n }\n\n return sliceTail(messages, tail);\n } catch {\n return [];\n }\n }\n\n getSessionStats(db: Database.Database, sessionId: string): DevinSessionStats {\n try {\n const frontier = db\n .prepare<[string], { chat_message: string }>(`\n SELECT chat_message\n FROM message_nodes\n WHERE session_id = ?\n ORDER BY node_id DESC\n LIMIT 1\n `)\n .get(sessionId);\n\n const heartbeat = db\n .prepare<[string], { maxCreated: number | null }>(`\n SELECT MAX(created_at) AS maxCreated\n FROM message_nodes\n WHERE session_id = ?\n `)\n .get(sessionId);\n\n return {\n lastRole: this.parseChatMessage(frontier?.chat_message ?? \"\")?.role ?? null,\n lastTimeUpdated: (heartbeat?.maxCreated ?? 0) * 1000,\n summary: this.getLastUserPrompt(db, sessionId),\n };\n } catch {\n return EMPTY_STATS;\n }\n }\n\n /**\n * Most recent typed prompt for the \"working on\" summary, matching the\n * last-user-message convention of the other adapters.\n */\n getLastUserPrompt(db: Database.Database, sessionId: string): string {\n return this.userPrompt(db, sessionId, \"DESC\");\n }\n\n /**\n * First typed prompt for session-list identity (`firstUserMessage`).\n */\n getFirstUserMessage(db: Database.Database, sessionId: string): string {\n return this.userPrompt(db, sessionId, \"ASC\");\n }\n\n /**\n * Typed prompt in the given direction. `prompt_history` is authoritative;\n * shell `!` commands and `/` slash commands are skipped. Falls back to a\n * bounded `is_user_input` node scan in the same direction.\n */\n private userPrompt(\n db: Database.Database,\n sessionId: string,\n direction: \"ASC\" | \"DESC\",\n ): string {\n try {\n const prompt = db\n .prepare<[string], { content: string }>(`\n SELECT content\n FROM prompt_history\n WHERE session_id = ? AND is_shell = 0 AND content NOT LIKE '/%'\n ORDER BY timestamp ${direction}\n LIMIT 1\n `)\n .get(sessionId);\n if (prompt?.content?.trim()) return truncate(prompt.content.trim(), SUMMARY_MAX_LENGTH);\n } catch {\n /* fall through to message_nodes */\n }\n\n try {\n const rows = db\n .prepare<[string], { chat_message: string }>(`\n SELECT chat_message\n FROM message_nodes\n WHERE session_id = ? AND json_extract(chat_message, '$.role') = 'user'\n ORDER BY node_id ${direction}\n LIMIT 8\n `)\n .all(sessionId);\n for (const row of rows) {\n const message = this.parseChatMessage(row.chat_message);\n if (\n message?.role === \"user\" &&\n message.metadata?.is_user_input !== false &&\n typeof message.content === \"string\" &&\n message.content.trim()\n ) {\n return truncate(message.content.trim(), SUMMARY_MAX_LENGTH);\n }\n }\n } catch {\n /* ignore */\n }\n return \"\";\n }\n\n private parseChatMessage(raw: string): DevinChatMessage | null {\n try {\n return JSON.parse(raw) as DevinChatMessage;\n } catch {\n return null;\n }\n }\n}\n"],"names":["sliceTail","SUMMARY_MAX_LENGTH","truncate","EMPTY_STATS","lastRole","lastTimeUpdated","summary","TAIL_OVERFETCH","TOOL_CONTENT_MAX","DevinSessionParser","getConversation","db","sessionId","options","verbose","tail","Number","isInteger","undefined","limit","rows","prepare","all","reverse","messages","latestNodeByMessageId","Map","parsed","row","message","parseChatMessage","chat_message","push","nodeId","node_id","message_id","set","Math","max","get","role","content","metadata","is_user_input","trim","thinking","call","tool_calls","name","function","label","getSessionStats","frontier","heartbeat","maxCreated","getLastUserPrompt","userPrompt","getFirstUserMessage","direction","prompt","raw","JSON","parse"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/devin/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AA4B/B,eAAO,MAAM,cAAc,EAAE,uBAG5B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const LOGGED_IN_PATTERN = /^Logged in/m;
|
|
2
|
+
async function authCheck(runtime) {
|
|
3
|
+
try {
|
|
4
|
+
const result = await runtime.runCommand("devin", [
|
|
5
|
+
"auth",
|
|
6
|
+
"status"
|
|
7
|
+
]);
|
|
8
|
+
const authenticated = LOGGED_IN_PATTERN.test(result.stdout);
|
|
9
|
+
return {
|
|
10
|
+
state: authenticated ? "authenticated" : "unauthenticated",
|
|
11
|
+
source: "devin auth status",
|
|
12
|
+
provider: null,
|
|
13
|
+
availableProviders: authenticated ? [
|
|
14
|
+
"devin"
|
|
15
|
+
] : [],
|
|
16
|
+
status: authenticated ? "pass" : "fail",
|
|
17
|
+
errors: authenticated ? [] : [
|
|
18
|
+
"Devin is not logged in"
|
|
19
|
+
]
|
|
20
|
+
};
|
|
21
|
+
} catch {
|
|
22
|
+
return {
|
|
23
|
+
state: "unknown",
|
|
24
|
+
source: "devin auth status",
|
|
25
|
+
provider: null,
|
|
26
|
+
availableProviders: [],
|
|
27
|
+
status: "warn",
|
|
28
|
+
errors: [
|
|
29
|
+
"Devin authentication probe failed"
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export const devinReadiness = {
|
|
35
|
+
configDir: ".config/devin",
|
|
36
|
+
auth: authCheck
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/devin/readiness.ts"],"sourcesContent":["import type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nconst LOGGED_IN_PATTERN = /^Logged in/m;\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const result = await runtime.runCommand(\"devin\", [\"auth\", \"status\"]);\n const authenticated = LOGGED_IN_PATTERN.test(result.stdout);\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: \"devin auth status\",\n provider: null,\n availableProviders: authenticated ? [\"devin\"] : [],\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"Devin is not logged in\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"devin auth status\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Devin authentication probe failed\"],\n };\n }\n}\n\nexport const devinReadiness: HarnessReadinessProfile = {\n configDir: \".config/devin\",\n auth: authCheck,\n};\n"],"names":["LOGGED_IN_PATTERN","authCheck","runtime","result","runCommand","authenticated","test","stdout","state","source","provider","availableProviders","status","errors","devinReadiness","configDir","auth"],"mappings":"AAMA,MAAMA,oBAAoB;AAE1B,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,SAAS,MAAMD,QAAQE,UAAU,CAAC,SAAS;YAAC;YAAQ;SAAS;QACnE,MAAMC,gBAAgBL,kBAAkBM,IAAI,CAACH,OAAOI,MAAM;QAC1D,OAAO;YACLC,OAAOH,gBAAgB,kBAAkB;YACzCI,QAAQ;YACRC,UAAU;YACVC,oBAAoBN,gBAAgB;gBAAC;aAAQ,GAAG,EAAE;YAClDO,QAAQP,gBAAgB,SAAS;YACjCQ,QAAQR,gBAAgB,EAAE,GAAG;gBAAC;aAAyB;QACzD;IACF,EAAE,OAAM;QACN,OAAO;YACLG,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAAoC;QAC/C;IACF;AACF;AAEA,OAAO,MAAMC,iBAA0C;IACrDC,WAAW;IACXC,MAAMf;AACR,EAAE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAYhE;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAatD"}
|
package/dist/harnesses/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { GrokCliAdapter } from "./grok/GrokCliAdapter.js";
|
|
|
7
7
|
import { KiroAdapter } from "./kiro/KiroAdapter.js";
|
|
8
8
|
import { OpenCodeAdapter } from "./opencode/OpenCodeAdapter.js";
|
|
9
9
|
import { PiAdapter } from "./pi/PiAdapter.js";
|
|
10
|
+
import { DevinAdapter } from "./devin/DevinAdapter.js";
|
|
10
11
|
/**
|
|
11
12
|
* One instance of every built-in harness adapter, in registration order
|
|
12
13
|
* (which is also the order agents are listed in). Register a new harness here.
|
|
@@ -20,7 +21,8 @@ import { PiAdapter } from "./pi/PiAdapter.js";
|
|
|
20
21
|
new KiroAdapter(),
|
|
21
22
|
new AntigravityCliAdapter(),
|
|
22
23
|
new OpenCodeAdapter(),
|
|
23
|
-
new PiAdapter()
|
|
24
|
+
new PiAdapter(),
|
|
25
|
+
new DevinAdapter()
|
|
24
26
|
];
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/harnesses/index.ts"],"sourcesContent":["import type { AgentAdapter } from \"../adapters/AgentAdapter.js\";\nimport { AntigravityCliAdapter } from \"./antigravity/AntigravityCliAdapter.js\";\nimport { ClaudeCodeAdapter } from \"./claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"./codex/CodexAdapter.js\";\nimport { CopilotAdapter } from \"./copilot/CopilotAdapter.js\";\nimport { GeminiCliAdapter } from \"./gemini/GeminiCliAdapter.js\";\nimport { GrokCliAdapter } from \"./grok/GrokCliAdapter.js\";\nimport { KiroAdapter } from \"./kiro/KiroAdapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/OpenCodeAdapter.js\";\nimport { PiAdapter } from \"./pi/PiAdapter.js\";\n\n/**\n * One instance of every built-in harness adapter, in registration order\n * (which is also the order agents are listed in). Register a new harness here.\n */\nexport function createBuiltinAdapters(): AgentAdapter[] {\n return [\n new ClaudeCodeAdapter(),\n new CodexAdapter(),\n new CopilotAdapter(),\n new GeminiCliAdapter(),\n new GrokCliAdapter(),\n new KiroAdapter(),\n new AntigravityCliAdapter(),\n new OpenCodeAdapter(),\n new PiAdapter(),\n ];\n}\n"],"names":["AntigravityCliAdapter","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","KiroAdapter","OpenCodeAdapter","PiAdapter","createBuiltinAdapters"],"mappings":"AACA,SAASA,qBAAqB,QAAQ,yCAAyC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,oBAAoB;
|
|
1
|
+
{"version":3,"sources":["../../src/harnesses/index.ts"],"sourcesContent":["import type { AgentAdapter } from \"../adapters/AgentAdapter.js\";\nimport { AntigravityCliAdapter } from \"./antigravity/AntigravityCliAdapter.js\";\nimport { ClaudeCodeAdapter } from \"./claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"./codex/CodexAdapter.js\";\nimport { CopilotAdapter } from \"./copilot/CopilotAdapter.js\";\nimport { GeminiCliAdapter } from \"./gemini/GeminiCliAdapter.js\";\nimport { GrokCliAdapter } from \"./grok/GrokCliAdapter.js\";\nimport { KiroAdapter } from \"./kiro/KiroAdapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/OpenCodeAdapter.js\";\nimport { PiAdapter } from \"./pi/PiAdapter.js\";\nimport { DevinAdapter } from \"./devin/DevinAdapter.js\";\n\n/**\n * One instance of every built-in harness adapter, in registration order\n * (which is also the order agents are listed in). Register a new harness here.\n */\nexport function createBuiltinAdapters(): AgentAdapter[] {\n return [\n new ClaudeCodeAdapter(),\n new CodexAdapter(),\n new CopilotAdapter(),\n new GeminiCliAdapter(),\n new GrokCliAdapter(),\n new KiroAdapter(),\n new AntigravityCliAdapter(),\n new OpenCodeAdapter(),\n new PiAdapter(),\n new DevinAdapter(),\n ];\n}\n"],"names":["AntigravityCliAdapter","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","KiroAdapter","OpenCodeAdapter","PiAdapter","DevinAdapter","createBuiltinAdapters"],"mappings":"AACA,SAASA,qBAAqB,QAAQ,yCAAyC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,YAAY,QAAQ,0BAA0B;AAEvD;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO;QACL,IAAIT;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIN;QACJ,IAAIO;QACJ,IAAIC;QACJ,IAAIC;KACL;AACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/opencode/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AAwC/B,eAAO,MAAM,iBAAiB,EAAE,uBAG/B,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
const ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\[[0-?]*[ -/]*[@-~]`, "g");
|
|
2
|
+
function authProviderNames(output) {
|
|
3
|
+
const names = new Set();
|
|
4
|
+
for (const line of output.replace(ANSI_ESCAPE_PATTERN, "").split(/\r?\n/)){
|
|
5
|
+
const match = /^\s*[●*+-]\s+(.+?)\s*$/.exec(line);
|
|
6
|
+
if (!match) continue;
|
|
7
|
+
const name = match[1].replace(/\s+(?:api|oauth|[\w-]*token|[A-Z][A-Z0-9_]+)$/i, "").trim();
|
|
8
|
+
if (name && !/^\d+\s+(?:credentials?|environment variables?)$/i.test(name)) names.add(name);
|
|
9
|
+
}
|
|
10
|
+
return [
|
|
11
|
+
...names
|
|
12
|
+
].sort();
|
|
13
|
+
}
|
|
14
|
+
async function authCheck(runtime) {
|
|
15
|
+
try {
|
|
16
|
+
const result = await runtime.runCommand("opencode", [
|
|
17
|
+
"auth",
|
|
18
|
+
"list"
|
|
19
|
+
]);
|
|
20
|
+
const availableProviders = authProviderNames(result.stdout);
|
|
21
|
+
const authenticated = availableProviders.length > 0;
|
|
22
|
+
return {
|
|
23
|
+
state: authenticated ? "authenticated" : "unauthenticated",
|
|
24
|
+
source: "opencode auth list",
|
|
25
|
+
provider: null,
|
|
26
|
+
availableProviders,
|
|
27
|
+
status: authenticated ? "pass" : "fail",
|
|
28
|
+
errors: authenticated ? [] : [
|
|
29
|
+
"OpenCode has no configured credentials"
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
} catch {
|
|
33
|
+
return {
|
|
34
|
+
state: "unknown",
|
|
35
|
+
source: "opencode auth list",
|
|
36
|
+
provider: null,
|
|
37
|
+
availableProviders: [],
|
|
38
|
+
status: "warn",
|
|
39
|
+
errors: [
|
|
40
|
+
"OpenCode authentication probe failed"
|
|
41
|
+
]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export const openCodeReadiness = {
|
|
46
|
+
configDir: ".config/opencode",
|
|
47
|
+
auth: authCheck
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/opencode/readiness.ts"],"sourcesContent":["import type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nconst ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-?]*[ -/]*[@-~]`, \"g\");\n\nfunction authProviderNames(output: string): string[] {\n const names = new Set<string>();\n for (const line of output.replace(ANSI_ESCAPE_PATTERN, \"\").split(/\\r?\\n/)) {\n const match = /^\\s*[●*+-]\\s+(.+?)\\s*$/.exec(line);\n if (!match) continue;\n const name = match[1].replace(/\\s+(?:api|oauth|[\\w-]*token|[A-Z][A-Z0-9_]+)$/i, \"\").trim();\n if (name && !/^\\d+\\s+(?:credentials?|environment variables?)$/i.test(name)) names.add(name);\n }\n return [...names].sort();\n}\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const result = await runtime.runCommand(\"opencode\", [\"auth\", \"list\"]);\n const availableProviders = authProviderNames(result.stdout);\n const authenticated = availableProviders.length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders,\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"OpenCode has no configured credentials\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"OpenCode authentication probe failed\"],\n };\n }\n}\n\nexport const openCodeReadiness: HarnessReadinessProfile = {\n configDir: \".config/opencode\",\n auth: authCheck,\n};\n"],"names":["ANSI_ESCAPE_PATTERN","RegExp","String","fromCharCode","authProviderNames","output","names","Set","line","replace","split","match","exec","name","trim","test","add","sort","authCheck","runtime","result","runCommand","availableProviders","stdout","authenticated","length","state","source","provider","status","errors","openCodeReadiness","configDir","auth"],"mappings":"AAMA,MAAMA,sBAAsB,IAAIC,OAAO,GAAGC,OAAOC,YAAY,CAAC,IAAI,oBAAoB,CAAC,EAAE;AAEzF,SAASC,kBAAkBC,MAAc;IACvC,MAAMC,QAAQ,IAAIC;IAClB,KAAK,MAAMC,QAAQH,OAAOI,OAAO,CAACT,qBAAqB,IAAIU,KAAK,CAAC,SAAU;QACzE,MAAMC,QAAQ,yBAAyBC,IAAI,CAACJ;QAC5C,IAAI,CAACG,OAAO;QACZ,MAAME,OAAOF,KAAK,CAAC,EAAE,CAACF,OAAO,CAAC,kDAAkD,IAAIK,IAAI;QACxF,IAAID,QAAQ,CAAC,mDAAmDE,IAAI,CAACF,OAAOP,MAAMU,GAAG,CAACH;IACxF;IACA,OAAO;WAAIP;KAAM,CAACW,IAAI;AACxB;AAEA,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,SAAS,MAAMD,QAAQE,UAAU,CAAC,YAAY;YAAC;YAAQ;SAAO;QACpE,MAAMC,qBAAqBlB,kBAAkBgB,OAAOG,MAAM;QAC1D,MAAMC,gBAAgBF,mBAAmBG,MAAM,GAAG;QAClD,OAAO;YACLC,OAAOF,gBAAgB,kBAAkB;YACzCG,QAAQ;YACRC,UAAU;YACVN;YACAO,QAAQL,gBAAgB,SAAS;YACjCM,QAAQN,gBAAgB,EAAE,GAAG;gBAAC;aAAyC;QACzE;IACF,EAAE,OAAM;QACN,OAAO;YACLE,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVN,oBAAoB,EAAE;YACtBO,QAAQ;YACRC,QAAQ;gBAAC;aAAuC;QAClD;IACF;AACF;AAEA,OAAO,MAAMC,oBAA6C;IACxDC,WAAW;IACXC,MAAMf;AACR,EAAE"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type PiCredentialOptions = {
|
|
2
|
+
env?: NodeJS.ProcessEnv;
|
|
3
|
+
readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
|
|
4
|
+
};
|
|
5
|
+
export type PiAnthropicCredential = {
|
|
6
|
+
kind: "oauth";
|
|
7
|
+
access: string;
|
|
8
|
+
expiresMs: number | null;
|
|
9
|
+
};
|
|
10
|
+
export type PiOpenAiCredential = {
|
|
11
|
+
kind: "platform";
|
|
12
|
+
key: string;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "oauth";
|
|
15
|
+
access: string;
|
|
16
|
+
accountId: string;
|
|
17
|
+
expiresMs: number | null;
|
|
18
|
+
};
|
|
19
|
+
export declare function resolvePiAnthropicCredential(options?: PiCredentialOptions): Promise<PiAnthropicCredential>;
|
|
20
|
+
export declare function resolvePiOpenAiCredential(options?: PiCredentialOptions): Promise<PiOpenAiCredential>;
|
|
21
|
+
export declare function resolvePiZaiApiKey(options?: PiCredentialOptions): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/credentials.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AA+BnF,wBAAsB,4BAA4B,CAChD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAoBhC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAgC7B;AAED,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB3F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const OPENAI_CREDENTIALS_MISSING = "OpenAI credentials not found; set OPENAI_API_KEY, configure the Pi openai provider, or log in to OpenAI via Pi";
|
|
5
|
+
const ZAI_CREDENTIAL_MISSING = "z.ai API key not found; set Z_AI_API_KEY or configure Pi provider zai";
|
|
6
|
+
function record(value) {
|
|
7
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
8
|
+
}
|
|
9
|
+
function nonEmptyText(value) {
|
|
10
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
11
|
+
}
|
|
12
|
+
function epochMilliseconds(value) {
|
|
13
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return null;
|
|
14
|
+
return value > 1e12 ? value : value * 1000;
|
|
15
|
+
}
|
|
16
|
+
async function readPiAuthRoot(options) {
|
|
17
|
+
const env = options.env ?? process.env;
|
|
18
|
+
const authPath = join(env.HOME || homedir(), ".pi", "agent", "auth.json");
|
|
19
|
+
const contents = await (options.readFile ?? readFile)(authPath, "utf8");
|
|
20
|
+
const parsed = record(JSON.parse(contents));
|
|
21
|
+
if (!parsed) throw new Error("Pi auth file is malformed");
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
export async function resolvePiAnthropicCredential(options = {}) {
|
|
25
|
+
let root;
|
|
26
|
+
try {
|
|
27
|
+
root = await readPiAuthRoot(options);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
if (record(error)?.code === "ENOENT") {
|
|
30
|
+
throw new Error("Pi Anthropic OAuth credentials not found");
|
|
31
|
+
}
|
|
32
|
+
throw new Error("Pi Anthropic auth file is malformed");
|
|
33
|
+
}
|
|
34
|
+
const credential = record(root.anthropic);
|
|
35
|
+
if (!credential) throw new Error("Pi Anthropic OAuth credentials not found");
|
|
36
|
+
const access = credential.type === "oauth" ? nonEmptyText(credential.access) : null;
|
|
37
|
+
if (!access) throw new Error("Pi Anthropic OAuth credential is malformed");
|
|
38
|
+
return {
|
|
39
|
+
kind: "oauth",
|
|
40
|
+
access,
|
|
41
|
+
expiresMs: epochMilliseconds(credential.expires)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function resolvePiOpenAiCredential(options = {}) {
|
|
45
|
+
const env = options.env ?? process.env;
|
|
46
|
+
const environmentKey = nonEmptyText(env.OPENAI_API_KEY);
|
|
47
|
+
if (environmentKey) return {
|
|
48
|
+
kind: "platform",
|
|
49
|
+
key: environmentKey
|
|
50
|
+
};
|
|
51
|
+
let root;
|
|
52
|
+
try {
|
|
53
|
+
root = await readPiAuthRoot(options);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (record(error)?.code === "ENOENT") throw new Error(OPENAI_CREDENTIALS_MISSING);
|
|
56
|
+
throw new Error("OpenAI Pi auth file is malformed");
|
|
57
|
+
}
|
|
58
|
+
const platform = record(root.openai);
|
|
59
|
+
if (platform) {
|
|
60
|
+
const key = platform.type === "api_key" ? nonEmptyText(platform.key) : null;
|
|
61
|
+
if (!key) throw new Error("OpenAI Pi auth file has a malformed openai credential");
|
|
62
|
+
return {
|
|
63
|
+
kind: "platform",
|
|
64
|
+
key
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const oauth = record(root["openai-codex"]);
|
|
68
|
+
const access = oauth?.type === "oauth" ? nonEmptyText(oauth.access) : null;
|
|
69
|
+
const accountId = nonEmptyText(oauth?.accountId);
|
|
70
|
+
if (oauth && access && accountId) {
|
|
71
|
+
return {
|
|
72
|
+
kind: "oauth",
|
|
73
|
+
access,
|
|
74
|
+
accountId,
|
|
75
|
+
expiresMs: epochMilliseconds(oauth.expires)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
throw new Error(OPENAI_CREDENTIALS_MISSING);
|
|
79
|
+
}
|
|
80
|
+
export async function resolvePiZaiApiKey(options = {}) {
|
|
81
|
+
const env = options.env ?? process.env;
|
|
82
|
+
const environmentKey = nonEmptyText(env.Z_AI_API_KEY);
|
|
83
|
+
if (environmentKey) return environmentKey;
|
|
84
|
+
let root;
|
|
85
|
+
try {
|
|
86
|
+
root = await readPiAuthRoot(options);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (record(error)?.code === "ENOENT") throw new Error(ZAI_CREDENTIAL_MISSING);
|
|
89
|
+
throw new Error("z.ai Pi auth file is malformed");
|
|
90
|
+
}
|
|
91
|
+
const credential = record(root.zai);
|
|
92
|
+
if (!credential) throw new Error(ZAI_CREDENTIAL_MISSING);
|
|
93
|
+
const key = credential.type === "api_key" ? nonEmptyText(credential.key) : null;
|
|
94
|
+
if (!key) throw new Error("z.ai Pi auth file has a malformed zai credential");
|
|
95
|
+
return key;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/credentials.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport type PiCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n};\n\nexport type PiAnthropicCredential = {\n kind: \"oauth\";\n access: string;\n expiresMs: number | null;\n};\n\nexport type PiOpenAiCredential =\n | { kind: \"platform\"; key: string }\n | { kind: \"oauth\"; access: string; accountId: string; expiresMs: number | null };\n\nconst OPENAI_CREDENTIALS_MISSING =\n \"OpenAI credentials not found; set OPENAI_API_KEY, configure the Pi openai provider, or log in to OpenAI via Pi\";\nconst ZAI_CREDENTIAL_MISSING =\n \"z.ai API key not found; set Z_AI_API_KEY or configure Pi provider zai\";\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction epochMilliseconds(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return null;\n return value > 1e12 ? value : value * 1000;\n}\n\nasync function readPiAuthRoot(options: PiCredentialOptions): Promise<UnknownRecord> {\n const env = options.env ?? process.env;\n const authPath = join(env.HOME || homedir(), \".pi\", \"agent\", \"auth.json\");\n const contents = await (options.readFile ?? readFile)(authPath, \"utf8\");\n const parsed = record(JSON.parse(contents));\n if (!parsed) throw new Error(\"Pi auth file is malformed\");\n return parsed;\n}\n\nexport async function resolvePiAnthropicCredential(\n options: PiCredentialOptions = {},\n): Promise<PiAnthropicCredential> {\n let root: UnknownRecord;\n try {\n root = await readPiAuthRoot(options);\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") {\n throw new Error(\"Pi Anthropic OAuth credentials not found\");\n }\n throw new Error(\"Pi Anthropic auth file is malformed\");\n }\n\n const credential = record(root.anthropic);\n if (!credential) throw new Error(\"Pi Anthropic OAuth credentials not found\");\n const access = credential.type === \"oauth\" ? nonEmptyText(credential.access) : null;\n if (!access) throw new Error(\"Pi Anthropic OAuth credential is malformed\");\n return {\n kind: \"oauth\",\n access,\n expiresMs: epochMilliseconds(credential.expires),\n };\n}\n\nexport async function resolvePiOpenAiCredential(\n options: PiCredentialOptions = {},\n): Promise<PiOpenAiCredential> {\n const env = options.env ?? process.env;\n const environmentKey = nonEmptyText(env.OPENAI_API_KEY);\n if (environmentKey) return { kind: \"platform\", key: environmentKey };\n\n let root: UnknownRecord;\n try {\n root = await readPiAuthRoot(options);\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") throw new Error(OPENAI_CREDENTIALS_MISSING);\n throw new Error(\"OpenAI Pi auth file is malformed\");\n }\n\n const platform = record(root.openai);\n if (platform) {\n const key = platform.type === \"api_key\" ? nonEmptyText(platform.key) : null;\n if (!key) throw new Error(\"OpenAI Pi auth file has a malformed openai credential\");\n return { kind: \"platform\", key };\n }\n\n const oauth = record(root[\"openai-codex\"]);\n const access = oauth?.type === \"oauth\" ? nonEmptyText(oauth.access) : null;\n const accountId = nonEmptyText(oauth?.accountId);\n if (oauth && access && accountId) {\n return {\n kind: \"oauth\",\n access,\n accountId,\n expiresMs: epochMilliseconds(oauth.expires),\n };\n }\n throw new Error(OPENAI_CREDENTIALS_MISSING);\n}\n\nexport async function resolvePiZaiApiKey(options: PiCredentialOptions = {}): Promise<string> {\n const env = options.env ?? process.env;\n const environmentKey = nonEmptyText(env.Z_AI_API_KEY);\n if (environmentKey) return environmentKey;\n\n let root: UnknownRecord;\n try {\n root = await readPiAuthRoot(options);\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") throw new Error(ZAI_CREDENTIAL_MISSING);\n throw new Error(\"z.ai Pi auth file is malformed\");\n }\n\n const credential = record(root.zai);\n if (!credential) throw new Error(ZAI_CREDENTIAL_MISSING);\n const key = credential.type === \"api_key\" ? nonEmptyText(credential.key) : null;\n if (!key) throw new Error(\"z.ai Pi auth file has a malformed zai credential\");\n return key;\n}\n"],"names":["readFile","homedir","join","OPENAI_CREDENTIALS_MISSING","ZAI_CREDENTIAL_MISSING","record","value","Array","isArray","nonEmptyText","trim","epochMilliseconds","Number","isFinite","readPiAuthRoot","options","env","process","authPath","HOME","contents","parsed","JSON","parse","Error","resolvePiAnthropicCredential","root","error","code","credential","anthropic","access","type","kind","expiresMs","expires","resolvePiOpenAiCredential","environmentKey","OPENAI_API_KEY","key","platform","openai","oauth","accountId","resolvePiZaiApiKey","Z_AI_API_KEY","zai"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/readiness.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAsF/B,eAAO,MAAM,WAAW,EAAE,uBAIzB,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { displayHome, mappingCheck, nonEmpty, record, worstReadinessStatus } from "../readiness/checks.js";
|
|
3
|
+
function providerNames(parsed) {
|
|
4
|
+
const names = new Set();
|
|
5
|
+
if (nonEmpty(parsed.provider)) names.add(parsed.provider.trim());
|
|
6
|
+
const providers = record(parsed.providers);
|
|
7
|
+
if (providers) {
|
|
8
|
+
for (const name of Object.keys(providers)){
|
|
9
|
+
if (name.trim()) names.add(name);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
for (const [name, value] of Object.entries(parsed)){
|
|
13
|
+
if (name === "provider" || name === "providers") continue;
|
|
14
|
+
if (record(value) && name.trim()) names.add(name);
|
|
15
|
+
}
|
|
16
|
+
return [
|
|
17
|
+
...names
|
|
18
|
+
].sort();
|
|
19
|
+
}
|
|
20
|
+
async function authCheck(runtime) {
|
|
21
|
+
const sourcePath = join(runtime.homeDir, ".pi", "agent", "auth.json");
|
|
22
|
+
try {
|
|
23
|
+
const parsed = record(JSON.parse(await runtime.readFile(sourcePath)));
|
|
24
|
+
if (!parsed) throw new Error("invalid");
|
|
25
|
+
const availableProviders = providerNames(parsed);
|
|
26
|
+
const provider = nonEmpty(parsed.provider) ? parsed.provider.trim() : null;
|
|
27
|
+
const authenticated = availableProviders.length > 0;
|
|
28
|
+
return {
|
|
29
|
+
state: authenticated ? "authenticated" : "unauthenticated",
|
|
30
|
+
source: displayHome(sourcePath, runtime.homeDir),
|
|
31
|
+
provider,
|
|
32
|
+
availableProviders,
|
|
33
|
+
status: authenticated ? "pass" : "fail",
|
|
34
|
+
errors: authenticated ? [] : [
|
|
35
|
+
"Pi credential file has no configured model provider"
|
|
36
|
+
]
|
|
37
|
+
};
|
|
38
|
+
} catch {
|
|
39
|
+
return {
|
|
40
|
+
state: "unauthenticated",
|
|
41
|
+
source: displayHome(sourcePath, runtime.homeDir),
|
|
42
|
+
provider: null,
|
|
43
|
+
availableProviders: [],
|
|
44
|
+
status: "fail",
|
|
45
|
+
errors: [
|
|
46
|
+
"Pi credential file is missing or invalid"
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function isSessionTrackerListed(output) {
|
|
52
|
+
const normalized = output.toLowerCase();
|
|
53
|
+
return normalized.includes("@ai-devkit/pi-session-tracker") || /\bsession[\s-]+tracker\b/.test(normalized);
|
|
54
|
+
}
|
|
55
|
+
async function integrationCheck(runtime) {
|
|
56
|
+
let installed = false;
|
|
57
|
+
try {
|
|
58
|
+
const result = await runtime.runCommand("pi", [
|
|
59
|
+
"list"
|
|
60
|
+
]);
|
|
61
|
+
installed = isSessionTrackerListed(result.stdout);
|
|
62
|
+
} catch {
|
|
63
|
+
// Safe fixed result below.
|
|
64
|
+
}
|
|
65
|
+
const mapping = await mappingCheck(join(runtime.homeDir, ".pi", "agent", "sessions.json"), runtime);
|
|
66
|
+
const mappingStatus = mapping.valid || !mapping.present ? "pass" : "fail";
|
|
67
|
+
const status = worstReadinessStatus([
|
|
68
|
+
installed ? "pass" : "fail",
|
|
69
|
+
mappingStatus
|
|
70
|
+
]);
|
|
71
|
+
return {
|
|
72
|
+
label: "ai-devkit plugin",
|
|
73
|
+
installed,
|
|
74
|
+
status,
|
|
75
|
+
errors: [
|
|
76
|
+
...!installed ? [
|
|
77
|
+
"Pi session tracker is not registered"
|
|
78
|
+
] : [],
|
|
79
|
+
...mappingStatus === "fail" ? mapping.errors : []
|
|
80
|
+
],
|
|
81
|
+
details: {
|
|
82
|
+
package: "@ai-devkit/pi-session-tracker",
|
|
83
|
+
registryPath: mapping.path,
|
|
84
|
+
registryValid: mapping.valid,
|
|
85
|
+
invalidEntries: mapping.invalidEntries,
|
|
86
|
+
staleEntries: mapping.staleEntries
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export const piReadiness = {
|
|
91
|
+
configDir: ".pi",
|
|
92
|
+
auth: authCheck,
|
|
93
|
+
integration: integrationCheck
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n displayHome,\n mappingCheck,\n nonEmpty,\n record,\n worstReadinessStatus,\n} from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n IntegrationReadinessCheck,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nfunction providerNames(parsed: Record<string, unknown>): string[] {\n const names = new Set<string>();\n if (nonEmpty(parsed.provider)) names.add((parsed.provider as string).trim());\n const providers = record(parsed.providers);\n if (providers) {\n for (const name of Object.keys(providers)) {\n if (name.trim()) names.add(name);\n }\n }\n for (const [name, value] of Object.entries(parsed)) {\n if (name === \"provider\" || name === \"providers\") continue;\n if (record(value) && name.trim()) names.add(name);\n }\n return [...names].sort();\n}\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n const sourcePath = join(runtime.homeDir, \".pi\", \"agent\", \"auth.json\");\n try {\n const parsed = record(JSON.parse(await runtime.readFile(sourcePath)));\n if (!parsed) throw new Error(\"invalid\");\n const availableProviders = providerNames(parsed);\n const provider = nonEmpty(parsed.provider) ? (parsed.provider as string).trim() : null;\n const authenticated = availableProviders.length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: displayHome(sourcePath, runtime.homeDir),\n provider,\n availableProviders,\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"Pi credential file has no configured model provider\"],\n };\n } catch {\n return {\n state: \"unauthenticated\",\n source: displayHome(sourcePath, runtime.homeDir),\n provider: null,\n availableProviders: [],\n status: \"fail\",\n errors: [\"Pi credential file is missing or invalid\"],\n };\n }\n}\n\nfunction isSessionTrackerListed(output: string): boolean {\n const normalized = output.toLowerCase();\n return (\n normalized.includes(\"@ai-devkit/pi-session-tracker\") ||\n /\\bsession[\\s-]+tracker\\b/.test(normalized)\n );\n}\n\nasync function integrationCheck(runtime: ReadinessRuntime): Promise<IntegrationReadinessCheck> {\n let installed = false;\n try {\n const result = await runtime.runCommand(\"pi\", [\"list\"]);\n installed = isSessionTrackerListed(result.stdout);\n } catch {\n // Safe fixed result below.\n }\n const mapping = await mappingCheck(\n join(runtime.homeDir, \".pi\", \"agent\", \"sessions.json\"),\n runtime,\n );\n const mappingStatus = mapping.valid || !mapping.present ? \"pass\" : \"fail\";\n const status = worstReadinessStatus([installed ? \"pass\" : \"fail\", mappingStatus]);\n return {\n label: \"ai-devkit plugin\",\n installed,\n status,\n errors: [\n ...(!installed ? [\"Pi session tracker is not registered\"] : []),\n ...(mappingStatus === \"fail\" ? mapping.errors : []),\n ],\n details: {\n package: \"@ai-devkit/pi-session-tracker\",\n registryPath: mapping.path,\n registryValid: mapping.valid,\n invalidEntries: mapping.invalidEntries,\n staleEntries: mapping.staleEntries,\n },\n };\n}\n\nexport const piReadiness: HarnessReadinessProfile = {\n configDir: \".pi\",\n auth: authCheck,\n integration: integrationCheck,\n};\n"],"names":["join","displayHome","mappingCheck","nonEmpty","record","worstReadinessStatus","providerNames","parsed","names","Set","provider","add","trim","providers","name","Object","keys","value","entries","sort","authCheck","runtime","sourcePath","homeDir","JSON","parse","readFile","Error","availableProviders","authenticated","length","state","source","status","errors","isSessionTrackerListed","output","normalized","toLowerCase","includes","test","integrationCheck","installed","result","runCommand","stdout","mapping","mappingStatus","valid","present","label","details","package","registryPath","path","registryValid","invalidEntries","staleEntries","piReadiness","configDir","auth","integration"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AgentReadinessOptions, type AgentReadinessReport, type ReadinessAgentType } from "./types.js";
|
|
2
|
+
export declare function getAgentReadinessReport(agent: ReadinessAgentType, options?: AgentReadinessOptions): Promise<AgentReadinessReport>;
|
|
3
|
+
export declare function getAgentReadinessReports(options?: AgentReadinessOptions): Promise<Record<ReadinessAgentType, AgentReadinessReport>>;
|
|
4
|
+
export { worstReadinessStatus } from "./checks.js";
|
|
5
|
+
export type { AgentReadinessOptions, AgentReadinessReport, ReadinessAgentType, ReadinessStatus, } from "./types.js";
|
|
6
|
+
//# sourceMappingURL=AgentReadiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentReadiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"names":[],"mappings":"AAaA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAC;AAepB,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA8BD,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAQ3D;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|