claude-code-infinite 1.0.11 → 1.0.14

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.
Files changed (136) hide show
  1. package/README.md +214 -47
  2. package/dist/cc-request.d.ts +94 -0
  3. package/dist/cc-request.d.ts.map +1 -0
  4. package/dist/cc-request.js +194 -0
  5. package/dist/cc-request.js.map +1 -0
  6. package/dist/claude-env.d.ts +30 -0
  7. package/dist/claude-env.d.ts.map +1 -0
  8. package/dist/claude-env.js +55 -0
  9. package/dist/claude-env.js.map +1 -0
  10. package/dist/cli-args.d.ts +32 -0
  11. package/dist/cli-args.d.ts.map +1 -0
  12. package/dist/cli-args.js +72 -0
  13. package/dist/cli-args.js.map +1 -0
  14. package/dist/cli-lifecycle.d.ts +17 -0
  15. package/dist/cli-lifecycle.d.ts.map +1 -0
  16. package/dist/cli-lifecycle.js +30 -0
  17. package/dist/cli-lifecycle.js.map +1 -0
  18. package/dist/cli-main.d.ts +15 -0
  19. package/dist/cli-main.d.ts.map +1 -0
  20. package/dist/cli-main.js +464 -0
  21. package/dist/cli-main.js.map +1 -0
  22. package/dist/cli.js +13 -178
  23. package/dist/cli.js.map +1 -1
  24. package/dist/config.d.ts +3 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +29 -3
  27. package/dist/config.js.map +1 -1
  28. package/dist/count-tokens.d.ts +78 -0
  29. package/dist/count-tokens.d.ts.map +1 -0
  30. package/dist/count-tokens.js +277 -0
  31. package/dist/count-tokens.js.map +1 -0
  32. package/dist/final-index.d.ts +10 -0
  33. package/dist/final-index.d.ts.map +1 -0
  34. package/dist/final-index.js +37 -0
  35. package/dist/final-index.js.map +1 -0
  36. package/dist/hooks.d.ts +239 -0
  37. package/dist/hooks.d.ts.map +1 -0
  38. package/dist/hooks.js +618 -0
  39. package/dist/hooks.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +8 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/memtree-fetch.d.ts +24 -0
  45. package/dist/memtree-fetch.d.ts.map +1 -0
  46. package/dist/memtree-fetch.js +121 -0
  47. package/dist/memtree-fetch.js.map +1 -0
  48. package/dist/memtree-finder.d.ts +99 -0
  49. package/dist/memtree-finder.d.ts.map +1 -0
  50. package/dist/memtree-finder.js +235 -0
  51. package/dist/memtree-finder.js.map +1 -0
  52. package/dist/memtree-links.d.ts +16 -0
  53. package/dist/memtree-links.d.ts.map +1 -0
  54. package/dist/memtree-links.js +66 -0
  55. package/dist/memtree-links.js.map +1 -0
  56. package/dist/memtree-mcp-config.d.ts +28 -0
  57. package/dist/memtree-mcp-config.d.ts.map +1 -0
  58. package/dist/memtree-mcp-config.js +121 -0
  59. package/dist/memtree-mcp-config.js.map +1 -0
  60. package/dist/memtree-mcp.d.ts +265 -0
  61. package/dist/memtree-mcp.d.ts.map +1 -0
  62. package/dist/memtree-mcp.js +667 -0
  63. package/dist/memtree-mcp.js.map +1 -0
  64. package/dist/memtree-newest.d.ts +74 -0
  65. package/dist/memtree-newest.d.ts.map +1 -0
  66. package/dist/memtree-newest.js +217 -0
  67. package/dist/memtree-newest.js.map +1 -0
  68. package/dist/memtree-tools.d.ts +105 -0
  69. package/dist/memtree-tools.d.ts.map +1 -0
  70. package/dist/memtree-tools.js +408 -0
  71. package/dist/memtree-tools.js.map +1 -0
  72. package/dist/memtree.d.ts +398 -0
  73. package/dist/memtree.d.ts.map +1 -0
  74. package/dist/memtree.js +1231 -0
  75. package/dist/memtree.js.map +1 -0
  76. package/dist/notices.d.ts +177 -0
  77. package/dist/notices.d.ts.map +1 -0
  78. package/dist/notices.js +469 -0
  79. package/dist/notices.js.map +1 -0
  80. package/dist/payment-gate.d.ts +53 -0
  81. package/dist/payment-gate.d.ts.map +1 -0
  82. package/dist/payment-gate.js +97 -0
  83. package/dist/payment-gate.js.map +1 -0
  84. package/dist/project-meta.d.ts +15 -0
  85. package/dist/project-meta.d.ts.map +1 -0
  86. package/dist/project-meta.js +80 -0
  87. package/dist/project-meta.js.map +1 -0
  88. package/dist/prompt-accounting.d.ts +12 -0
  89. package/dist/prompt-accounting.d.ts.map +1 -0
  90. package/dist/prompt-accounting.js +70 -0
  91. package/dist/prompt-accounting.js.map +1 -0
  92. package/dist/proxy.d.ts +197 -0
  93. package/dist/proxy.d.ts.map +1 -0
  94. package/dist/proxy.js +4247 -0
  95. package/dist/proxy.js.map +1 -0
  96. package/dist/reqlog.d.ts +419 -0
  97. package/dist/reqlog.d.ts.map +1 -0
  98. package/dist/reqlog.js +146 -0
  99. package/dist/reqlog.js.map +1 -0
  100. package/dist/request-sizing.d.ts +52 -0
  101. package/dist/request-sizing.d.ts.map +1 -0
  102. package/dist/request-sizing.js +92 -0
  103. package/dist/request-sizing.js.map +1 -0
  104. package/dist/resume-repair-file.d.ts +17 -0
  105. package/dist/resume-repair-file.d.ts.map +1 -0
  106. package/dist/resume-repair-file.js +100 -0
  107. package/dist/resume-repair-file.js.map +1 -0
  108. package/dist/resume-repair.d.ts +27 -0
  109. package/dist/resume-repair.d.ts.map +1 -0
  110. package/dist/resume-repair.js +198 -0
  111. package/dist/resume-repair.js.map +1 -0
  112. package/dist/route-cache.d.ts +5 -0
  113. package/dist/route-cache.d.ts.map +1 -0
  114. package/dist/route-cache.js +63 -0
  115. package/dist/route-cache.js.map +1 -0
  116. package/dist/route-fallback.d.ts +29 -0
  117. package/dist/route-fallback.d.ts.map +1 -0
  118. package/dist/route-fallback.js +49 -0
  119. package/dist/route-fallback.js.map +1 -0
  120. package/dist/route-identity.d.ts +6 -0
  121. package/dist/route-identity.d.ts.map +1 -0
  122. package/dist/route-identity.js +100 -0
  123. package/dist/route-identity.js.map +1 -0
  124. package/dist/transcript-usage.d.ts +57 -0
  125. package/dist/transcript-usage.d.ts.map +1 -0
  126. package/dist/transcript-usage.js +570 -0
  127. package/dist/transcript-usage.js.map +1 -0
  128. package/dist/turns.d.ts +73 -0
  129. package/dist/turns.d.ts.map +1 -0
  130. package/dist/turns.js +298 -0
  131. package/dist/turns.js.map +1 -0
  132. package/dist/update-check.d.ts +38 -0
  133. package/dist/update-check.d.ts.map +1 -0
  134. package/dist/update-check.js +67 -0
  135. package/dist/update-check.js.map +1 -0
  136. package/package.json +6 -2
