@ai-devkit/agent-manager 0.37.0 → 0.38.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/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 +31 -10
- 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/TmuxManager.test.js +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.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/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 +68 -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 +99 -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 +11 -347
- package/dist/terminal/TtyWriter.js.map +1 -1
- 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 +19 -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 +7 -0
- package/dist/terminal/backends/shared.d.ts.map +1 -0
- package/dist/terminal/backends/shared.js +35 -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 +21 -0
- package/dist/terminal/types.d.ts.map +1 -0
- package/dist/terminal/types.js +10 -0
- package/dist/terminal/types.js.map +1 -0
- 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/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 +36 -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/TmuxManager.test.ts +1 -1
- 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/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 +87 -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} +34 -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 +16 -336
- package/src/terminal/backends/index.ts +21 -0
- package/src/terminal/backends/iterm2.ts +126 -0
- package/src/terminal/backends/shared.ts +42 -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 +22 -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
package/dist/capacity/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/capacity/types.ts"],"sourcesContent":["export type Availability = \"yes\" | \"no\" | \"unknown\";\nexport type CapacityLimitType = \"TOKENS_LIMIT\" | \"CREDIT_LIMIT\" | \"TIME_LIMIT\";\n\nexport interface CapacityWindow {\n id: string;\n label: string;\n durationMinutes: number | null;\n usedPercent: number | null;\n resetsAt: string | null;\n limitType?: CapacityLimitType;\n total?: number | null;\n current?: number | null;\n remaining?: number | null;\n}\n\nexport interface CapacityReport {\n /** Harness whose quota pool is measured, e.g. \"pi\" or \"codex\". */\n harness: string;\n /** Model provider backing the harness, e.g. \"zai\" or \"openai\". */\n provider: string;\n generatedAt: string;\n authenticated: boolean | null;\n available: Availability;\n windows: CapacityWindow[];\n creditsRemaining: number | null;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/capacity/types.ts"],"sourcesContent":["export type Availability = \"yes\" | \"no\" | \"unknown\";\nexport type CapacityLimitType = \"TOKENS_LIMIT\" | \"CREDIT_LIMIT\" | \"TIME_LIMIT\";\n\nexport interface CapacityWindow {\n id: string;\n label: string;\n durationMinutes: number | null;\n usedPercent: number | null;\n resetsAt: string | null;\n limitType?: CapacityLimitType;\n total?: number | null;\n current?: number | null;\n remaining?: number | null;\n}\n\nexport interface CapacityReport {\n /** Harness whose quota pool is measured, e.g. \"pi\" or \"codex\". */\n harness: string;\n /** Model provider backing the harness, e.g. \"zai\" or \"openai\". */\n provider: string;\n generatedAt: string;\n authenticated: boolean | null;\n available: Availability;\n windows: CapacityWindow[];\n creditsRemaining: number | null;\n}\n\n/** Provider quota data before a harness/source identity is attached. */\nexport type ProviderCapacitySnapshot = Omit<CapacityReport, \"harness\" | \"provider\" | \"generatedAt\">;\n"],"names":[],"mappings":"AA2BA,sEAAsE,GACtE,WAAoG"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type ClaudeCredentialOptions = {
|
|
2
|
+
env?: NodeJS.ProcessEnv;
|
|
3
|
+
readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
|
|
4
|
+
now?: () => Date;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
platform?: NodeJS.Platform;
|
|
7
|
+
keychainRead?: (service: string) => Promise<string | null>;
|
|
8
|
+
};
|
|
9
|
+
export declare function resolveClaudeAnthropicToken(options?: ClaudeCredentialOptions): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/claude/credentials.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,uBAAuB,GAAG;IACpC,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;IACvE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC5D,CAAC;AAwFF,wBAAsB,2BAA2B,CAC/C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC,CAejB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
const CLAUDE_KEYCHAIN_SERVICE = "Claude Code-credentials";
|
|
8
|
+
function record(value) {
|
|
9
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
10
|
+
}
|
|
11
|
+
function nonEmptyText(value) {
|
|
12
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
13
|
+
}
|
|
14
|
+
function credentialsPath(options) {
|
|
15
|
+
const env = options.env ?? process.env;
|
|
16
|
+
const configured = nonEmptyText(env.CLAUDE_CONFIG_DIR);
|
|
17
|
+
if (configured) {
|
|
18
|
+
const profileRoot = isAbsolute(configured) ? configured : resolve(options.cwd ?? process.cwd(), configured);
|
|
19
|
+
return join(profileRoot, ".credentials.json");
|
|
20
|
+
}
|
|
21
|
+
return join(env.HOME || homedir(), ".claude", ".credentials.json");
|
|
22
|
+
}
|
|
23
|
+
function credentialFromRoot(root, now) {
|
|
24
|
+
const oauth = record(root?.claudeAiOauth);
|
|
25
|
+
const token = nonEmptyText(oauth?.accessToken);
|
|
26
|
+
if (!token) return {
|
|
27
|
+
token: null,
|
|
28
|
+
expired: false
|
|
29
|
+
};
|
|
30
|
+
const expired = typeof oauth?.expiresAt === "number" && Number.isFinite(oauth.expiresAt) && oauth.expiresAt <= now.getTime();
|
|
31
|
+
return {
|
|
32
|
+
token: expired ? null : token,
|
|
33
|
+
expired
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function credentialFromPayload(payload, now) {
|
|
37
|
+
if (!payload) return {
|
|
38
|
+
token: null,
|
|
39
|
+
expired: false
|
|
40
|
+
};
|
|
41
|
+
try {
|
|
42
|
+
return credentialFromRoot(record(JSON.parse(payload)), now);
|
|
43
|
+
} catch {
|
|
44
|
+
return {
|
|
45
|
+
token: null,
|
|
46
|
+
expired: false
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function readProfileCredential(options, now) {
|
|
51
|
+
try {
|
|
52
|
+
const payload = await (options.readFile ?? readFile)(credentialsPath(options), "utf8");
|
|
53
|
+
return credentialFromPayload(payload, now);
|
|
54
|
+
} catch {
|
|
55
|
+
return {
|
|
56
|
+
token: null,
|
|
57
|
+
expired: false
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function readClaudeKeychain(service) {
|
|
62
|
+
try {
|
|
63
|
+
const { stdout } = await execFileAsync("/usr/bin/security", [
|
|
64
|
+
"find-generic-password",
|
|
65
|
+
"-s",
|
|
66
|
+
service,
|
|
67
|
+
"-w"
|
|
68
|
+
], {
|
|
69
|
+
encoding: "utf8",
|
|
70
|
+
timeout: 1500,
|
|
71
|
+
maxBuffer: 1024 * 1024
|
|
72
|
+
});
|
|
73
|
+
return nonEmptyText(stdout);
|
|
74
|
+
} catch {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async function readKeychainCredential(options, now) {
|
|
79
|
+
const env = options.env ?? process.env;
|
|
80
|
+
const usesDefaultProfile = !nonEmptyText(env.CLAUDE_CONFIG_DIR);
|
|
81
|
+
if (!usesDefaultProfile || (options.platform ?? process.platform) !== "darwin") {
|
|
82
|
+
return {
|
|
83
|
+
token: null,
|
|
84
|
+
expired: false
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
const payload = await (options.keychainRead ?? readClaudeKeychain)(CLAUDE_KEYCHAIN_SERVICE);
|
|
89
|
+
return credentialFromPayload(payload, now);
|
|
90
|
+
} catch {
|
|
91
|
+
return {
|
|
92
|
+
token: null,
|
|
93
|
+
expired: false
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export async function resolveClaudeAnthropicToken(options = {}) {
|
|
98
|
+
const env = options.env ?? process.env;
|
|
99
|
+
const environmentToken = nonEmptyText(env.CLAUDE_CODE_OAUTH_TOKEN);
|
|
100
|
+
if (environmentToken) return environmentToken;
|
|
101
|
+
const now = options.now?.() ?? new Date();
|
|
102
|
+
const profileCredential = await readProfileCredential(options, now);
|
|
103
|
+
if (profileCredential.token) return profileCredential.token;
|
|
104
|
+
const keychainCredential = await readKeychainCredential(options, now);
|
|
105
|
+
if (keychainCredential.token) return keychainCredential.token;
|
|
106
|
+
if (profileCredential.expired || keychainCredential.expired) {
|
|
107
|
+
throw new Error("Claude OAuth credentials expired");
|
|
108
|
+
}
|
|
109
|
+
throw new Error("Claude OAuth credentials not found or malformed");
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/claude/credentials.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { isAbsolute, join, resolve } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst CLAUDE_KEYCHAIN_SERVICE = \"Claude Code-credentials\";\n\nexport type ClaudeCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n now?: () => Date;\n cwd?: string;\n platform?: NodeJS.Platform;\n keychainRead?: (service: string) => Promise<string | null>;\n};\n\ntype Credential = { token: string | null; expired: boolean };\n\nfunction 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\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction credentialsPath(options: ClaudeCredentialOptions): string {\n const env = options.env ?? process.env;\n const configured = nonEmptyText(env.CLAUDE_CONFIG_DIR);\n if (configured) {\n const profileRoot = isAbsolute(configured)\n ? configured\n : resolve(options.cwd ?? process.cwd(), configured);\n return join(profileRoot, \".credentials.json\");\n }\n return join(env.HOME || homedir(), \".claude\", \".credentials.json\");\n}\n\nfunction credentialFromRoot(root: Record<string, unknown> | null, now: Date): Credential {\n const oauth = record(root?.claudeAiOauth);\n const token = nonEmptyText(oauth?.accessToken);\n if (!token) return { token: null, expired: false };\n const expired =\n typeof oauth?.expiresAt === \"number\" &&\n Number.isFinite(oauth.expiresAt) &&\n oauth.expiresAt <= now.getTime();\n return { token: expired ? null : token, expired };\n}\n\nfunction credentialFromPayload(payload: string | null, now: Date): Credential {\n if (!payload) return { token: null, expired: false };\n try {\n return credentialFromRoot(record(JSON.parse(payload)), now);\n } catch {\n return { token: null, expired: false };\n }\n}\n\nasync function readProfileCredential(\n options: ClaudeCredentialOptions,\n now: Date,\n): Promise<Credential> {\n try {\n const payload = await (options.readFile ?? readFile)(credentialsPath(options), \"utf8\");\n return credentialFromPayload(payload, now);\n } catch {\n return { token: null, expired: false };\n }\n}\n\nasync function readClaudeKeychain(service: string): Promise<string | null> {\n try {\n const { stdout } = await execFileAsync(\n \"/usr/bin/security\",\n [\"find-generic-password\", \"-s\", service, \"-w\"],\n { encoding: \"utf8\", timeout: 1500, maxBuffer: 1024 * 1024 },\n );\n return nonEmptyText(stdout);\n } catch {\n return null;\n }\n}\n\nasync function readKeychainCredential(\n options: ClaudeCredentialOptions,\n now: Date,\n): Promise<Credential> {\n const env = options.env ?? process.env;\n const usesDefaultProfile = !nonEmptyText(env.CLAUDE_CONFIG_DIR);\n if (!usesDefaultProfile || (options.platform ?? process.platform) !== \"darwin\") {\n return { token: null, expired: false };\n }\n try {\n const payload = await (options.keychainRead ?? readClaudeKeychain)(CLAUDE_KEYCHAIN_SERVICE);\n return credentialFromPayload(payload, now);\n } catch {\n return { token: null, expired: false };\n }\n}\n\nexport async function resolveClaudeAnthropicToken(\n options: ClaudeCredentialOptions = {},\n): Promise<string> {\n const env = options.env ?? process.env;\n const environmentToken = nonEmptyText(env.CLAUDE_CODE_OAUTH_TOKEN);\n if (environmentToken) return environmentToken;\n\n const now = options.now?.() ?? new Date();\n const profileCredential = await readProfileCredential(options, now);\n if (profileCredential.token) return profileCredential.token;\n\n const keychainCredential = await readKeychainCredential(options, now);\n if (keychainCredential.token) return keychainCredential.token;\n if (profileCredential.expired || keychainCredential.expired) {\n throw new Error(\"Claude OAuth credentials expired\");\n }\n throw new Error(\"Claude OAuth credentials not found or malformed\");\n}\n"],"names":["execFile","readFile","homedir","isAbsolute","join","resolve","promisify","execFileAsync","CLAUDE_KEYCHAIN_SERVICE","record","value","Array","isArray","nonEmptyText","trim","credentialsPath","options","env","process","configured","CLAUDE_CONFIG_DIR","profileRoot","cwd","HOME","credentialFromRoot","root","now","oauth","claudeAiOauth","token","accessToken","expired","expiresAt","Number","isFinite","getTime","credentialFromPayload","payload","JSON","parse","readProfileCredential","readClaudeKeychain","service","stdout","encoding","timeout","maxBuffer","readKeychainCredential","usesDefaultProfile","platform","keychainRead","resolveClaudeAnthropicToken","environmentToken","CLAUDE_CODE_OAUTH_TOKEN","Date","profileCredential","keychainCredential","Error"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,qBAAqB;AAC9C,SAASC,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,OAAO,QAAQ,UAAU;AAClC,SAASC,UAAU,EAAEC,IAAI,EAAEC,OAAO,QAAQ,YAAY;AACtD,SAASC,SAAS,QAAQ,YAAY;AAEtC,MAAMC,gBAAgBD,UAAUN;AAChC,MAAMQ,0BAA0B;AAahC,SAASC,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMI,IAAI,KAAKJ,MAAMI,IAAI,KAAK;AACpE;AAEA,SAASC,gBAAgBC,OAAgC;IACvD,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAME,aAAaN,aAAaI,IAAIG,iBAAiB;IACrD,IAAID,YAAY;QACd,MAAME,cAAclB,WAAWgB,cAC3BA,aACAd,QAAQW,QAAQM,GAAG,IAAIJ,QAAQI,GAAG,IAAIH;QAC1C,OAAOf,KAAKiB,aAAa;IAC3B;IACA,OAAOjB,KAAKa,IAAIM,IAAI,IAAIrB,WAAW,WAAW;AAChD;AAEA,SAASsB,mBAAmBC,IAAoC,EAAEC,GAAS;IACzE,MAAMC,QAAQlB,OAAOgB,MAAMG;IAC3B,MAAMC,QAAQhB,aAAac,OAAOG;IAClC,IAAI,CAACD,OAAO,OAAO;QAAEA,OAAO;QAAME,SAAS;IAAM;IACjD,MAAMA,UACJ,OAAOJ,OAAOK,cAAc,YAC5BC,OAAOC,QAAQ,CAACP,MAAMK,SAAS,KAC/BL,MAAMK,SAAS,IAAIN,IAAIS,OAAO;IAChC,OAAO;QAAEN,OAAOE,UAAU,OAAOF;QAAOE;IAAQ;AAClD;AAEA,SAASK,sBAAsBC,OAAsB,EAAEX,GAAS;IAC9D,IAAI,CAACW,SAAS,OAAO;QAAER,OAAO;QAAME,SAAS;IAAM;IACnD,IAAI;QACF,OAAOP,mBAAmBf,OAAO6B,KAAKC,KAAK,CAACF,WAAWX;IACzD,EAAE,OAAM;QACN,OAAO;YAAEG,OAAO;YAAME,SAAS;QAAM;IACvC;AACF;AAEA,eAAeS,sBACbxB,OAAgC,EAChCU,GAAS;IAET,IAAI;QACF,MAAMW,UAAU,MAAM,AAACrB,CAAAA,QAAQf,QAAQ,IAAIA,QAAO,EAAGc,gBAAgBC,UAAU;QAC/E,OAAOoB,sBAAsBC,SAASX;IACxC,EAAE,OAAM;QACN,OAAO;YAAEG,OAAO;YAAME,SAAS;QAAM;IACvC;AACF;AAEA,eAAeU,mBAAmBC,OAAe;IAC/C,IAAI;QACF,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMpC,cACvB,qBACA;YAAC;YAAyB;YAAMmC;YAAS;SAAK,EAC9C;YAAEE,UAAU;YAAQC,SAAS;YAAMC,WAAW,OAAO;QAAK;QAE5D,OAAOjC,aAAa8B;IACtB,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,eAAeI,uBACb/B,OAAgC,EAChCU,GAAS;IAET,MAAMT,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAM+B,qBAAqB,CAACnC,aAAaI,IAAIG,iBAAiB;IAC9D,IAAI,CAAC4B,sBAAsB,AAAChC,CAAAA,QAAQiC,QAAQ,IAAI/B,QAAQ+B,QAAQ,AAAD,MAAO,UAAU;QAC9E,OAAO;YAAEpB,OAAO;YAAME,SAAS;QAAM;IACvC;IACA,IAAI;QACF,MAAMM,UAAU,MAAM,AAACrB,CAAAA,QAAQkC,YAAY,IAAIT,kBAAiB,EAAGjC;QACnE,OAAO4B,sBAAsBC,SAASX;IACxC,EAAE,OAAM;QACN,OAAO;YAAEG,OAAO;YAAME,SAAS;QAAM;IACvC;AACF;AAEA,OAAO,eAAeoB,4BACpBnC,UAAmC,CAAC,CAAC;IAErC,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAMmC,mBAAmBvC,aAAaI,IAAIoC,uBAAuB;IACjE,IAAID,kBAAkB,OAAOA;IAE7B,MAAM1B,MAAMV,QAAQU,GAAG,QAAQ,IAAI4B;IACnC,MAAMC,oBAAoB,MAAMf,sBAAsBxB,SAASU;IAC/D,IAAI6B,kBAAkB1B,KAAK,EAAE,OAAO0B,kBAAkB1B,KAAK;IAE3D,MAAM2B,qBAAqB,MAAMT,uBAAuB/B,SAASU;IACjE,IAAI8B,mBAAmB3B,KAAK,EAAE,OAAO2B,mBAAmB3B,KAAK;IAC7D,IAAI0B,kBAAkBxB,OAAO,IAAIyB,mBAAmBzB,OAAO,EAAE;QAC3D,MAAM,IAAI0B,MAAM;IAClB;IACA,MAAM,IAAIA,MAAM;AAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/claude/readiness.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAoD/B,eAAO,MAAM,eAAe,EAAE,uBAI7B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { record, registrationCheck, scriptCheck, worstReadinessStatus } from "../readiness/checks.js";
|
|
3
|
+
async function authCheck(runtime) {
|
|
4
|
+
try {
|
|
5
|
+
const result = await runtime.runCommand("claude", [
|
|
6
|
+
"auth",
|
|
7
|
+
"status",
|
|
8
|
+
"--json"
|
|
9
|
+
]);
|
|
10
|
+
const parsed = record(JSON.parse(result.stdout));
|
|
11
|
+
const authenticated = parsed?.loggedIn === true || parsed?.authenticated === true;
|
|
12
|
+
const unauthenticated = parsed?.loggedIn === false || parsed?.authenticated === false;
|
|
13
|
+
return {
|
|
14
|
+
state: authenticated ? "authenticated" : unauthenticated ? "unauthenticated" : "unknown",
|
|
15
|
+
source: "claude auth status --json",
|
|
16
|
+
provider: null,
|
|
17
|
+
availableProviders: [],
|
|
18
|
+
status: authenticated ? "pass" : unauthenticated ? "fail" : "warn",
|
|
19
|
+
errors: authenticated ? [] : [
|
|
20
|
+
unauthenticated ? "Claude is not authenticated" : "Claude authentication is unknown"
|
|
21
|
+
]
|
|
22
|
+
};
|
|
23
|
+
} catch {
|
|
24
|
+
return {
|
|
25
|
+
state: "unknown",
|
|
26
|
+
source: "claude auth status --json",
|
|
27
|
+
provider: null,
|
|
28
|
+
availableProviders: [],
|
|
29
|
+
status: "warn",
|
|
30
|
+
errors: [
|
|
31
|
+
"Claude authentication probe failed"
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function integrationCheck(runtime) {
|
|
37
|
+
const script = await scriptCheck(join(runtime.homeDir, ".claude", "hooks", "claude-prompt-hook.js"), join(runtime.assetRoot ?? "", "claude", "claude-prompt-hook.js"), runtime);
|
|
38
|
+
const registration = await registrationCheck(join(runtime.homeDir, ".claude", "settings.json"), "PreToolUse", "node ~/.claude/hooks/claude-prompt-hook.js", runtime);
|
|
39
|
+
const installed = script.status === "pass" && registration.status === "pass";
|
|
40
|
+
return {
|
|
41
|
+
label: "ai-devkit hook",
|
|
42
|
+
installed,
|
|
43
|
+
status: worstReadinessStatus([
|
|
44
|
+
script.status,
|
|
45
|
+
registration.status
|
|
46
|
+
]),
|
|
47
|
+
errors: [
|
|
48
|
+
...script.errors,
|
|
49
|
+
...registration.errors
|
|
50
|
+
],
|
|
51
|
+
details: {
|
|
52
|
+
promptScript: script,
|
|
53
|
+
registration
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export const claudeReadiness = {
|
|
58
|
+
configDir: ".claude",
|
|
59
|
+
auth: authCheck,
|
|
60
|
+
integration: integrationCheck
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/claude/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n record,\n registrationCheck,\n scriptCheck,\n worstReadinessStatus,\n} from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n IntegrationReadinessCheck,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const result = await runtime.runCommand(\"claude\", [\"auth\", \"status\", \"--json\"]);\n const parsed = record(JSON.parse(result.stdout));\n const authenticated = parsed?.loggedIn === true || parsed?.authenticated === true;\n const unauthenticated = parsed?.loggedIn === false || parsed?.authenticated === false;\n return {\n state: authenticated ? \"authenticated\" : unauthenticated ? \"unauthenticated\" : \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: authenticated ? \"pass\" : unauthenticated ? \"fail\" : \"warn\",\n errors: authenticated\n ? []\n : [unauthenticated ? \"Claude is not authenticated\" : \"Claude authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Claude authentication probe failed\"],\n };\n }\n}\n\nasync function integrationCheck(runtime: ReadinessRuntime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(runtime.homeDir, \".claude\", \"hooks\", \"claude-prompt-hook.js\"),\n join(runtime.assetRoot ?? \"\", \"claude\", \"claude-prompt-hook.js\"),\n runtime,\n );\n const registration = await registrationCheck(\n join(runtime.homeDir, \".claude\", \"settings.json\"),\n \"PreToolUse\",\n \"node ~/.claude/hooks/claude-prompt-hook.js\",\n runtime,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status]),\n errors: [...script.errors, ...registration.errors],\n details: { promptScript: script, registration },\n };\n}\n\nexport const claudeReadiness: HarnessReadinessProfile = {\n configDir: \".claude\",\n auth: authCheck,\n integration: integrationCheck,\n};\n"],"names":["join","record","registrationCheck","scriptCheck","worstReadinessStatus","authCheck","runtime","result","runCommand","parsed","JSON","parse","stdout","authenticated","loggedIn","unauthenticated","state","source","provider","availableProviders","status","errors","integrationCheck","script","homeDir","assetRoot","registration","installed","label","details","promptScript","claudeReadiness","configDir","auth","integration"],"mappings":"AAAA,SAASA,IAAI,QAAQ,YAAY;AACjC,SACEC,MAAM,EACNC,iBAAiB,EACjBC,WAAW,EACXC,oBAAoB,QACf,yBAAyB;AAQhC,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,SAAS,MAAMD,QAAQE,UAAU,CAAC,UAAU;YAAC;YAAQ;YAAU;SAAS;QAC9E,MAAMC,SAASR,OAAOS,KAAKC,KAAK,CAACJ,OAAOK,MAAM;QAC9C,MAAMC,gBAAgBJ,QAAQK,aAAa,QAAQL,QAAQI,kBAAkB;QAC7E,MAAME,kBAAkBN,QAAQK,aAAa,SAASL,QAAQI,kBAAkB;QAChF,OAAO;YACLG,OAAOH,gBAAgB,kBAAkBE,kBAAkB,oBAAoB;YAC/EE,QAAQ;YACRC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQP,gBAAgB,SAASE,kBAAkB,SAAS;YAC5DM,QAAQR,gBACJ,EAAE,GACF;gBAACE,kBAAkB,gCAAgC;aAAmC;QAC5F;IACF,EAAE,OAAM;QACN,OAAO;YACLC,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAAqC;QAChD;IACF;AACF;AAEA,eAAeC,iBAAiBhB,OAAyB;IACvD,MAAMiB,SAAS,MAAMpB,YACnBH,KAAKM,QAAQkB,OAAO,EAAE,WAAW,SAAS,0BAC1CxB,KAAKM,QAAQmB,SAAS,IAAI,IAAI,UAAU,0BACxCnB;IAEF,MAAMoB,eAAe,MAAMxB,kBACzBF,KAAKM,QAAQkB,OAAO,EAAE,WAAW,kBACjC,cACA,8CACAlB;IAEF,MAAMqB,YAAYJ,OAAOH,MAAM,KAAK,UAAUM,aAAaN,MAAM,KAAK;IACtE,OAAO;QACLQ,OAAO;QACPD;QACAP,QAAQhB,qBAAqB;YAACmB,OAAOH,MAAM;YAAEM,aAAaN,MAAM;SAAC;QACjEC,QAAQ;eAAIE,OAAOF,MAAM;eAAKK,aAAaL,MAAM;SAAC;QAClDQ,SAAS;YAAEC,cAAcP;YAAQG;QAAa;IAChD;AACF;AAEA,OAAO,MAAMK,kBAA2C;IACtDC,WAAW;IACXC,MAAM5B;IACN6B,aAAaZ;AACf,EAAE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type CodexCredentialOptions = {
|
|
2
|
+
env?: NodeJS.ProcessEnv;
|
|
3
|
+
readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
|
|
4
|
+
now?: () => Date;
|
|
5
|
+
};
|
|
6
|
+
export type CodexCredentials = {
|
|
7
|
+
personalAccessToken: string | null;
|
|
8
|
+
oauth: {
|
|
9
|
+
access: string;
|
|
10
|
+
accountId: string;
|
|
11
|
+
} | null;
|
|
12
|
+
};
|
|
13
|
+
export declare function resolveCodexAuthPath(env?: NodeJS.ProcessEnv): string;
|
|
14
|
+
export declare function resolveCodexCredentials(options?: CodexCredentialOptions): Promise<CodexCredentials | null>;
|
|
15
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/codex/credentials.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,sBAAsB,GAAG;IACnC,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;IACvE,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrD,CAAC;AAgBF,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAGjF;AAuBD,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsBlC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
function record(value) {
|
|
4
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
5
|
+
}
|
|
6
|
+
function finiteNumber(value) {
|
|
7
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
8
|
+
}
|
|
9
|
+
function nonEmptyText(value) {
|
|
10
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
11
|
+
}
|
|
12
|
+
export function resolveCodexAuthPath(env = process.env) {
|
|
13
|
+
const root = env.CODEX_HOME || join(env.HOME || "", ".codex");
|
|
14
|
+
return join(root, "auth.json");
|
|
15
|
+
}
|
|
16
|
+
function jwtExpiry(token) {
|
|
17
|
+
const part = token.split(".")[1];
|
|
18
|
+
if (!part) return null;
|
|
19
|
+
try {
|
|
20
|
+
return finiteNumber(record(JSON.parse(Buffer.from(part, "base64url").toString("utf8")))?.exp);
|
|
21
|
+
} catch {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function staleOAuth(tokens, token, now) {
|
|
26
|
+
const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;
|
|
27
|
+
let expiry = finiteNumber(metadata);
|
|
28
|
+
if (typeof metadata === "string") {
|
|
29
|
+
const parsed = Date.parse(metadata);
|
|
30
|
+
expiry = Number.isNaN(parsed) ? null : parsed / 1000;
|
|
31
|
+
}
|
|
32
|
+
expiry ??= jwtExpiry(token);
|
|
33
|
+
return expiry !== null && expiry <= now.getTime() / 1000;
|
|
34
|
+
}
|
|
35
|
+
export async function resolveCodexCredentials(options = {}) {
|
|
36
|
+
let auth;
|
|
37
|
+
try {
|
|
38
|
+
const contents = await (options.readFile ?? readFile)(resolveCodexAuthPath(options.env), "utf8");
|
|
39
|
+
auth = record(JSON.parse(contents)) ?? {};
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const personalAccessToken = nonEmptyText(auth.personal_access_token);
|
|
44
|
+
const tokens = record(auth.tokens);
|
|
45
|
+
const access = nonEmptyText(tokens?.access_token);
|
|
46
|
+
const accountId = nonEmptyText(tokens?.account_id);
|
|
47
|
+
const now = options.now?.() ?? new Date();
|
|
48
|
+
const oauth = tokens && access && accountId && !staleOAuth(tokens, access, now) ? {
|
|
49
|
+
access,
|
|
50
|
+
accountId
|
|
51
|
+
} : null;
|
|
52
|
+
return {
|
|
53
|
+
personalAccessToken,
|
|
54
|
+
oauth
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/codex/credentials.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport type CodexCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n now?: () => Date;\n};\n\nexport type CodexCredentials = {\n personalAccessToken: string | null;\n oauth: { access: string; accountId: string } | null;\n};\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 finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function resolveCodexAuthPath(env: NodeJS.ProcessEnv = process.env): string {\n const root = env.CODEX_HOME || join(env.HOME || \"\", \".codex\");\n return join(root, \"auth.json\");\n}\n\nfunction jwtExpiry(token: string): number | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n return finiteNumber(record(JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")))?.exp);\n } catch {\n return null;\n }\n}\n\nfunction staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {\n const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;\n let expiry: number | null = finiteNumber(metadata);\n if (typeof metadata === \"string\") {\n const parsed = Date.parse(metadata);\n expiry = Number.isNaN(parsed) ? null : parsed / 1000;\n }\n expiry ??= jwtExpiry(token);\n return expiry !== null && expiry <= now.getTime() / 1000;\n}\n\nexport async function resolveCodexCredentials(\n options: CodexCredentialOptions = {},\n): Promise<CodexCredentials | null> {\n let auth: UnknownRecord;\n try {\n const contents = await (options.readFile ?? readFile)(\n resolveCodexAuthPath(options.env),\n \"utf8\",\n );\n auth = record(JSON.parse(contents)) ?? {};\n } catch {\n return null;\n }\n\n const personalAccessToken = nonEmptyText(auth.personal_access_token);\n const tokens = record(auth.tokens);\n const access = nonEmptyText(tokens?.access_token);\n const accountId = nonEmptyText(tokens?.account_id);\n const now = options.now?.() ?? new Date();\n const oauth =\n tokens && access && accountId && !staleOAuth(tokens, access, now)\n ? { access, accountId }\n : null;\n return { personalAccessToken, oauth };\n}\n"],"names":["readFile","join","record","value","Array","isArray","finiteNumber","Number","isFinite","nonEmptyText","length","resolveCodexAuthPath","env","process","root","CODEX_HOME","HOME","jwtExpiry","token","part","split","JSON","parse","Buffer","from","toString","exp","staleOAuth","tokens","now","metadata","expires_at","expiresAt","expiry","parsed","Date","isNaN","getTime","resolveCodexCredentials","options","auth","contents","personalAccessToken","personal_access_token","access","access_token","accountId","account_id","oauth"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,IAAI,QAAQ,YAAY;AAejC,SAASC,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYI,OAAOC,QAAQ,CAACL,SAASA,QAAQ;AACvE;AAEA,SAASM,aAAaN,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMO,MAAM,GAAG,IAAIP,QAAQ;AACjE;AAEA,OAAO,SAASQ,qBAAqBC,MAAyBC,QAAQD,GAAG;IACvE,MAAME,OAAOF,IAAIG,UAAU,IAAId,KAAKW,IAAII,IAAI,IAAI,IAAI;IACpD,OAAOf,KAAKa,MAAM;AACpB;AAEA,SAASG,UAAUC,KAAa;IAC9B,MAAMC,OAAOD,MAAME,KAAK,CAAC,IAAI,CAAC,EAAE;IAChC,IAAI,CAACD,MAAM,OAAO;IAClB,IAAI;QACF,OAAOb,aAAaJ,OAAOmB,KAAKC,KAAK,CAACC,OAAOC,IAAI,CAACL,MAAM,aAAaM,QAAQ,CAAC,WAAWC;IAC3F,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,SAASC,WAAWC,MAAqB,EAAEV,KAAa,EAAEW,GAAS;IACjE,MAAMC,WAAWF,OAAOG,UAAU,IAAIH,OAAOI,SAAS,IAAIJ,OAAOK,MAAM;IACvE,IAAIA,SAAwB3B,aAAawB;IACzC,IAAI,OAAOA,aAAa,UAAU;QAChC,MAAMI,SAASC,KAAKb,KAAK,CAACQ;QAC1BG,SAAS1B,OAAO6B,KAAK,CAACF,UAAU,OAAOA,SAAS;IAClD;IACAD,WAAWhB,UAAUC;IACrB,OAAOe,WAAW,QAAQA,UAAUJ,IAAIQ,OAAO,KAAK;AACtD;AAEA,OAAO,eAAeC,wBACpBC,UAAkC,CAAC,CAAC;IAEpC,IAAIC;IACJ,IAAI;QACF,MAAMC,WAAW,MAAM,AAACF,CAAAA,QAAQvC,QAAQ,IAAIA,QAAO,EACjDW,qBAAqB4B,QAAQ3B,GAAG,GAChC;QAEF4B,OAAOtC,OAAOmB,KAAKC,KAAK,CAACmB,cAAc,CAAC;IAC1C,EAAE,OAAM;QACN,OAAO;IACT;IAEA,MAAMC,sBAAsBjC,aAAa+B,KAAKG,qBAAqB;IACnE,MAAMf,SAAS1B,OAAOsC,KAAKZ,MAAM;IACjC,MAAMgB,SAASnC,aAAamB,QAAQiB;IACpC,MAAMC,YAAYrC,aAAamB,QAAQmB;IACvC,MAAMlB,MAAMU,QAAQV,GAAG,QAAQ,IAAIM;IACnC,MAAMa,QACJpB,UAAUgB,UAAUE,aAAa,CAACnB,WAAWC,QAAQgB,QAAQf,OACzD;QAAEe;QAAQE;IAAU,IACpB;IACN,OAAO;QAAEJ;QAAqBM;IAAM;AACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/codex/readiness.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAsD/B,eAAO,MAAM,cAAc,EAAE,uBAI5B,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { displayHome, mappingCheck, registrationCheck, scriptCheck, worstReadinessStatus } from "../readiness/checks.js";
|
|
3
|
+
async function authCheck(runtime) {
|
|
4
|
+
try {
|
|
5
|
+
const value = await runtime.codexAuth();
|
|
6
|
+
return {
|
|
7
|
+
state: value === true ? "authenticated" : value === false ? "unauthenticated" : "unknown",
|
|
8
|
+
source: displayHome(join(runtime.homeDir, ".codex", "auth.json"), runtime.homeDir),
|
|
9
|
+
provider: null,
|
|
10
|
+
availableProviders: [],
|
|
11
|
+
status: value === true ? "pass" : value === false ? "fail" : "warn",
|
|
12
|
+
errors: value === true ? [] : [
|
|
13
|
+
value === false ? "Codex is not authenticated" : "Codex authentication is unknown"
|
|
14
|
+
]
|
|
15
|
+
};
|
|
16
|
+
} catch {
|
|
17
|
+
return {
|
|
18
|
+
state: "unknown",
|
|
19
|
+
source: "~/.codex/auth.json",
|
|
20
|
+
provider: null,
|
|
21
|
+
availableProviders: [],
|
|
22
|
+
status: "warn",
|
|
23
|
+
errors: [
|
|
24
|
+
"Codex authentication probe failed"
|
|
25
|
+
]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function integrationCheck(runtime) {
|
|
30
|
+
const script = await scriptCheck(join(runtime.homeDir, ".codex", "hooks", "codex-session-mapping.cjs"), join(runtime.assetRoot ?? "", "codex", "codex-session-mapping.cjs"), runtime);
|
|
31
|
+
const registration = await registrationCheck(join(runtime.homeDir, ".codex", "hooks.json"), "SessionStart", "node ~/.codex/hooks/codex-session-mapping.cjs", runtime);
|
|
32
|
+
const mappingFile = await mappingCheck(join(runtime.homeDir, ".codex", "ai-devkit", "sessions.json"), runtime);
|
|
33
|
+
const installed = script.status === "pass" && registration.status === "pass";
|
|
34
|
+
return {
|
|
35
|
+
label: "ai-devkit hook",
|
|
36
|
+
installed,
|
|
37
|
+
status: worstReadinessStatus([
|
|
38
|
+
script.status,
|
|
39
|
+
registration.status,
|
|
40
|
+
mappingFile.status
|
|
41
|
+
]),
|
|
42
|
+
errors: [
|
|
43
|
+
...script.errors,
|
|
44
|
+
...registration.errors,
|
|
45
|
+
...mappingFile.errors
|
|
46
|
+
],
|
|
47
|
+
details: {
|
|
48
|
+
sessionMappingScript: script,
|
|
49
|
+
registration,
|
|
50
|
+
mappingFile
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export const codexReadiness = {
|
|
55
|
+
configDir: ".codex",
|
|
56
|
+
auth: authCheck,
|
|
57
|
+
integration: integrationCheck
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/codex/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n displayHome,\n mappingCheck,\n registrationCheck,\n scriptCheck,\n worstReadinessStatus,\n} from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n IntegrationReadinessCheck,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n const value = await runtime.codexAuth();\n return {\n state: value === true ? \"authenticated\" : value === false ? \"unauthenticated\" : \"unknown\",\n source: displayHome(join(runtime.homeDir, \".codex\", \"auth.json\"), runtime.homeDir),\n provider: null,\n availableProviders: [],\n status: value === true ? \"pass\" : value === false ? \"fail\" : \"warn\",\n errors:\n value === true\n ? []\n : [value === false ? \"Codex is not authenticated\" : \"Codex authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"~/.codex/auth.json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Codex authentication probe failed\"],\n };\n }\n}\n\nasync function integrationCheck(runtime: ReadinessRuntime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(runtime.homeDir, \".codex\", \"hooks\", \"codex-session-mapping.cjs\"),\n join(runtime.assetRoot ?? \"\", \"codex\", \"codex-session-mapping.cjs\"),\n runtime,\n );\n const registration = await registrationCheck(\n join(runtime.homeDir, \".codex\", \"hooks.json\"),\n \"SessionStart\",\n \"node ~/.codex/hooks/codex-session-mapping.cjs\",\n runtime,\n );\n const mappingFile = await mappingCheck(\n join(runtime.homeDir, \".codex\", \"ai-devkit\", \"sessions.json\"),\n runtime,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status, mappingFile.status]),\n errors: [...script.errors, ...registration.errors, ...mappingFile.errors],\n details: { sessionMappingScript: script, registration, mappingFile },\n };\n}\n\nexport const codexReadiness: HarnessReadinessProfile = {\n configDir: \".codex\",\n auth: authCheck,\n integration: integrationCheck,\n};\n"],"names":["join","displayHome","mappingCheck","registrationCheck","scriptCheck","worstReadinessStatus","authCheck","runtime","value","codexAuth","state","source","homeDir","provider","availableProviders","status","errors","integrationCheck","script","assetRoot","registration","mappingFile","installed","label","details","sessionMappingScript","codexReadiness","configDir","auth","integration"],"mappings":"AAAA,SAASA,IAAI,QAAQ,YAAY;AACjC,SACEC,WAAW,EACXC,YAAY,EACZC,iBAAiB,EACjBC,WAAW,EACXC,oBAAoB,QACf,yBAAyB;AAQhC,eAAeC,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMC,QAAQ,MAAMD,QAAQE,SAAS;QACrC,OAAO;YACLC,OAAOF,UAAU,OAAO,kBAAkBA,UAAU,QAAQ,oBAAoB;YAChFG,QAAQV,YAAYD,KAAKO,QAAQK,OAAO,EAAE,UAAU,cAAcL,QAAQK,OAAO;YACjFC,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQP,UAAU,OAAO,SAASA,UAAU,QAAQ,SAAS;YAC7DQ,QACER,UAAU,OACN,EAAE,GACF;gBAACA,UAAU,QAAQ,+BAA+B;aAAkC;QAC5F;IACF,EAAE,OAAM;QACN,OAAO;YACLE,OAAO;YACPC,QAAQ;YACRE,UAAU;YACVC,oBAAoB,EAAE;YACtBC,QAAQ;YACRC,QAAQ;gBAAC;aAAoC;QAC/C;IACF;AACF;AAEA,eAAeC,iBAAiBV,OAAyB;IACvD,MAAMW,SAAS,MAAMd,YACnBJ,KAAKO,QAAQK,OAAO,EAAE,UAAU,SAAS,8BACzCZ,KAAKO,QAAQY,SAAS,IAAI,IAAI,SAAS,8BACvCZ;IAEF,MAAMa,eAAe,MAAMjB,kBACzBH,KAAKO,QAAQK,OAAO,EAAE,UAAU,eAChC,gBACA,iDACAL;IAEF,MAAMc,cAAc,MAAMnB,aACxBF,KAAKO,QAAQK,OAAO,EAAE,UAAU,aAAa,kBAC7CL;IAEF,MAAMe,YAAYJ,OAAOH,MAAM,KAAK,UAAUK,aAAaL,MAAM,KAAK;IACtE,OAAO;QACLQ,OAAO;QACPD;QACAP,QAAQV,qBAAqB;YAACa,OAAOH,MAAM;YAAEK,aAAaL,MAAM;YAAEM,YAAYN,MAAM;SAAC;QACrFC,QAAQ;eAAIE,OAAOF,MAAM;eAAKI,aAAaJ,MAAM;eAAKK,YAAYL,MAAM;SAAC;QACzEQ,SAAS;YAAEC,sBAAsBP;YAAQE;YAAcC;QAAY;IACrE;AACF;AAEA,OAAO,MAAMK,iBAA0C;IACrDC,WAAW;IACXC,MAAMtB;IACNuB,aAAaZ;AACf,EAAE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,uBAAuB,CAAC;AAyB/B,eAAO,MAAM,gBAAgB,EAAE,uBAG9B,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
async function authCheck(runtime) {
|
|
2
|
+
try {
|
|
3
|
+
await runtime.runCommand("gh", [
|
|
4
|
+
"auth",
|
|
5
|
+
"status",
|
|
6
|
+
"--hostname",
|
|
7
|
+
"github.com"
|
|
8
|
+
]);
|
|
9
|
+
return {
|
|
10
|
+
state: "authenticated",
|
|
11
|
+
source: "gh auth status --hostname github.com",
|
|
12
|
+
provider: "github",
|
|
13
|
+
availableProviders: [
|
|
14
|
+
"GitHub"
|
|
15
|
+
],
|
|
16
|
+
status: "pass",
|
|
17
|
+
errors: []
|
|
18
|
+
};
|
|
19
|
+
} catch {
|
|
20
|
+
return {
|
|
21
|
+
state: "unknown",
|
|
22
|
+
source: "gh auth status --hostname github.com",
|
|
23
|
+
provider: null,
|
|
24
|
+
availableProviders: [
|
|
25
|
+
"GitHub"
|
|
26
|
+
],
|
|
27
|
+
status: "warn",
|
|
28
|
+
errors: [
|
|
29
|
+
"Copilot authentication could not be verified through GitHub CLI"
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export const copilotReadiness = {
|
|
35
|
+
configDir: ".copilot",
|
|
36
|
+
auth: authCheck
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/copilot/readiness.ts"],"sourcesContent":["import type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n try {\n await runtime.runCommand(\"gh\", [\"auth\", \"status\", \"--hostname\", \"github.com\"]);\n return {\n state: \"authenticated\",\n source: \"gh auth status --hostname github.com\",\n provider: \"github\",\n availableProviders: [\"GitHub\"],\n status: \"pass\",\n errors: [],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"gh auth status --hostname github.com\",\n provider: null,\n availableProviders: [\"GitHub\"],\n status: \"warn\",\n errors: [\"Copilot authentication could not be verified through GitHub CLI\"],\n };\n }\n}\n\nexport const copilotReadiness: HarnessReadinessProfile = {\n configDir: \".copilot\",\n auth: authCheck,\n};\n"],"names":["authCheck","runtime","runCommand","state","source","provider","availableProviders","status","errors","copilotReadiness","configDir","auth"],"mappings":"AAMA,eAAeA,UAAUC,OAAyB;IAChD,IAAI;QACF,MAAMA,QAAQC,UAAU,CAAC,MAAM;YAAC;YAAQ;YAAU;YAAc;SAAa;QAC7E,OAAO;YACLC,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB;gBAAC;aAAS;YAC9BC,QAAQ;YACRC,QAAQ,EAAE;QACZ;IACF,EAAE,OAAM;QACN,OAAO;YACLL,OAAO;YACPC,QAAQ;YACRC,UAAU;YACVC,oBAAoB;gBAAC;aAAS;YAC9BC,QAAQ;YACRC,QAAQ;gBAAC;aAAkE;QAC7E;IACF;AACF;AAEA,OAAO,MAAMC,mBAA4C;IACvDC,WAAW;IACXC,MAAMX;AACR,EAAE"}
|
|
@@ -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"}
|