claude-code-infinite 1.0.5 → 1.0.11
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 +54 -14
- package/dist/cli.js +19 -5
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,23 +4,25 @@
|
|
|
4
4
|
|
|
5
5
|
# Claude Code Infinite
|
|
6
6
|
|
|
7
|
-
* Maximize Claude's intelligence with [MemTree.dev](https://memtree.dev)
|
|
7
|
+
* Maximize Claude's intelligence with context-management from [MemTree.dev](https://memtree.dev)
|
|
8
8
|
* Supports unlimited-length coding sessions
|
|
9
9
|
* Feels fast and fresh with every message
|
|
10
10
|
* Automatically recalls only the relevant past information
|
|
11
|
-
* Allows you to
|
|
11
|
+
* Allows you to continue your session without summarizing or compacting
|
|
12
12
|
|
|
13
13
|
## Requirements
|
|
14
14
|
|
|
15
15
|
* [node.js 18 or newer](https://nodejs.org/en/download/)
|
|
16
16
|
* [Claude Code (the terminal version)](https://code.claude.com/docs/en/quickstart)
|
|
17
|
-
* **Claude Subscription** - optional but highly recommended as this offers up to 1000x cost savings vs Anthropic's API pricing
|
|
17
|
+
* **Claude Subscription** - optional but highly recommended as this offers up to 1000x cost savings vs Anthropic's API pricing
|
|
18
18
|
|
|
19
19
|
> [!NOTE]
|
|
20
|
-
>
|
|
20
|
+
> #### No Anthropic Subscription
|
|
21
|
+
> If you do not want to buy Anthropic subscription, choose option 2. "Anthropic Console account", during the Claude Code setup.
|
|
21
22
|
>
|
|
22
|
-
>
|
|
23
|
-
>
|
|
23
|
+
> You don't need to buy API credits, just login and Claude Code will let you complete setup. Anthropic API usage will be billed through https://polychat.co.
|
|
24
|
+
>
|
|
25
|
+
> Finally run `/logout` within Claude Code and rerun with `ccc`
|
|
24
26
|
|
|
25
27
|
## Setup
|
|
26
28
|
|
|
@@ -35,21 +37,34 @@ npm install -g claude-code-infinite
|
|
|
35
37
|
|
|
36
38
|
## How it works
|
|
37
39
|
|
|
40
|
+
<table><tr><td>
|
|
41
|
+
<img width="1050" height="445" alt="image" src="https://github.com/user-attachments/assets/d1ab2456-9a64-4118-a72a-b9d133c7c8bd" />
|
|
42
|
+
</td></tr></table>
|
|
43
|
+
|
|
44
|
+
|
|
38
45
|
When you send a message, we retrieve relevant details and summaries from the prior messages in your thread. These details and summaries populate a **memory message**. Following the memory message, we append a compressed version of your recent message history. The resulting context-window is dramatically smaller, allowing Claude to process your request with much greater efficacy, lower latency, and reduced cost.
|
|
39
46
|
|
|
47
|
+
## What this is NOT
|
|
48
|
+
|
|
49
|
+
This is not a MPC or tool for simply retrieving memories. While we are compatible with all MPC's, tools, and other Anthropic features, these do not prevent your context window from becoming detrimentally large. MCP's and tools are some of the biggest token bloaters and it's exactly these types of messages that we heavily reduce during our compression phase.
|
|
50
|
+
|
|
40
51
|
## Why it works
|
|
41
52
|
|
|
42
|
-
LLMs get exponentially
|
|
53
|
+
LLMs get exponentially less intelligent as their input grows.
|
|
43
54
|
|
|
44
55
|
References:
|
|
45
56
|
- [Lost in the Middle: How Language Models Use Long Contexts](https://arxiv.org/abs/2307.03172) (2023)
|
|
46
57
|
- [RULER: What's the Real Context Size of Your Long-Context Language Models?](https://arxiv.org/abs/2404.06654) (2024)
|
|
47
|
-
-
|
|
48
|
-
|
|
58
|
+
- <a href="https://research.trychroma.com/context-rot" target="_blank" rel="noopener noreferrer">Context Rot from Chroma</a> (2025)
|
|
59
|
+
|
|
60
|
+
<a href="https://www.youtube.com/watch?v=TUjQuC4ugak" target="_blank" rel="noopener noreferrer">
|
|
61
|
+
<img src="https://img.youtube.com/vi/TUjQuC4ugak/0.jpg" alt="Context Rot Video">
|
|
62
|
+
</a>
|
|
63
|
+
|
|
49
64
|
|
|
50
|
-
Furthermore, the above research primarily tests on needle-in-a-haystack tasks, which underestimates the effect for more difficult tasks encountered in coding
|
|
65
|
+
Furthermore, the above research primarily tests on needle-in-a-haystack tasks, which underestimates the effect for more difficult tasks encountered in coding.
|
|
51
66
|
|
|
52
|
-
This is why starting sessions from scratch provides such a significant uplift in ability. What we're essentially doing is keeping each session as close to from-scratch as possible by limiting the tokens in Claude's context window to around 30k, or 15% of the standard 200k context-limit, filled precisely with the information relevant to your **last** message.
|
|
67
|
+
This is why starting sessions from scratch provides such a significant uplift in ability. What we're essentially doing is keeping each session as close to from-scratch as possible by limiting the tokens in Claude's context window to around 30k, or 15% of the standard 200k context-limit, filled precisely with the information relevant to your **last** message. Read more about how MemTree works [here](https://api.polychat.co/context-memory).
|
|
53
68
|
|
|
54
69
|
### Operating System Analogy
|
|
55
70
|
|
|
@@ -58,7 +73,32 @@ It may seem strange that we are advocating for small context windows in a produc
|
|
|
58
73
|
So you can think of MemTree as an operating system's virtual memory manager. Just as an OS manages RAM by swapping less-used data to disk, MemTree manages the model's context window by intelligently recalling only the most relevant information from past interactions. This ensures that the model always has access to the most pertinent data without being overwhelmed by the entire history of the conversation.
|
|
59
74
|
|
|
60
75
|
|
|
61
|
-
## Usage
|
|
76
|
+
## Usage Tips
|
|
77
|
+
|
|
78
|
+
* If you want your session to apply to many different tasks, we recommend giving the overall high level goal you want for your session in the first message, e.g. "Refactor this project to remove code smells and bugs". Then followup with lower level tasks in subsequent messages. This as Anthropic models key heavily off the first message. You should also feel free to start new sessions for new tasks. This as the model will continue to have a focused context with your CLAUDE.md and first message always included. Reach out to support@polychat.co if you have any questions or concerns!
|
|
79
|
+
|
|
80
|
+
* Add context to your status line to see how MemTree keeps your context small
|
|
81
|
+
```bash
|
|
82
|
+
/statusline add context % used
|
|
83
|
+
```
|
|
84
|
+
* You want your fresh session context to be **10k** tokens or less. If your starting context is more than that, consider reducing the size of your custom MCP's and slash commands to ensure Claude performs at its very best
|
|
85
|
+
|
|
86
|
+
* You can resume previous threads with `/resume`
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
## Troubleshooting
|
|
90
|
+
|
|
91
|
+
### 401 {"detail":"Your session has expired or the token is invalid. Please sign in again."}
|
|
92
|
+
|
|
93
|
+
This happens if you chose "Anthropic Console account" during setup instead of using an Anthropic subscription.
|
|
94
|
+
|
|
95
|
+
Fix:
|
|
96
|
+
|
|
97
|
+
1. Run: `/logout`
|
|
98
|
+
2. Re-run `ccc`
|
|
99
|
+
|
|
100
|
+
This logs you out of your Anthropic Console account and keeps you in `ccc` which uses PolyChat. If you'd like to use your own API key with PolyChat, login to polychat.co and head over to our [BYOK settings](https://app.polychat.co/api-keys).
|
|
101
|
+
|
|
102
|
+
## API Rate limit errors
|
|
62
103
|
|
|
63
|
-
|
|
64
|
-
> If you want your session to apply to many different tasks, we recommend giving the overall high level goal you want for your session in the first message, e.g. "Refactor this project to remove code smells and bugs". Then followup with lower level tasks in subsequent messages. This as Anthropic models key heavily off the first message. You should also feel free to start new sessions for new tasks. This as the model will continue to have a focused context with your CLAUDE.md and first message always included. Reach out to support@polychat.co if you have any questions or concerns!
|
|
104
|
+
If you hit your Anthropic subscription's rate limits, you can still continue by running `/logout` and restarting `ccc`. This will bill tokens through your PolyChat subscription. Remember that you can use the `/resume` slash command to resume previous sessions.
|
package/dist/cli.js
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import spawn from "cross-spawn";
|
|
3
|
+
import { exec } from "node:child_process";
|
|
3
4
|
import * as readline from "node:readline";
|
|
4
5
|
import { getOAuthToken, isTokenExpired } from "./keychain.js";
|
|
5
6
|
import { getPolychatApiKey, setPolychatApiKey, getLocalPolychatApiKey, setLocalPolychatApiKey, } from "./config.js";
|
|
6
7
|
const POLYCHAT_BASE_URL = "https://polychat.co/cc";
|
|
7
8
|
const LOCAL_BASE_URL = "http://localhost:8080/cc";
|
|
8
9
|
const POLYCHAT_AUTH_URL = "https://polychat.co/auth?memtree=true";
|
|
10
|
+
function openUrl(url) {
|
|
11
|
+
const platform = process.platform;
|
|
12
|
+
const command = platform === "darwin" ? "open" : platform === "win32" ? "explorer" : "xdg-open";
|
|
13
|
+
platform === "win32" ? exec(`${command} "${url}"`, { shell: 'cmd.exe' }) : exec(`${command} "${url}"`);
|
|
14
|
+
}
|
|
9
15
|
async function promptForApiKey(isLocal) {
|
|
10
16
|
const rl = readline.createInterface({
|
|
11
17
|
input: process.stdin,
|
|
@@ -14,9 +20,16 @@ async function promptForApiKey(isLocal) {
|
|
|
14
20
|
const url = isLocal
|
|
15
21
|
? "http://local.polychat.co:5173/memtree-api"
|
|
16
22
|
: POLYCHAT_AUTH_URL;
|
|
17
|
-
|
|
23
|
+
// Wait for user to press enter before opening the URL
|
|
24
|
+
await new Promise((resolve) => {
|
|
25
|
+
rl.question(`\nPress Enter to open your browser to obtain your Memtree API key...`, () => {
|
|
26
|
+
resolve();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
// Open the URL in the default browser
|
|
30
|
+
openUrl(url);
|
|
18
31
|
return new Promise((resolve) => {
|
|
19
|
-
rl.question(
|
|
32
|
+
rl.question("Copy your API key and paste it here: ", (answer) => {
|
|
20
33
|
rl.close();
|
|
21
34
|
resolve(answer.trim());
|
|
22
35
|
});
|
|
@@ -27,12 +40,12 @@ async function refreshOAuthToken(debug) {
|
|
|
27
40
|
// Get current expiry to detect when it changes
|
|
28
41
|
const currentCredentials = getOAuthToken(false);
|
|
29
42
|
const currentExpiry = currentCredentials?.claudeAiOauth?.expiresAt ?? 0;
|
|
30
|
-
// Spawn claude
|
|
43
|
+
// Spawn claude in background - this triggers the OAuth refresh flow
|
|
31
44
|
if (debug) {
|
|
32
45
|
console.log("[DEBUG] Spawning 'claude' to trigger token refresh...");
|
|
33
46
|
}
|
|
34
47
|
const child = spawn("claude", [], {
|
|
35
|
-
stdio: "
|
|
48
|
+
stdio: "ignore",
|
|
36
49
|
detached: false,
|
|
37
50
|
});
|
|
38
51
|
// Poll keychain until token is refreshed or timeout
|
|
@@ -86,6 +99,7 @@ async function main() {
|
|
|
86
99
|
// Check for local mode and debug flag
|
|
87
100
|
const args = process.argv.slice(2);
|
|
88
101
|
const isDebugMode = args.includes("--debug");
|
|
102
|
+
const forceTokenRefresh = process.env.DEBUG_FORCE_EXPIRED === "1";
|
|
89
103
|
const filteredArgs = args.filter((arg) => arg !== "--debug");
|
|
90
104
|
const isLocalMode = filteredArgs[0] === "local";
|
|
91
105
|
const claudeArgs = isLocalMode ? filteredArgs.slice(1) : filteredArgs;
|
|
@@ -105,7 +119,7 @@ async function main() {
|
|
|
105
119
|
console.log("\x1b[33m MemTree.dev makes it even cheaper by reducing messages sent to Anthropic.\x1b[0m");
|
|
106
120
|
console.log("\x1b[33m Run '/login' to log in and get discounted rates.\x1b[0m\n");
|
|
107
121
|
}
|
|
108
|
-
else if (isTokenExpired(oauthToken, isDebugMode)) {
|
|
122
|
+
else if (forceTokenRefresh || isTokenExpired(oauthToken, isDebugMode)) {
|
|
109
123
|
// If token is expired, attempt to refresh it by launching Claude
|
|
110
124
|
const refreshedToken = await refreshOAuthToken(isDebugMode);
|
|
111
125
|
if (!refreshedToken) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAyB,MAAM,eAAe,CAAC;AACrF,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,aAAa,CAAC;AAErB,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;AACnD,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAClD,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AAElE,KAAK,UAAU,eAAe,CAAC,OAAgB;IAC7C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO;QACjB,CAAC,CAAC,2CAA2C;QAC7C,CAAC,CAAC,iBAAiB,CAAC;IAEtB,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|