package/dist/cli.js CHANGED
@@ -1,180 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import spawn from "cross-spawn";
3
- import { exec } from "node:child_process";
4
- import * as readline from "node:readline";
5
- import { getOAuthToken, isTokenExpired } from "./keychain.js";
6
- import { getPolychatApiKey, setPolychatApiKey, getLocalPolychatApiKey, setLocalPolychatApiKey, } from "./config.js";
7
- const POLYCHAT_BASE_URL = "https://polychat.co/cc";
8
- const LOCAL_BASE_URL = "http://localhost:8080/cc";
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
- }
15
- async function promptForApiKey(isLocal) {
16
- const rl = readline.createInterface({
17
- input: process.stdin,
18
- output: process.stdout,
19
- });
20
- const url = isLocal
21
- ? "http://local.polychat.co:5173/memtree-api"
22
- : POLYCHAT_AUTH_URL;
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);
31
- return new Promise((resolve) => {
32
- rl.question("Copy your API key and paste it here: ", (answer) => {
33
- rl.close();
34
- resolve(answer.trim());
35
- });
36
- });
37
- }
38
- async function refreshOAuthToken(debug) {
39
- console.log("\x1b[1;33m🔄 OAuth token expired. Refreshing...\x1b[0m\n");
40
- // Get current expiry to detect when it changes
41
- const currentCredentials = getOAuthToken(false);
42
- const currentExpiry = currentCredentials?.claudeAiOauth?.expiresAt ?? 0;
43
- // Spawn claude in background - this triggers the OAuth refresh flow
44
- if (debug) {
45
- console.log("[DEBUG] Spawning 'claude' to trigger token refresh...");
46
- }
47
- const child = spawn("claude", [], {
48
- stdio: "ignore",
49
- detached: false,
50
- });
51
- // Poll keychain until token is refreshed or timeout
52
- const maxWaitMs = 10000;
53
- const pollIntervalMs = 100;
54
- let elapsed = 0;
55
- let refreshedToken = null;
56
- while (elapsed < maxWaitMs) {
57
- await new Promise((r) => setTimeout(r, pollIntervalMs));
58
- elapsed += pollIntervalMs;
59
- const creds = getOAuthToken(false);
60
- if (creds?.claudeAiOauth && creds.claudeAiOauth.expiresAt !== currentExpiry) {
61
- refreshedToken = creds.claudeAiOauth;
62
- if (debug) {
63
- console.log(`[DEBUG] Token refreshed after ${elapsed}ms`);
64
- }
65
- break;
66
- }
67
- }
68
- // Kill the claude process
69
- if (debug) {
70
- console.log("[DEBUG] Killing claude process...");
71
- }
72
- child.kill("SIGTERM");
73
- // Wait for process to exit
74
- await new Promise((resolve) => {
75
- child.on("exit", () => resolve());
76
- if (child.exitCode !== null)
77
- resolve();
78
- });
79
- if (debug) {
80
- console.log("[DEBUG] Claude process terminated");
81
- }
82
- if (!refreshedToken) {
83
- console.error("OAuth token refresh timed out.");
84
- console.error("Please run 'claude' directly to re-authenticate.");
85
- return null;
86
- }
87
- if (isTokenExpired(refreshedToken, debug)) {
88
- console.error("OAuth token is still expired after refresh attempt.");
89
- console.error("Please run 'claude' directly to re-authenticate.");
90
- return null;
91
- }
92
- console.log("\x1b[1;32m✓ OAuth token refreshed successfully!\x1b[0m\n");
93
- return refreshedToken;
94
- }
95
- function printBanner() {
96
- console.log(`\n\x1b[1;38;5;209mClaude Code Infinite:\x1b[0m \x1b[38;5;48mMaximizing Claude's intelligence with context-management from \x1b]8;;https://MemTree.dev\x1b\\MemTree.dev\x1b]8;;\x1b\\\x1b[0m\n`);
97
- }
98
- async function main() {
99
- // Check for local mode and debug flag
100
- const args = process.argv.slice(2);
101
- const isDebugMode = args.includes("--debug");
102
- const forceTokenRefresh = process.env.DEBUG_FORCE_EXPIRED === "1";
103
- const filteredArgs = args.filter((arg) => arg !== "--debug");
104
- const isLocalMode = filteredArgs[0] === "local";
105
- const claudeArgs = isLocalMode ? filteredArgs.slice(1) : filteredArgs;
106
- printBanner();
107
- if (isDebugMode) {
108
- console.log("\x1b[1;36m🔍 DEBUG MODE\x1b[0m\n");
109
- }
110
- if (isLocalMode) {
111
- console.log("\x1b[1;33m🏠 LOCAL MODE\x1b[0m\n");
112
- }
113
- // Get OAuth token from keychain (optional - we can work without it)
114
- const credentials = getOAuthToken(isDebugMode);
115
- let oauthToken = credentials?.claudeAiOauth ?? null;
116
- if (!oauthToken) {
117
- console.log("\x1b[1;33m⚠️ No Claude Code OAuth credentials found.\x1b[0m");
118
- console.log("\x1b[33m Claude Code is much cheaper with an Anthropic subscription.\x1b[0m");
119
- console.log("\x1b[33m MemTree.dev makes it even cheaper by reducing messages sent to Anthropic.\x1b[0m");
120
- console.log("\x1b[33m Run '/login' to log in and get discounted rates.\x1b[0m\n");
121
- }
122
- else if (forceTokenRefresh || isTokenExpired(oauthToken, isDebugMode)) {
123
- // If token is expired, attempt to refresh it by launching Claude
124
- const refreshedToken = await refreshOAuthToken(isDebugMode);
125
- if (!refreshedToken) {
126
- console.log("\x1b[1;33m⚠️ Could not refresh OAuth token. Continuing without it.\x1b[0m");
127
- console.log("\x1b[33m Claude Code is much cheaper with an Anthropic subscription.\x1b[0m");
128
- console.log("\x1b[33m MemTree.dev makes it even cheaper by reducing messages sent to Anthropic.\x1b[0m\n");
129
- oauthToken = null;
130
- }
131
- else {
132
- oauthToken = refreshedToken;
133
- }
134
- }
135
- // Get or prompt for Polychat API key (separate keys for local vs production)
136
- let polychatApiKey = isLocalMode ? getLocalPolychatApiKey() : getPolychatApiKey();
137
- if (!polychatApiKey) {
138
- polychatApiKey = await promptForApiKey(isLocalMode);
139
- if (!polychatApiKey) {
140
- console.error("POLYCHAT_API_KEY is required.");
141
- process.exit(1);
142
- }
143
- if (isLocalMode) {
144
- setLocalPolychatApiKey(polychatApiKey);
145
- }
146
- else {
147
- setPolychatApiKey(polychatApiKey);
148
- }
149
- console.log("API key saved.\n");
150
- }
151
- // Build auth token (with or without OAuth)
152
- const combinedAuthToken = oauthToken
153
- ? `${oauthToken.accessToken},${polychatApiKey}`
154
- : polychatApiKey;
155
- // Choose base URL based on mode
156
- const baseUrl = isLocalMode ? LOCAL_BASE_URL : POLYCHAT_BASE_URL;
157
- // Spawn claude with the environment variables
158
- const child = spawn("claude", claudeArgs, {
159
- env: {
160
- ...process.env,
161
- ANTHROPIC_BASE_URL: baseUrl,
162
- ANTHROPIC_AUTH_TOKEN: combinedAuthToken,
163
- },
164
- stdio: "inherit",
165
- });
166
- child.on("error", (err) => {
167
- if (err.code === "ENOENT") {
168
- console.error("Could not find 'claude' command. Make sure Claude Code is installed.");
169
- }
170
- else {
171
- console.error("Failed to start claude:", err.message);
172
- }
173
- process.exit(1);
174
- });
175
- child.on("exit", (code) => {
176
- process.exit(code ?? 0);
177
- });
178
- }
179
- main().catch(console.error);
2
+ // Keep this entrypoint free of static imports so unsupported Node versions
3
+ // receive the upgrade message before parsing any implementation dependencies.
4
+ const version = process.versions.node;
5
+ const [major, minor] = version.split(".").map(Number);
6
+ if (!(major > 20 || (major === 20 && minor >= 3))) {
7
+ console.error(`ccc requires Node.js 20.3 or newer; you are running ${version}. Upgrade Node.js and try again.`);
8
+ process.exit(1);
9
+ }
10
+ import("./cli-main.js").catch((err) => {
11
+ console.error(err);
12
+ process.exit(1);
13
+ });
14
+ export {};
180
15
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,2EAA2E;AAC3E,8EAA8E;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtD,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,OAAO,CAAC,KAAK,CACX,uDAAuD,OAAO,kCAAkC,CACjG,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export interface Config {
2
2
  polychatApiKey?: string;
3
+ stagingPolychatApiKey?: string;
3
4
  localPolychatApiKey?: string;
4
5
  }
