@viraatdas/rudder 0.1.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/README.md +91 -0
- package/dist/auth.d.ts +33 -0
- package/dist/auth.js +348 -0
- package/dist/auth.js.map +1 -0
- package/dist/backends.d.ts +2 -0
- package/dist/backends.js +246 -0
- package/dist/backends.js.map +1 -0
- package/dist/brain.d.ts +4 -0
- package/dist/brain.js +131 -0
- package/dist/brain.js.map +1 -0
- package/dist/git.d.ts +23 -0
- package/dist/git.js +184 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +303 -0
- package/dist/main.js.map +1 -0
- package/dist/run-manager.d.ts +26 -0
- package/dist/run-manager.js +364 -0
- package/dist/run-manager.js.map +1 -0
- package/dist/state.d.ts +34 -0
- package/dist/state.js +189 -0
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +160 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +47 -0
- package/dist/util.js +192 -0
- package/dist/util.js.map +1 -0
- package/package.json +30 -0
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# rudder
|
|
2
|
+
|
|
3
|
+
Rudder is a coding-agent harness for Claude Code, Codex, and `acpx`. It adds a
|
|
4
|
+
clean run manager around the existing tools: OpenClaw-style onboarding,
|
|
5
|
+
background runs, watch/log commands, and git worktree isolation so multiple
|
|
6
|
+
prompts do not fight over the same checkout.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
From npm:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @viraatdas/rudder
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Or run without a global install:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx @viraatdas/rudder@latest --help
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Verify the installed CLI:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
rudder --help
|
|
26
|
+
rudder doctor
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Local development:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install
|
|
33
|
+
npm run build
|
|
34
|
+
npm link
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Setup
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
rudder onboard
|
|
41
|
+
rudder doctor
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Rudder stores config in `~/.rudder/config.json` and OpenClaw-shaped auth
|
|
45
|
+
profiles in `~/.rudder/auth-profiles.json`.
|
|
46
|
+
|
|
47
|
+
It detects and can mirror:
|
|
48
|
+
|
|
49
|
+
- Claude Code auth from macOS Keychain or `~/.claude/.credentials.json`
|
|
50
|
+
- Codex auth from macOS Keychain or `~/.codex/auth.json`
|
|
51
|
+
- `ANTHROPIC_API_KEY` and `OPENAI_API_KEY`
|
|
52
|
+
|
|
53
|
+
It also offers setup-token/API-key fallback paths during onboarding.
|
|
54
|
+
|
|
55
|
+
## Run
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
rudder "fix the failing tests"
|
|
59
|
+
rudder claude "fix the auth redirect bug"
|
|
60
|
+
rudder codex --model gpt-5.4-codex "refactor the parser"
|
|
61
|
+
rudder run -d "rewrite this module"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Foreground runs are just an attached watch. Pressing `Ctrl-C` detaches from the
|
|
65
|
+
output; it does not stop the agent. Use `rudder stop <runId>` to cancel work.
|
|
66
|
+
|
|
67
|
+
## Manage Runs
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
rudder status
|
|
71
|
+
rudder runs
|
|
72
|
+
rudder watch <runId>
|
|
73
|
+
rudder logs <runId> --follow
|
|
74
|
+
rudder stop <runId>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Worktrees
|
|
78
|
+
|
|
79
|
+
Rudder enforces one active agent per checkout. If you start a second task in the
|
|
80
|
+
same repo while one is already running, Rudder creates a git worktree on a
|
|
81
|
+
`rudder/<run>` branch and runs the agent there.
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
rudder run --worktree "try the alternate implementation"
|
|
85
|
+
rudder merge <runId>
|
|
86
|
+
rudder cleanup
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
`rudder merge` uses normal git merge semantics. Clean merges are committed as a
|
|
90
|
+
merge commit; conflicts are left in the standard git conflict state for you to
|
|
91
|
+
resolve.
|
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AuthProfileCredential, AuthProfileStore, OAuthCredential } from "./types.js";
|
|
2
|
+
type Detection = {
|
|
3
|
+
claudeCommand: boolean;
|
|
4
|
+
codexCommand: boolean;
|
|
5
|
+
acpxCommand: boolean;
|
|
6
|
+
acpxVersion?: string;
|
|
7
|
+
npmAcpxLatest?: string;
|
|
8
|
+
anthropicEnv?: boolean;
|
|
9
|
+
openaiEnv?: boolean;
|
|
10
|
+
claudeCredential?: AuthProfileCredential;
|
|
11
|
+
claudeCredentialSource?: string;
|
|
12
|
+
codexCredential?: OAuthCredential;
|
|
13
|
+
codexCredentialSource?: string;
|
|
14
|
+
};
|
|
15
|
+
export declare function detectEnvironment(): Promise<Detection>;
|
|
16
|
+
export declare function syncExternalCredentials(): Promise<AuthProfileStore>;
|
|
17
|
+
export declare function runDoctor(options?: {
|
|
18
|
+
json?: boolean;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
export declare function runOnboard(options?: {
|
|
21
|
+
nonInteractive?: boolean;
|
|
22
|
+
json?: boolean;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
export declare function readClaudeCliCredential(): Promise<{
|
|
25
|
+
credential: AuthProfileCredential;
|
|
26
|
+
source: string;
|
|
27
|
+
} | null>;
|
|
28
|
+
export declare function readCodexCliCredential(): Promise<{
|
|
29
|
+
credential: OAuthCredential;
|
|
30
|
+
source: string;
|
|
31
|
+
} | null>;
|
|
32
|
+
export declare function authStoreExists(): Promise<boolean>;
|
|
33
|
+
export {};
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,348 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { commandExists, expandHome, pathExists, promptConfirm, promptSelect, promptText, readJson, runCommand, runCommandSync, shortenHome, } from "./util.js";
|
|
5
|
+
import { authStorePath, loadAuthStore, loadConfig, saveAuthStore, saveConfig } from "./state.js";
|
|
6
|
+
const CLAUDE_KEYCHAIN_SERVICE = "Claude Code-credentials";
|
|
7
|
+
const CODEX_KEYCHAIN_SERVICE = "Codex Auth";
|
|
8
|
+
export async function detectEnvironment() {
|
|
9
|
+
const claudeCommand = commandExists("claude");
|
|
10
|
+
const codexCommand = commandExists("codex");
|
|
11
|
+
const acpxCommand = commandExists("acpx");
|
|
12
|
+
const acpxVersion = acpxCommand
|
|
13
|
+
? (await runCommand("acpx", ["--version"], {
|
|
14
|
+
allowFailure: true,
|
|
15
|
+
})).stdout.trim()
|
|
16
|
+
: undefined;
|
|
17
|
+
const npmAcpxLatest = (await runCommand("npm", ["view", "acpx", "version"], {
|
|
18
|
+
allowFailure: true,
|
|
19
|
+
})).stdout.trim();
|
|
20
|
+
const claude = await readClaudeCliCredential();
|
|
21
|
+
const codex = await readCodexCliCredential();
|
|
22
|
+
return {
|
|
23
|
+
claudeCommand,
|
|
24
|
+
codexCommand,
|
|
25
|
+
acpxCommand,
|
|
26
|
+
acpxVersion,
|
|
27
|
+
npmAcpxLatest,
|
|
28
|
+
anthropicEnv: Boolean(process.env.ANTHROPIC_API_KEY?.trim()),
|
|
29
|
+
openaiEnv: Boolean(process.env.OPENAI_API_KEY?.trim()),
|
|
30
|
+
claudeCredential: claude?.credential,
|
|
31
|
+
claudeCredentialSource: claude?.source,
|
|
32
|
+
codexCredential: codex?.credential,
|
|
33
|
+
codexCredentialSource: codex?.source,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export async function syncExternalCredentials() {
|
|
37
|
+
const store = await loadAuthStore();
|
|
38
|
+
const claude = await readClaudeCliCredential();
|
|
39
|
+
if (claude?.credential) {
|
|
40
|
+
store.profiles["anthropic:claude-code"] = claude.credential;
|
|
41
|
+
}
|
|
42
|
+
const codex = await readCodexCliCredential();
|
|
43
|
+
if (codex?.credential) {
|
|
44
|
+
store.profiles["openai-codex:default"] = codex.credential;
|
|
45
|
+
}
|
|
46
|
+
if (process.env.ANTHROPIC_API_KEY?.trim()) {
|
|
47
|
+
store.profiles["anthropic:env"] = {
|
|
48
|
+
type: "api_key",
|
|
49
|
+
provider: "anthropic",
|
|
50
|
+
key: process.env.ANTHROPIC_API_KEY.trim(),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (process.env.OPENAI_API_KEY?.trim()) {
|
|
54
|
+
store.profiles["openai:env"] = {
|
|
55
|
+
type: "api_key",
|
|
56
|
+
provider: "openai",
|
|
57
|
+
key: process.env.OPENAI_API_KEY.trim(),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
await saveAuthStore(store);
|
|
61
|
+
return store;
|
|
62
|
+
}
|
|
63
|
+
export async function runDoctor(options) {
|
|
64
|
+
const detection = await detectEnvironment();
|
|
65
|
+
const store = await syncExternalCredentials();
|
|
66
|
+
const config = await loadConfig();
|
|
67
|
+
const payload = {
|
|
68
|
+
commands: {
|
|
69
|
+
claude: detection.claudeCommand,
|
|
70
|
+
codex: detection.codexCommand,
|
|
71
|
+
acpx: detection.acpxCommand,
|
|
72
|
+
acpxVersion: detection.acpxVersion || null,
|
|
73
|
+
acpxLatest: detection.npmAcpxLatest || null,
|
|
74
|
+
},
|
|
75
|
+
auth: {
|
|
76
|
+
storePath: authStorePath(),
|
|
77
|
+
profiles: Object.keys(store.profiles).sort(),
|
|
78
|
+
claudeCredentialSource: detection.claudeCredentialSource || null,
|
|
79
|
+
codexCredentialSource: detection.codexCredentialSource || null,
|
|
80
|
+
},
|
|
81
|
+
config,
|
|
82
|
+
};
|
|
83
|
+
if (options?.json) {
|
|
84
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
console.log("Rudder doctor");
|
|
88
|
+
console.log(` claude: ${status(detection.claudeCommand)}`);
|
|
89
|
+
console.log(` codex: ${status(detection.codexCommand)}`);
|
|
90
|
+
console.log(` acpx: ${status(detection.acpxCommand)}${detection.acpxVersion ? ` (${detection.acpxVersion})` : ""}${detection.npmAcpxLatest ? ` latest=${detection.npmAcpxLatest}` : ""}`);
|
|
91
|
+
console.log(` auth: ${shortenHome(authStorePath())}`);
|
|
92
|
+
for (const [profileId, credential] of Object.entries(store.profiles).sort()) {
|
|
93
|
+
console.log(` - ${profileId} (${credential.provider}/${credential.type})`);
|
|
94
|
+
}
|
|
95
|
+
if (!detection.acpxCommand) {
|
|
96
|
+
console.log(" fix: run `npm install -g acpx@latest` or `rudder onboard`");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export async function runOnboard(options) {
|
|
100
|
+
const config = await loadConfig();
|
|
101
|
+
let store = await syncExternalCredentials();
|
|
102
|
+
const detection = await detectEnvironment();
|
|
103
|
+
if (!options?.nonInteractive && process.stdin.isTTY) {
|
|
104
|
+
const acpxBehind = detection.acpxCommand &&
|
|
105
|
+
detection.acpxVersion &&
|
|
106
|
+
detection.npmAcpxLatest &&
|
|
107
|
+
detection.acpxVersion !== detection.npmAcpxLatest;
|
|
108
|
+
if (!detection.acpxCommand || acpxBehind) {
|
|
109
|
+
const install = await promptConfirm(detection.acpxCommand
|
|
110
|
+
? `Update acpx ${detection.acpxVersion} to latest ${detection.npmAcpxLatest}?`
|
|
111
|
+
: "Install acpx globally with npm install -g acpx@latest?", true);
|
|
112
|
+
if (install) {
|
|
113
|
+
await runCommand("npm", ["install", "-g", "acpx@latest"]);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
store = await configureAnthropic(store, config);
|
|
117
|
+
store = await configureOpenAI(store, config);
|
|
118
|
+
}
|
|
119
|
+
await saveAuthStore(store);
|
|
120
|
+
await saveConfig(config);
|
|
121
|
+
if (options?.json) {
|
|
122
|
+
console.log(JSON.stringify({
|
|
123
|
+
config,
|
|
124
|
+
authStore: authStorePath(),
|
|
125
|
+
profiles: Object.keys(store.profiles).sort(),
|
|
126
|
+
}, null, 2));
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
console.log("Rudder configured");
|
|
130
|
+
console.log(` auth: ${shortenHome(authStorePath())}`);
|
|
131
|
+
console.log(` profiles: ${Object.keys(store.profiles).sort().join(", ") || "(none)"}`);
|
|
132
|
+
console.log(' try: rudder "fix the failing tests"');
|
|
133
|
+
}
|
|
134
|
+
async function configureAnthropic(store, config) {
|
|
135
|
+
if (store.profiles["anthropic:claude-code"] || store.profiles["anthropic:env"]) {
|
|
136
|
+
config.backends.claude = {
|
|
137
|
+
...(config.backends.claude ?? {}),
|
|
138
|
+
profileId: store.profiles["anthropic:claude-code"] ? "anthropic:claude-code" : "anthropic:env",
|
|
139
|
+
model: config.backends.claude?.model ?? "opus",
|
|
140
|
+
effort: "xhigh",
|
|
141
|
+
};
|
|
142
|
+
return store;
|
|
143
|
+
}
|
|
144
|
+
const choice = await promptSelect("Anthropic / Claude Code auth", [
|
|
145
|
+
{
|
|
146
|
+
value: "setup-token",
|
|
147
|
+
label: "Paste setup-token",
|
|
148
|
+
hint: "Run `claude setup-token`, then paste the generated token",
|
|
149
|
+
},
|
|
150
|
+
{ value: "api-key", label: "Anthropic API key", hint: "Direct API key" },
|
|
151
|
+
{ value: "skip", label: "Skip Anthropic for now" },
|
|
152
|
+
], "setup-token");
|
|
153
|
+
if (choice === "setup-token") {
|
|
154
|
+
const token = await promptText("Paste Anthropic setup-token");
|
|
155
|
+
store.profiles["anthropic:default"] = {
|
|
156
|
+
type: "token",
|
|
157
|
+
provider: "anthropic",
|
|
158
|
+
token,
|
|
159
|
+
};
|
|
160
|
+
config.backends.claude = { ...(config.backends.claude ?? {}), profileId: "anthropic:default" };
|
|
161
|
+
}
|
|
162
|
+
if (choice === "api-key") {
|
|
163
|
+
const key = await promptText("Paste Anthropic API key");
|
|
164
|
+
store.profiles["anthropic:default"] = {
|
|
165
|
+
type: "api_key",
|
|
166
|
+
provider: "anthropic",
|
|
167
|
+
key,
|
|
168
|
+
};
|
|
169
|
+
config.backends.claude = { ...(config.backends.claude ?? {}), profileId: "anthropic:default" };
|
|
170
|
+
}
|
|
171
|
+
return store;
|
|
172
|
+
}
|
|
173
|
+
async function configureOpenAI(store, config) {
|
|
174
|
+
if (store.profiles["openai-codex:default"] || store.profiles["openai:env"]) {
|
|
175
|
+
config.backends.codex = {
|
|
176
|
+
...(config.backends.codex ?? {}),
|
|
177
|
+
profileId: store.profiles["openai-codex:default"] ? "openai-codex:default" : "openai:env",
|
|
178
|
+
model: config.backends.codex?.model ?? "gpt-5.4-codex",
|
|
179
|
+
reasoningEffort: "xhigh",
|
|
180
|
+
};
|
|
181
|
+
return store;
|
|
182
|
+
}
|
|
183
|
+
const choice = await promptSelect("OpenAI / Codex auth", [
|
|
184
|
+
{ value: "codex-login", label: "Run Codex login", hint: "Uses official Codex CLI auth" },
|
|
185
|
+
{ value: "api-key", label: "OpenAI API key", hint: "Direct API key" },
|
|
186
|
+
{ value: "skip", label: "Skip OpenAI for now" },
|
|
187
|
+
], "codex-login");
|
|
188
|
+
if (choice === "codex-login") {
|
|
189
|
+
await runCommand("codex", ["login"]);
|
|
190
|
+
const codex = await readCodexCliCredential();
|
|
191
|
+
if (codex?.credential) {
|
|
192
|
+
store.profiles["openai-codex:default"] = codex.credential;
|
|
193
|
+
config.backends.codex = { ...(config.backends.codex ?? {}), profileId: "openai-codex:default" };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
if (choice === "api-key") {
|
|
197
|
+
const key = await promptText("Paste OpenAI API key");
|
|
198
|
+
store.profiles["openai:default"] = {
|
|
199
|
+
type: "api_key",
|
|
200
|
+
provider: "openai",
|
|
201
|
+
key,
|
|
202
|
+
};
|
|
203
|
+
config.backends.codex = { ...(config.backends.codex ?? {}), profileId: "openai:default" };
|
|
204
|
+
}
|
|
205
|
+
return store;
|
|
206
|
+
}
|
|
207
|
+
export async function readClaudeCliCredential() {
|
|
208
|
+
const keychain = readClaudeKeychainCredential();
|
|
209
|
+
if (keychain) {
|
|
210
|
+
return { credential: keychain, source: "macOS Keychain Claude Code-credentials" };
|
|
211
|
+
}
|
|
212
|
+
const filePath = expandHome("~/.claude/.credentials.json");
|
|
213
|
+
const raw = await readJson(filePath);
|
|
214
|
+
const parsed = parseClaudeOauth(raw?.claudeAiOauth);
|
|
215
|
+
return parsed ? { credential: parsed, source: shortenHome(filePath) } : null;
|
|
216
|
+
}
|
|
217
|
+
function readClaudeKeychainCredential() {
|
|
218
|
+
if (process.platform !== "darwin") {
|
|
219
|
+
return null;
|
|
220
|
+
}
|
|
221
|
+
const result = runCommandSync("security", ["find-generic-password", "-s", CLAUDE_KEYCHAIN_SERVICE, "-w"], {
|
|
222
|
+
allowFailure: true,
|
|
223
|
+
});
|
|
224
|
+
if (result.code !== 0 || !result.stdout.trim()) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
const raw = JSON.parse(result.stdout.trim());
|
|
229
|
+
return parseClaudeOauth(raw.claudeAiOauth);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return null;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
function parseClaudeOauth(raw) {
|
|
236
|
+
if (!raw || typeof raw !== "object") {
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
const entry = raw;
|
|
240
|
+
const access = entry.accessToken;
|
|
241
|
+
const refresh = entry.refreshToken;
|
|
242
|
+
const expires = entry.expiresAt;
|
|
243
|
+
if (typeof access !== "string" || !access || typeof expires !== "number") {
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
if (typeof refresh === "string" && refresh) {
|
|
247
|
+
return {
|
|
248
|
+
type: "oauth",
|
|
249
|
+
provider: "anthropic",
|
|
250
|
+
access,
|
|
251
|
+
refresh,
|
|
252
|
+
expires,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
return {
|
|
256
|
+
type: "token",
|
|
257
|
+
provider: "anthropic",
|
|
258
|
+
token: access,
|
|
259
|
+
expires,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
export async function readCodexCliCredential() {
|
|
263
|
+
const keychain = readCodexKeychainCredential();
|
|
264
|
+
if (keychain) {
|
|
265
|
+
return { credential: keychain, source: "macOS Keychain Codex Auth" };
|
|
266
|
+
}
|
|
267
|
+
const filePath = codexAuthPath();
|
|
268
|
+
const raw = await readJson(filePath);
|
|
269
|
+
const parsed = parseCodexAuth(raw, filePath);
|
|
270
|
+
return parsed ? { credential: parsed, source: shortenHome(filePath) } : null;
|
|
271
|
+
}
|
|
272
|
+
function readCodexKeychainCredential() {
|
|
273
|
+
if (process.platform !== "darwin") {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const account = computeCodexKeychainAccount();
|
|
277
|
+
const result = runCommandSync("security", ["find-generic-password", "-s", CODEX_KEYCHAIN_SERVICE, "-a", account, "-w"], { allowFailure: true });
|
|
278
|
+
if (result.code !== 0 || !result.stdout.trim()) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
return parseCodexAuth(JSON.parse(result.stdout.trim()), codexAuthPath());
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return null;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function parseCodexAuth(raw, authPathForExpiry) {
|
|
289
|
+
if (!raw || typeof raw !== "object") {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
const data = raw;
|
|
293
|
+
const tokens = data.tokens;
|
|
294
|
+
if (!tokens || typeof tokens !== "object") {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
const tokenRecord = tokens;
|
|
298
|
+
const access = tokenRecord.access_token;
|
|
299
|
+
const refresh = tokenRecord.refresh_token;
|
|
300
|
+
if (typeof access !== "string" || !access || typeof refresh !== "string" || !refresh) {
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
const lastRefresh = data.last_refresh;
|
|
304
|
+
const lastRefreshMs = typeof lastRefresh === "string" || typeof lastRefresh === "number"
|
|
305
|
+
? new Date(lastRefresh).getTime()
|
|
306
|
+
: Number.NaN;
|
|
307
|
+
let expires = Number.isFinite(lastRefreshMs) ? lastRefreshMs + 60 * 60 * 1000 : Date.now() + 60 * 60 * 1000;
|
|
308
|
+
try {
|
|
309
|
+
if (Number.isNaN(lastRefreshMs)) {
|
|
310
|
+
expires = fs.statSync(authPathForExpiry).mtimeMs + 60 * 60 * 1000;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
// Keep fallback expiry.
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
type: "oauth",
|
|
318
|
+
provider: "openai-codex",
|
|
319
|
+
access,
|
|
320
|
+
refresh,
|
|
321
|
+
expires,
|
|
322
|
+
...(typeof tokenRecord.account_id === "string" ? { accountId: tokenRecord.account_id } : {}),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function codexHome() {
|
|
326
|
+
const configured = process.env.CODEX_HOME?.trim();
|
|
327
|
+
const home = configured ? expandHome(configured) : expandHome("~/.codex");
|
|
328
|
+
try {
|
|
329
|
+
return fs.realpathSync.native(home);
|
|
330
|
+
}
|
|
331
|
+
catch {
|
|
332
|
+
return home;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
function codexAuthPath() {
|
|
336
|
+
return path.join(codexHome(), "auth.json");
|
|
337
|
+
}
|
|
338
|
+
function computeCodexKeychainAccount() {
|
|
339
|
+
const hash = createHash("sha256").update(codexHome()).digest("hex");
|
|
340
|
+
return `cli|${hash.slice(0, 16)}`;
|
|
341
|
+
}
|
|
342
|
+
function status(ok) {
|
|
343
|
+
return ok ? "ok" : "missing";
|
|
344
|
+
}
|
|
345
|
+
export async function authStoreExists() {
|
|
346
|
+
return await pathExists(authStorePath());
|
|
347
|
+
}
|
|
348
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|