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 ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -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"}
@@ -0,0 +1,3 @@
1
+ export { getOAuthToken, isTokenExpired } from "./keychain.js";
2
+ export type { ClaudeOAuthToken, KeychainCredentials } from "./keychain.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export { getOAuthToken, isTokenExpired } from "./keychain.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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
+ }