5
6
  export declare function getConfigDir(): string;
@@ -7,6 +8,8 @@ export declare function loadConfig(): Config;
7
8
  export declare function saveConfig(config: Config): void;
8
9
  export declare function getPolychatApiKey(): string | undefined;
9
10
  export declare function setPolychatApiKey(key: string): void;
11
+ export declare function getStagingPolychatApiKey(): string | undefined;
12
+ export declare function setStagingPolychatApiKey(key: string): void;
10
13
  export declare function getLocalPolychatApiKey(): string | undefined;
11
14
  export declare function setLocalPolychatApiKey(key: string): void;
12
15
  //# sourceMappingURL=config.d.ts.map
@@ -1 +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"}
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,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AASD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAYnC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQ/C;AAaD,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAInD;AAED,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAE7D;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAE3D;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIxD"}
package/dist/config.js CHANGED
@@ -1,8 +1,12 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
1
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { homedir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  const CONFIG_DIR = join(homedir(), ".claude-code-infinite");
5
5
  const CONFIG_FILE = join(CONFIG_DIR, "config.json");
6
+ // The config holds MemTree API keys: owner-only, so other users on a shared
7
+ // machine cannot read them. Ignored on Windows, where ACLs govern access.
8
+ const CONFIG_DIR_MODE = 0o700;
9
+ const CONFIG_FILE_MODE = 0o600;
6
10
  export function getConfigDir() {
7
11
  return CONFIG_DIR;
8
12
  }
@@ -10,6 +14,7 @@ export function loadConfig() {
10
14
  if (!existsSync(CONFIG_FILE)) {
11
15
  return {};
12
16
  }
17
+ restrictConfigPermissions();
13
18
  try {
14
19
  const content = readFileSync(CONFIG_FILE, "utf-8");
15
20
  return JSON.parse(content);
@@ -20,9 +25,22 @@ export function loadConfig() {
20
25
  }
21
26
  export function saveConfig(config) {
22
27
  if (!existsSync(CONFIG_DIR)) {
23
- mkdirSync(CONFIG_DIR, { recursive: true });
28
+ mkdirSync(CONFIG_DIR, { recursive: true, mode: CONFIG_DIR_MODE });
29
+ }
30
+ restrictConfigPermissions(); // before writing, so a loose old file never gets new keys
31
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: CONFIG_FILE_MODE });
32
+ restrictConfigPermissions();
33
+ }
34
+ /** Tighten a config written before keys were owner-only (the mode above applies on create). */
35
+ function restrictConfigPermissions() {
36
+ for (const [path, mode] of [[CONFIG_DIR, CONFIG_DIR_MODE], [CONFIG_FILE, CONFIG_FILE_MODE]]) {
37
+ try {
38
+ chmodSync(path, mode);
39
+ }
40
+ catch {
41
+ // Best effort: a missing file or a filesystem without modes is not fatal.
42
+ }
24
43
  }
25
- writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2));
26
44
  }
