claude-code-infinite 1.0.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/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +183 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +43 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/keychain.d.ts +14 -0
- package/dist/keychain.d.ts.map +1 -0
- package/dist/keychain.js +54 -0
- package/dist/keychain.js.map +1 -0
- package/package.json +31 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
3
|
+
import * as readline from "node:readline";
|
|
4
|
+
import { getOAuthToken, isTokenExpired } from "./keychain.js";
|
|
5
|
+
import { getPolychatApiKey, setPolychatApiKey, getLocalPolychatApiKey, setLocalPolychatApiKey, } from "./config.js";
|
|
6
|
+
const POLYCHAT_BASE_URL = "https://polychat.co/cc";
|
|
7
|
+
const LOCAL_BASE_URL = "http://localhost:8080/cc";
|
|
8
|
+
const POLYCHAT_AUTH_URL = "https://polychat.co/auth?memtree=true";
|
|
9
|
+
async function promptForApiKey(isLocal) {
|
|
10
|
+
const rl = readline.createInterface({
|
|
11
|
+
input: process.stdin,
|
|
12
|
+
output: process.stdout,
|
|
13
|
+
});
|
|
14
|
+
if (isLocal) {
|
|
15
|
+
console.log("\nLocal POLYCHAT_API_KEY not found.");
|
|
16
|
+
console.log("Please visit: http://local.polychat.co:5173/memtree-api");
|
|
17
|
+
console.log("to obtain your local API key.\n");
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log("\nPOLYCHAT_API_KEY not found.");
|
|
21
|
+
console.log(`Please visit: ${POLYCHAT_AUTH_URL}`);
|
|
22
|
+
console.log("to obtain your API key.\n");
|
|
23
|
+
}
|
|
24
|
+
const prompt = isLocal ? "Enter your local POLYCHAT_API_KEY: " : "Enter your POLYCHAT_API_KEY: ";
|
|
25
|
+
return new Promise((resolve) => {
|
|
26
|
+
rl.question(prompt, (answer) => {
|
|
27
|
+
rl.close();
|
|
28
|
+
resolve(answer.trim());
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async function refreshOAuthToken(debug) {
|
|
33
|
+
console.log("\x1b[1;33m🔄 OAuth token expired. Refreshing...\x1b[0m\n");
|
|
34
|
+
// Get current expiry to detect when it changes
|
|
35
|
+
const currentCredentials = getOAuthToken(false);
|
|
36
|
+
const currentExpiry = currentCredentials?.claudeAiOauth?.expiresAt ?? 0;
|
|
37
|
+
// Spawn claude interactively - this triggers the OAuth refresh flow
|
|
38
|
+
if (debug) {
|
|
39
|
+
console.log("[DEBUG] Spawning 'claude' to trigger token refresh...");
|
|
40
|
+
}
|
|
41
|
+
const child = spawn("claude", [], {
|
|
42
|
+
stdio: "inherit",
|
|
43
|
+
detached: false,
|
|
44
|
+
});
|
|
45
|
+
// Poll keychain until token is refreshed or timeout
|
|
46
|
+
const maxWaitMs = 10000;
|
|
47
|
+
const pollIntervalMs = 100;
|
|
48
|
+
let elapsed = 0;
|
|
49
|
+
let refreshedToken = null;
|
|
50
|
+
while (elapsed < maxWaitMs) {
|
|
51
|
+
await new Promise((r) => setTimeout(r, pollIntervalMs));
|
|
52
|
+
elapsed += pollIntervalMs;
|
|
53
|
+
const creds = getOAuthToken(false);
|
|
54
|
+
if (creds?.claudeAiOauth && creds.claudeAiOauth.expiresAt !== currentExpiry) {
|
|
55
|
+
refreshedToken = creds.claudeAiOauth;
|
|
56
|
+
if (debug) {
|
|
57
|
+
console.log(`[DEBUG] Token refreshed after ${elapsed}ms`);
|
|
58
|
+
}
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Kill the claude process
|
|
63
|
+
if (debug) {
|
|
64
|
+
console.log("[DEBUG] Killing claude process...");
|
|
65
|
+
}
|
|
66
|
+
child.kill("SIGTERM");
|
|
67
|
+
// Wait for process to exit
|
|
68
|
+
await new Promise((resolve) => {
|
|
69
|
+
child.on("exit", () => resolve());
|
|
70
|
+
if (child.exitCode !== null)
|
|
71
|
+
resolve();
|
|
72
|
+
});
|
|
73
|
+
if (debug) {
|
|
74
|
+
console.log("[DEBUG] Claude process terminated");
|
|
75
|
+
}
|
|
76
|
+
if (!refreshedToken) {
|
|
77
|
+
console.error("OAuth token refresh timed out.");
|
|
78
|
+
console.error("Please run 'claude' directly to re-authenticate.");
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (isTokenExpired(refreshedToken, debug)) {
|
|
82
|
+
console.error("OAuth token is still expired after refresh attempt.");
|
|
83
|
+
console.error("Please run 'claude' directly to re-authenticate.");
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
console.log("\x1b[1;32m✓ OAuth token refreshed successfully!\x1b[0m\n");
|
|
87
|
+
return refreshedToken;
|
|
88
|
+
}
|
|
89
|
+
function printBanner() {
|
|
90
|
+
const banner = `
|
|
91
|
+
\x1b[38;5;209m ██████╗██╗ █████╗ ██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ ██████╗ ███████╗
|
|
92
|
+
██╔════╝██║ ██╔══██╗██║ ██║██╔══██╗██╔════╝ ██╔════╝██╔═══██╗██╔══██╗██╔════╝
|
|
93
|
+
██║ ██║ ███████║██║ ██║██║ ██║█████╗ ██║ ██║ ██║██║ ██║█████╗
|
|
94
|
+
██║ ██║ ██╔══██║██║ ██║██║ ██║██╔══╝ ██║ ██║ ██║██║ ██║██╔══╝
|
|
95
|
+
╚██████╗███████╗██║ ██║╚██████╔╝██████╔╝███████╗ ╚██████╗╚██████╔╝██████╔╝███████╗
|
|
96
|
+
╚═════╝╚══════╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝
|
|
97
|
+
\x1b[1;38;2;255;165;0m██╗███╗ ██╗███████╗██╗███╗ ██╗██╗████████╗███████╗
|
|
98
|
+
██║████╗ ██║██╔════╝██║████╗ ██║██║╚══██╔══╝██╔════╝
|
|
99
|
+
██║██╔██╗ ██║█████╗ ██║██╔██╗ ██║██║ ██║ █████╗
|
|
100
|
+
██║██║╚██╗██║██╔══╝ ██║██║╚██╗██║██║ ██║ ██╔══╝
|
|
101
|
+
██║██║ ╚████║██║ ██║██║ ╚████║██║ ██║ ███████╗
|
|
102
|
+
╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ╚══════╝\x1b[0m
|
|
103
|
+
|
|
104
|
+
\x1b[1;38;5;48m✦ Infinitely-long coding sessions for Claude, powered by \x1b]8;;https://MemTree.dev\x1b\\MemTree.dev\x1b]8;;\x1b\\\x1b[0m
|
|
105
|
+
\x1b[1;38;5;87m✦ Get the speed and quality of a fresh chat with every message\x1b[0m
|
|
106
|
+
\x1b[1;38;5;87m✦ Retrieves relevant info from entire thread \x1b[0m
|
|
107
|
+
`;
|
|
108
|
+
console.log(banner);
|
|
109
|
+
}
|
|
110
|
+
async function main() {
|
|
111
|
+
// Check for local mode and debug flag
|
|
112
|
+
const args = process.argv.slice(2);
|
|
113
|
+
const isDebugMode = args.includes("--debug");
|
|
114
|
+
const filteredArgs = args.filter((arg) => arg !== "--debug");
|
|
115
|
+
const isLocalMode = filteredArgs[0] === "local";
|
|
116
|
+
const claudeArgs = isLocalMode ? filteredArgs.slice(1) : filteredArgs;
|
|
117
|
+
printBanner();
|
|
118
|
+
if (isDebugMode) {
|
|
119
|
+
console.log("\x1b[1;36m🔍 DEBUG MODE\x1b[0m\n");
|
|
120
|
+
}
|
|
121
|
+
if (isLocalMode) {
|
|
122
|
+
console.log("\x1b[1;33m🏠 LOCAL MODE\x1b[0m\n");
|
|
123
|
+
}
|
|
124
|
+
// Get OAuth token from keychain
|
|
125
|
+
const credentials = getOAuthToken(isDebugMode);
|
|
126
|
+
if (!credentials?.claudeAiOauth) {
|
|
127
|
+
console.error("Could not retrieve Claude OAuth credentials from keychain.");
|
|
128
|
+
console.error("Make sure you're logged into Claude Code first.");
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
let oauthToken = credentials.claudeAiOauth;
|
|
132
|
+
// If token is expired, attempt to refresh it by launching Claude
|
|
133
|
+
if (isTokenExpired(oauthToken, isDebugMode)) {
|
|
134
|
+
const refreshedToken = await refreshOAuthToken(isDebugMode);
|
|
135
|
+
if (!refreshedToken) {
|
|
136
|
+
process.exit(1);
|
|
137
|
+
}
|
|
138
|
+
oauthToken = refreshedToken;
|
|
139
|
+
}
|
|
140
|
+
// Get or prompt for Polychat API key (separate keys for local vs production)
|
|
141
|
+
let polychatApiKey = isLocalMode ? getLocalPolychatApiKey() : getPolychatApiKey();
|
|
142
|
+
if (!polychatApiKey) {
|
|
143
|
+
polychatApiKey = await promptForApiKey(isLocalMode);
|
|
144
|
+
if (!polychatApiKey) {
|
|
145
|
+
console.error("POLYCHAT_API_KEY is required.");
|
|
146
|
+
process.exit(1);
|
|
147
|
+
}
|
|
148
|
+
if (isLocalMode) {
|
|
149
|
+
setLocalPolychatApiKey(polychatApiKey);
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
setPolychatApiKey(polychatApiKey);
|
|
153
|
+
}
|
|
154
|
+
console.log("API key saved.\n");
|
|
155
|
+
}
|
|
156
|
+
// Build combined auth token
|
|
157
|
+
const combinedAuthToken = `${oauthToken.accessToken},${polychatApiKey}`;
|
|
158
|
+
// Choose base URL based on mode
|
|
159
|
+
const baseUrl = isLocalMode ? LOCAL_BASE_URL : POLYCHAT_BASE_URL;
|
|
160
|
+
// Spawn claude with the environment variables
|
|
161
|
+
const child = spawn("claude", claudeArgs, {
|
|
162
|
+
env: {
|
|
163
|
+
...process.env,
|
|
164
|
+
ANTHROPIC_BASE_URL: baseUrl,
|
|
165
|
+
ANTHROPIC_AUTH_TOKEN: combinedAuthToken,
|
|
166
|
+
},
|
|
167
|
+
stdio: "inherit",
|
|
168
|
+
});
|
|
169
|
+
child.on("error", (err) => {
|
|
170
|
+
if (err.code === "ENOENT") {
|
|
171
|
+
console.error("Could not find 'claude' command. Make sure Claude Code is installed.");
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
console.error("Failed to start claude:", err.message);
|
|
175
|
+
}
|
|
176
|
+
process.exit(1);
|
|
177
|
+
});
|
|
178
|
+
child.on("exit", (code) => {
|
|
179
|
+
process.exit(code ?? 0);
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
main().catch(console.error);
|
|
183
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
polychatApiKey?: string;
|
|
3
|
+
localPolychatApiKey?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function getConfigDir(): string;
|
|
6
|
+
export declare function loadConfig(): Config;
|
|
7
|
+
export declare function saveConfig(config: Config): void;
|
|
8
|
+
export declare function getPolychatApiKey(): string | undefined;
|
|
9
|
+
export declare function setPolychatApiKey(key: string): void;
|
|
10
|
+
export declare function getLocalPolychatApiKey(): string | undefined;
|
|
11
|
+
export declare function setLocalPolychatApiKey(key: string): void;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAKD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAWnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM/C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIxD"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const CONFIG_DIR = join(homedir(), ".claude-code-infinite");
|
|
5
|
+
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
6
|
+
export function getConfigDir() {
|
|
7
|
+
return CONFIG_DIR;
|
|
8
|
+
}
|
|
9
|
+
export function loadConfig() {
|
|
10
|
+
if (!existsSync(CONFIG_FILE)) {
|
|
11
|
+
return {};
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
const content = readFileSync(CONFIG_FILE, "utf-8");
|
|
15
|
+
return JSON.parse(content);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function saveConfig(config) {
|
|
22
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
23
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
24
|
+
}
|
|
25
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
26
|
+
}
|
|
27
|
+
export function getPolychatApiKey() {
|
|
28
|
+
return loadConfig().polychatApiKey;
|
|
29
|
+
}
|
|
30
|
+
export function setPolychatApiKey(key) {
|
|
31
|
+
const config = loadConfig();
|
|
32
|
+
config.polychatApiKey = key;
|
|
33
|
+
saveConfig(config);
|
|
34
|
+
}
|
|
35
|
+
export function getLocalPolychatApiKey() {
|
|
36
|
+
return loadConfig().localPolychatApiKey;
|
|
37
|
+
}
|
|
38
|
+
export function setLocalPolychatApiKey(key) {
|
|
39
|
+
const config = loadConfig();
|
|
40
|
+
config.localPolychatApiKey = key;
|
|
41
|
+
saveConfig(config);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEpD,MAAM,UAAU,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,EAAE,CAAC,cAAc,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC;IAC5B,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,UAAU,EAAE,CAAC,mBAAmB,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,mBAAmB,GAAG,GAAG,CAAC;IACjC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ClaudeOAuthToken {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
expiresAt: number;
|
|
5
|
+
scopes: string[];
|
|
6
|
+
subscriptionType: string;
|
|
7
|
+
rateLimitTier: string;
|
|
8
|
+
}
|
|
9
|
+
export interface KeychainCredentials {
|
|
10
|
+
claudeAiOauth?: ClaudeOAuthToken;
|
|
11
|
+
}
|
|
12
|
+
export declare function getOAuthToken(debug?: boolean): KeychainCredentials | null;
|
|
13
|
+
export declare function isTokenExpired(token: ClaudeOAuthToken, debug?: boolean): boolean;
|
|
14
|
+
//# sourceMappingURL=keychain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,aAAa,CAAC,EAAE,gBAAgB,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,KAAK,UAAQ,GAAG,mBAAmB,GAAG,IAAI,CA+CvE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,UAAQ,GAAG,OAAO,CAY9E"}
|
package/dist/keychain.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { userInfo } from "node:os";
|
|
3
|
+
export function getOAuthToken(debug = false) {
|
|
4
|
+
if (process.platform !== "darwin") {
|
|
5
|
+
console.error("OAuth token extraction is only supported on macOS");
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const username = userInfo().username;
|
|
9
|
+
try {
|
|
10
|
+
if (debug) {
|
|
11
|
+
console.log(`[DEBUG] Reading keychain for user: ${username}`);
|
|
12
|
+
}
|
|
13
|
+
const result = execSync(`security find-generic-password -s "Claude Code-credentials" -a "${username}" -w`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
14
|
+
const credentials = JSON.parse(result.trim());
|
|
15
|
+
if (debug && credentials?.claudeAiOauth) {
|
|
16
|
+
const token = credentials.claudeAiOauth;
|
|
17
|
+
const now = Date.now();
|
|
18
|
+
const expiresAt = token.expiresAt;
|
|
19
|
+
const expiresInMs = expiresAt - now;
|
|
20
|
+
const expiresInMins = Math.round(expiresInMs / 1000 / 60);
|
|
21
|
+
console.log(`[DEBUG] Token retrieved from keychain:`);
|
|
22
|
+
console.log(` - expiresAt: ${expiresAt} (${new Date(expiresAt).toISOString()})`);
|
|
23
|
+
console.log(` - now: ${now} (${new Date(now).toISOString()})`);
|
|
24
|
+
console.log(` - expires in: ${expiresInMins} minutes (${expiresInMs}ms)`);
|
|
25
|
+
console.log(` - subscriptionType: ${token.subscriptionType}`);
|
|
26
|
+
console.log(` - rateLimitTier: ${token.rateLimitTier}`);
|
|
27
|
+
console.log(` - scopes: ${token.scopes?.join(", ")}`);
|
|
28
|
+
console.log(` - accessToken length: ${token.accessToken?.length ?? 0}`);
|
|
29
|
+
console.log(` - refreshToken length: ${token.refreshToken?.length ?? 0}`);
|
|
30
|
+
}
|
|
31
|
+
return credentials;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error instanceof Error && error.message.includes("could not be found")) {
|
|
35
|
+
console.error("No Claude Code credentials found in keychain");
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error("Failed to retrieve credentials from keychain:", error);
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function isTokenExpired(token, debug = false) {
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
const expired = now > token.expiresAt;
|
|
46
|
+
if (debug) {
|
|
47
|
+
console.log(`[DEBUG] Token expiry check:`);
|
|
48
|
+
console.log(` - now: ${now} (${new Date(now).toISOString()})`);
|
|
49
|
+
console.log(` - expiresAt: ${token.expiresAt} (${new Date(token.expiresAt).toISOString()})`);
|
|
50
|
+
console.log(` - expired: ${expired}`);
|
|
51
|
+
}
|
|
52
|
+
return expired;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=keychain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "claude-code-infinite",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Wrapper for Claude Code CLI",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"cc-inf": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"start": "node dist/cli.js",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": ["claude", "cli", "ai"],
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/crizCraig/claude-code-infinite.git"
|
|
24
|
+
},
|
|
25
|
+
"author": "crizCraig",
|
|
26
|
+
"license": "ISC",
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/node": "^25.0.0",
|
|
29
|
+
"typescript": "^5.9.3"
|
|
30
|
+
}
|
|
31
|
+
}
|