27
45
  export function getPolychatApiKey() {
28
46
  return loadConfig().polychatApiKey;
@@ -32,6 +50,14 @@ export function setPolychatApiKey(key) {
32
50
  config.polychatApiKey = key;
33
51
  saveConfig(config);
34
52
  }
53
+ export function getStagingPolychatApiKey() {
54
+ return loadConfig().stagingPolychatApiKey;
55
+ }
56
+ export function setStagingPolychatApiKey(key) {
57
+ const config = loadConfig();
58
+ config.stagingPolychatApiKey = key;
59
+ saveConfig(config);
60
+ }
35
61
  export function getLocalPolychatApiKey() {
36
62
  return loadConfig().localPolychatApiKey;
37
63
  }
@@ -1 +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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,4EAA4E;AAC5E,0EAA0E;AAC1E,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,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,yBAAyB,EAAE,CAAC;IAC5B,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,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,yBAAyB,EAAE,CAAC,CAAC,0DAA0D;IACvF,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACxF,yBAAyB,EAAE,CAAC;AAC9B,CAAC;AAED,+FAA+F;AAC/F,SAAS,yBAAyB;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAU,EAAE,CAAC;QACrG,IAAI,CAAC;YACH,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,0EAA0E;QAC5E,CAAC;IACH,CAAC;AACH,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,wBAAwB;IACtC,OAAO,UAAU,EAAE,CAAC,qBAAqB,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,qBAAqB,GAAG,GAAG,CAAC;IACnC,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,78 @@
1
+ import type http from "node:http";
2
+ import https from "node:https";
3
+ /** Bound on a count call: past it the caller keeps its estimate. */
4
+ export declare const COUNT_TOKENS_TIMEOUT_MS = 3000;
5
+ /**
6
+ * Plausible tokens per byte for a sample. Text runs ~0.25-0.5. Above 1 the
7
+ * sample measured something other than the body (server tool results), as on
8
+ * 2026-10-05 (12 tokens/byte). The floor is loose on purpose: base64 images
9
+ * are very cheap per byte (a ~1.5MB screenshot is ~1.6k tokens), so a
10
+ * screenshot-heavy session can sit well under 0.1 and must stay calibrated
11
+ * rather than be counted on every request.
12
+ */
13
+ export declare const MIN_PLAUSIBLE_TOKENS_PER_BYTE = 0.02;
14
+ export declare const MAX_PLAUSIBLE_TOKENS_PER_BYTE = 1;
15
+ /** A request size Anthropic reported, and the bytes of the body it was for. */
16
+ export interface SizeSample {
17
+ /** input_tokens + cache_read_input_tokens + cache_creation_input_tokens. */
18
+ tokens: number;
19
+ forwardedBytes: number;
20
+ }
21
+ /** Where a count call goes: the proxy's upstream. */
22
+ export interface CountTokensUpstream {
23
+ module: typeof http | typeof https;
24
+ host: string;
25
+ port: number;
26
+ }
27
+ export type CountTokensOutcome = "success" | "timeout" | "network-error" | "invalid-response" | "http-error" | "server-error" | "auth" | "rate-limit" | "cooldown" | "aborted" | "deadline" | "invalid-request";
28
+ export interface CountTokensResult {
29
+ outcome: CountTokensOutcome;
30
+ /** Internal cooldown metadata; never log it. */
31
+ retryAfter?: string;
32
+ /** Exact input tokens; absent when the call failed or timed out. */
33
+ tokens?: number;
34
+ ms: number;
35
+ status?: number;
36
+ }
37
+ /** Whether a sample's tokens-per-byte ratio can describe a request body. */
38
+ export declare function plausibleSample(sample: SizeSample | undefined): sample is SizeSample;
39
+ /**
40
+ * Whether to count a request of `bytes` before deciding on it: with no usable
41
+ * sample once its estimate is a real share of the budget, and with one only
42
+ * after a jump of new content brings it near the budget. Small growth on a
43
+ * calibrated sample is estimated well and is not counted.
44
+ */
45
+ export declare function shouldCountTokens(sample: SizeSample | undefined, bytes: number, estimateTokens: number, budgetTokens: number): boolean;
46
+ /** Shared per proxy; only hashes of account/upstream identity are stored. */
47
+ export declare class CountTokensCooldowns {
48
+ private readonly capacity;
49
+ private readonly now;
50
+ private readonly entries;
51
+ constructor(capacity?: number, now?: () => number);
52
+ active(key: string): boolean;
53
+ record(key: string, result: CountTokensResult): void;
54
+ }
55
+ export interface CountTokensSessionOptions {
56
+ upstream: CountTokensUpstream;
57
+ headers: Record<string, string>;
58
+ requestUrl: string | undefined;
59
+ signal?: AbortSignal;
60
+ timeoutMs?: number;
61
+ /** Called once per attempt; log only outcome and ms, never tokens or headers. */
62
+ onAttempt?: (result: CountTokensResult) => void;
63
+ }
64
+ export interface CountTokensSession {
65
+ count(body: Buffer): Promise<CountTokensResult>;
66
+ peek(body: Buffer): CountTokensResult | undefined;
67
+ }
68
+ /** Exact results belong to this request and body, never a shared sample slot. */
69
+ export declare function createCountTokensSession(options: CountTokensSessionOptions, cooldowns?: CountTokensCooldowns): CountTokensSession;
70
+ /** All failures resolve without tokens, including synchronous request errors. */
71
+ export declare function countUpstreamTokens(args: CountTokensSessionOptions & {
72
+ body: Buffer;
73
+ }): Promise<CountTokensResult>;
74
+ /** The countable subset of a Messages request body, or null if it is not one. */
75
+ export declare function countTokensBody(body: Buffer): Buffer | null;
76
+ /** The Messages request's path with `/count_tokens` appended, query kept. */
77
+ export declare function countTokensPath(requestUrl: string | undefined): string;
78
+ //# sourceMappingURL=count-tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count-tokens.d.ts","sourceRoot":"","sources":["../src/count-tokens.ts"],"names":[],"mappings":"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"}