opencode-claude-auth 1.1.1 → 1.3.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 +19 -2
- package/dist/betas.d.ts +1 -0
- package/dist/betas.d.ts.map +1 -1
- package/dist/betas.js +24 -13
- package/dist/betas.js.map +1 -1
- package/dist/credentials.d.ts +10 -3
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +79 -25
- package/dist/credentials.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -17
- package/dist/index.js.map +1 -1
- package/dist/keychain.d.ts +10 -0
- package/dist/keychain.d.ts.map +1 -1
- package/dist/keychain.js +128 -43
- package/dist/keychain.js.map +1 -1
- package/dist/model-config.d.ts +21 -0
- package/dist/model-config.d.ts.map +1 -0
- package/dist/model-config.js +36 -0
- package/dist/model-config.js.map +1 -0
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# opencode-claude-auth
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/opencode-claude-auth)
|
|
4
|
+
[](https://github.com/griffinmartin/opencode-claude-auth#install-with-homebrew-macos)
|
|
4
5
|
[](https://github.com/griffinmartin/opencode-claude-auth/actions/workflows/ci.yml)
|
|
5
6
|
[](https://socket.dev/npm/package/opencode-claude-auth)
|
|
6
7
|
|
|
@@ -8,7 +9,7 @@ Self-contained Anthropic auth provider for OpenCode using your Claude Code crede
|
|
|
8
9
|
|
|
9
10
|
## How it works
|
|
10
11
|
|
|
11
|
-
The plugin registers its own auth provider with a custom fetch handler that intercepts all Anthropic API requests. It reads OAuth tokens from the macOS Keychain (or `~/.claude/.credentials.json` on other platforms), caches them in memory with a 30-second TTL, and handles the full request lifecycle — no builtin Anthropic auth plugin required.
|
|
12
|
+
The plugin registers its own auth provider with a custom fetch handler that intercepts all Anthropic API requests. It reads OAuth tokens from the macOS Keychain (or `~/.claude/.credentials.json` on other platforms), caches them in memory with a 30-second TTL, and handles the full request lifecycle — no builtin Anthropic auth plugin required. On macOS, multiple Claude Code accounts are detected automatically and can be switched via `opencode auth login`.
|
|
12
13
|
|
|
13
14
|
It also syncs credentials to OpenCode's `auth.json` as a fallback (on Windows, it writes to both `%USERPROFILE%\.local\share\opencode\auth.json` and `%LOCALAPPDATA%\opencode\auth.json` to cover all installation methods). If a token is near expiry, it runs the Claude CLI to trigger a refresh. Background re-sync runs every 5 minutes.
|
|
14
15
|
|
|
@@ -88,9 +89,23 @@ Just run OpenCode. The plugin handles auth automatically — it reads your Claud
|
|
|
88
89
|
|
|
89
90
|
The plugin checks these in order:
|
|
90
91
|
|
|
91
|
-
1. macOS Keychain (
|
|
92
|
+
1. macOS Keychain (all `Claude Code-credentials*` entries — multiple accounts are detected automatically)
|
|
92
93
|
2. `~/.claude/.credentials.json` (fallback, works on all platforms)
|
|
93
94
|
|
|
95
|
+
## Multiple accounts (macOS)
|
|
96
|
+
|
|
97
|
+
If you have [multiple Claude Code accounts](https://gist.github.com/KMJ-007/0979814968722051620461ab2aa01bf2) authenticated on macOS, the plugin detects all of them from the Keychain automatically. Each account is labeled by its subscription tier (Claude Pro, Claude Max, etc.).
|
|
98
|
+
|
|
99
|
+
To switch accounts:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
opencode auth login
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Select "Switch Claude Code account" and pick the account you want to use. Your selection is persisted across sessions.
|
|
106
|
+
|
|
107
|
+
If only one account is found, the switcher is hidden and the plugin uses it directly.
|
|
108
|
+
|
|
94
109
|
## Troubleshooting
|
|
95
110
|
|
|
96
111
|
| Problem | Solution |
|
|
@@ -144,6 +159,8 @@ export ANTHROPIC_ENABLE_1M_CONTEXT=true # requires Claude Max
|
|
|
144
159
|
- Buffers SSE response streams at event boundaries for reliable tool name translation
|
|
145
160
|
- Injects Claude Code identity into system prompts via `experimental.chat.system.transform`
|
|
146
161
|
- Sets required API headers (beta flags, billing, user-agent) with model-aware selection
|
|
162
|
+
- On macOS, enumerates all `Claude Code-credentials*` Keychain entries and labels them by subscription tier
|
|
163
|
+
- Provides an account switcher via `opencode auth login` when multiple accounts are found; persists selection to `~/.local/share/opencode/claude-account-source.txt`
|
|
147
164
|
- Syncs credentials to `auth.json` on startup and every 5 minutes as a fallback
|
|
148
165
|
- On Windows, writes to both `%USERPROFILE%\.local\share\opencode\auth.json` and `%LOCALAPPDATA%\opencode\auth.json`
|
|
149
166
|
- Retries API requests on 429 (rate limit) and 529 (overloaded) with exponential backoff, respecting `retry-after` headers
|
package/dist/betas.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare const LONG_CONTEXT_BETAS: string[];
|
|
2
2
|
export declare function getExcludedBetas(modelId: string): Set<string>;
|
|
3
3
|
export declare function addExcludedBeta(modelId: string, beta: string): void;
|
|
4
|
+
export declare function resetExcludedBetas(): void;
|
|
4
5
|
export declare function isLongContextError(responseBody: string): boolean;
|
|
5
6
|
export declare function getNextBetaToExclude(modelId: string): string | null;
|
|
6
7
|
export declare function supports1mContext(modelId: string): boolean;
|
package/dist/betas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betas.d.ts","sourceRoot":"","sources":["../src/betas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"betas.d.ts","sourceRoot":"","sources":["../src/betas.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,UAA0B,CAAA;AAgBzD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAe7D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAInE;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQnE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAU1D;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACrB,MAAM,EAAE,CAwCV"}
|
package/dist/betas.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { config, getModelOverride } from "./model-config.js";
|
|
2
2
|
// Beta flags to try removing in order when "long context" errors occur
|
|
3
|
-
export const LONG_CONTEXT_BETAS =
|
|
4
|
-
"context-1m-2025-08-07",
|
|
5
|
-
"interleaved-thinking-2025-05-14",
|
|
6
|
-
];
|
|
3
|
+
export const LONG_CONTEXT_BETAS = config.longContextBetas;
|
|
7
4
|
function getRequiredBetas() {
|
|
8
|
-
return (process.env.ANTHROPIC_BETA_FLAGS ??
|
|
5
|
+
return (process.env.ANTHROPIC_BETA_FLAGS ?? config.baseBetas.join(","))
|
|
9
6
|
.split(",")
|
|
10
7
|
.map((s) => s.trim())
|
|
11
8
|
.filter(Boolean);
|
|
@@ -34,6 +31,10 @@ export function addExcludedBeta(modelId, beta) {
|
|
|
34
31
|
existing.add(beta);
|
|
35
32
|
excludedBetas.set(modelId, existing);
|
|
36
33
|
}
|
|
34
|
+
export function resetExcludedBetas() {
|
|
35
|
+
excludedBetas.clear();
|
|
36
|
+
lastModelId = undefined;
|
|
37
|
+
}
|
|
37
38
|
export function isLongContextError(responseBody) {
|
|
38
39
|
return (responseBody.includes("Extra usage is required for long context requests") || responseBody.includes("long context beta is not yet available"));
|
|
39
40
|
}
|
|
@@ -61,7 +62,6 @@ export function supports1mContext(modelId) {
|
|
|
61
62
|
}
|
|
62
63
|
export function getModelBetas(modelId, excluded) {
|
|
63
64
|
const betas = [...getRequiredBetas()];
|
|
64
|
-
const lower = modelId.toLowerCase();
|
|
65
65
|
// context-1m is OPT-IN only, matching the official Claude CLI behavior.
|
|
66
66
|
// The CLI only sends this beta when the model ID has a [1m] suffix.
|
|
67
67
|
// Without it, the API enforces a 200k context limit. Sending the beta
|
|
@@ -72,13 +72,24 @@ export function getModelBetas(modelId, excluded) {
|
|
|
72
72
|
// (requires a Claude Max subscription or a plan that covers extra usage).
|
|
73
73
|
if (process.env.ANTHROPIC_ENABLE_1M_CONTEXT === "true" &&
|
|
74
74
|
supports1mContext(modelId)) {
|
|
75
|
-
betas.push(
|
|
75
|
+
betas.push(config.longContextBetas[0]);
|
|
76
76
|
}
|
|
77
|
-
// haiku
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (
|
|
81
|
-
|
|
77
|
+
// Apply per-model overrides (e.g. haiku excludes claude-code-20250219)
|
|
78
|
+
const override = getModelOverride(modelId);
|
|
79
|
+
if (override) {
|
|
80
|
+
if (override.exclude) {
|
|
81
|
+
for (const ex of override.exclude) {
|
|
82
|
+
const idx = betas.indexOf(ex);
|
|
83
|
+
if (idx !== -1)
|
|
84
|
+
betas.splice(idx, 1);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (override.add) {
|
|
88
|
+
for (const add of override.add) {
|
|
89
|
+
if (!betas.includes(add))
|
|
90
|
+
betas.push(add);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
82
93
|
}
|
|
83
94
|
// Filter out excluded betas (from previous failed requests due to long context errors)
|
|
84
95
|
if (excluded && excluded.size > 0) {
|
package/dist/betas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"betas.js","sourceRoot":"","sources":["../src/betas.ts"],"names":[],"mappings":"AAAA,MAAM,
|
|
1
|
+
{"version":3,"file":"betas.js","sourceRoot":"","sources":["../src/betas.ts"],"names":[],"mappings":"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"}
|
package/dist/credentials.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { type ClaudeCredentials } from "./keychain.js";
|
|
1
|
+
import { type ClaudeCredentials, type ClaudeAccount } from "./keychain.js";
|
|
2
|
+
export type { ClaudeCredentials } from "./keychain.js";
|
|
3
|
+
export type { ClaudeAccount } from "./keychain.js";
|
|
4
|
+
export declare function initAccounts(accounts: ClaudeAccount[]): void;
|
|
5
|
+
export declare function getAccounts(): ClaudeAccount[];
|
|
6
|
+
export declare function setActiveAccountSource(source: string): void;
|
|
7
|
+
export declare function refreshAccountsList(): ClaudeAccount[];
|
|
8
|
+
export declare function loadPersistedAccountSource(): string | null;
|
|
9
|
+
export declare function saveAccountSource(source: string): void;
|
|
2
10
|
export declare function syncAuthJson(creds: ClaudeCredentials): void;
|
|
3
|
-
export declare function refreshIfNeeded(): ClaudeCredentials | null;
|
|
11
|
+
export declare function refreshIfNeeded(account?: ClaudeAccount): ClaudeCredentials | null;
|
|
4
12
|
export declare function getCachedCredentials(): ClaudeCredentials | null;
|
|
5
|
-
export type { ClaudeCredentials } from "./keychain.js";
|
|
6
13
|
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAUA,OAAO,
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAUA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAA;AAGtB,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAWlD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,IAAI,CAE5D;AAED,wBAAgB,WAAW,IAAI,aAAa,EAAE,CAE7C;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAI3D;AAED,wBAAgB,mBAAmB,IAAI,aAAa,EAAE,CAGrD;AAqBD,wBAAgB,0BAA0B,IAAI,MAAM,GAAG,IAAI,CAU1D;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAStD;AA4CD,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAI3D;AAmBD,wBAAgB,eAAe,CAC7B,OAAO,CAAC,EAAE,aAAa,GACtB,iBAAiB,GAAG,IAAI,CAW1B;AAED,wBAAgB,oBAAoB,IAAI,iBAAiB,GAAG,IAAI,CAsB/D"}
|
package/dist/credentials.js
CHANGED
|
@@ -2,10 +2,64 @@ import { execSync } from "node:child_process";
|
|
|
2
2
|
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
|
-
import {
|
|
5
|
+
import { readAllClaudeAccounts, refreshAccount, } from "./keychain.js";
|
|
6
|
+
import { resetExcludedBetas } from "./betas.js";
|
|
6
7
|
const CREDENTIAL_CACHE_TTL_MS = 30_000;
|
|
7
|
-
|
|
8
|
-
let
|
|
8
|
+
const accountCacheMap = new Map();
|
|
9
|
+
let activeAccountSource = null;
|
|
10
|
+
let allAccounts = [];
|
|
11
|
+
export function initAccounts(accounts) {
|
|
12
|
+
allAccounts = accounts;
|
|
13
|
+
}
|
|
14
|
+
export function getAccounts() {
|
|
15
|
+
return allAccounts;
|
|
16
|
+
}
|
|
17
|
+
export function setActiveAccountSource(source) {
|
|
18
|
+
activeAccountSource = source;
|
|
19
|
+
accountCacheMap.delete(source);
|
|
20
|
+
resetExcludedBetas();
|
|
21
|
+
}
|
|
22
|
+
export function refreshAccountsList() {
|
|
23
|
+
allAccounts = readAllClaudeAccounts();
|
|
24
|
+
return allAccounts;
|
|
25
|
+
}
|
|
26
|
+
function getActiveAccount() {
|
|
27
|
+
if (allAccounts.length === 0)
|
|
28
|
+
return null;
|
|
29
|
+
if (activeAccountSource) {
|
|
30
|
+
const found = allAccounts.find((a) => a.source === activeAccountSource);
|
|
31
|
+
if (found)
|
|
32
|
+
return found;
|
|
33
|
+
}
|
|
34
|
+
return allAccounts[0];
|
|
35
|
+
}
|
|
36
|
+
function getAccountStateFile() {
|
|
37
|
+
return join(homedir(), ".local", "share", "opencode", "claude-account-source.txt");
|
|
38
|
+
}
|
|
39
|
+
export function loadPersistedAccountSource() {
|
|
40
|
+
try {
|
|
41
|
+
const path = getAccountStateFile();
|
|
42
|
+
if (existsSync(path)) {
|
|
43
|
+
return readFileSync(path, "utf-8").trim() || null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// ignore
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
export function saveAccountSource(source) {
|
|
52
|
+
try {
|
|
53
|
+
const path = getAccountStateFile();
|
|
54
|
+
const dir = dirname(path);
|
|
55
|
+
if (!existsSync(dir))
|
|
56
|
+
mkdirSync(dir, { recursive: true });
|
|
57
|
+
writeFileSync(path, source, "utf-8");
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// Non-fatal
|
|
61
|
+
}
|
|
62
|
+
}
|
|
9
63
|
function getAuthJsonPaths() {
|
|
10
64
|
const xdgPath = join(homedir(), ".local", "share", "opencode", "auth.json");
|
|
11
65
|
if (process.platform === "win32") {
|
|
@@ -68,36 +122,36 @@ function refreshViaCli() {
|
|
|
68
122
|
}
|
|
69
123
|
}
|
|
70
124
|
}
|
|
71
|
-
export function refreshIfNeeded() {
|
|
72
|
-
|
|
73
|
-
if (
|
|
125
|
+
export function refreshIfNeeded(account) {
|
|
126
|
+
const target = account ?? getActiveAccount();
|
|
127
|
+
if (!target)
|
|
128
|
+
return null;
|
|
129
|
+
const creds = target.credentials;
|
|
130
|
+
if (creds.expiresAt > Date.now() + 60_000)
|
|
74
131
|
return creds;
|
|
75
|
-
}
|
|
76
132
|
refreshViaCli();
|
|
77
|
-
|
|
78
|
-
if (
|
|
79
|
-
return
|
|
80
|
-
}
|
|
133
|
+
const refreshed = refreshAccount(target.source);
|
|
134
|
+
if (refreshed && refreshed.expiresAt > Date.now() + 60_000)
|
|
135
|
+
return refreshed;
|
|
81
136
|
return null;
|
|
82
137
|
}
|
|
83
|
-
function isCredentialUsable(creds) {
|
|
84
|
-
return creds.expiresAt > Date.now() + 60_000;
|
|
85
|
-
}
|
|
86
138
|
export function getCachedCredentials() {
|
|
139
|
+
const account = getActiveAccount();
|
|
140
|
+
if (!account)
|
|
141
|
+
return null;
|
|
87
142
|
const now = Date.now();
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
143
|
+
const cached = accountCacheMap.get(account.source);
|
|
144
|
+
if (cached &&
|
|
145
|
+
now - cached.cachedAt < CREDENTIAL_CACHE_TTL_MS &&
|
|
146
|
+
cached.creds.expiresAt > now + 60_000) {
|
|
147
|
+
return cached.creds;
|
|
92
148
|
}
|
|
93
|
-
const
|
|
94
|
-
if (!
|
|
95
|
-
|
|
96
|
-
cachedCredentialsAt = 0;
|
|
149
|
+
const fresh = refreshIfNeeded(account);
|
|
150
|
+
if (!fresh) {
|
|
151
|
+
accountCacheMap.delete(account.source);
|
|
97
152
|
return null;
|
|
98
153
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
return latest;
|
|
154
|
+
accountCacheMap.set(account.source, { creds: fresh, cachedAt: now });
|
|
155
|
+
return fresh;
|
|
102
156
|
}
|
|
103
157
|
//# sourceMappingURL=credentials.js.map
|
package/dist/credentials.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EACL,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,GACd,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../src/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Plugin } from "@opencode-ai/plugin";
|
|
2
2
|
export { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
|
|
3
|
-
export {
|
|
3
|
+
export { resetExcludedBetas } from "./betas.js";
|
|
4
4
|
export { stripToolPrefix, transformBody, transformResponseStream, } from "./transforms.js";
|
|
5
|
+
export { getCachedCredentials, syncAuthJson, refreshAccountsList, type ClaudeCredentials, } from "./credentials.js";
|
|
5
6
|
type FetchFn = typeof fetch;
|
|
6
7
|
export declare function fetchWithRetry(input: RequestInfo | URL, init?: RequestInit, retries?: number, fetchImpl?: FetchFn): Promise<Response>;
|
|
7
8
|
export declare function buildRequestHeaders(input: RequestInfo | URL, init: RequestInit, accessToken: string, modelId?: string, excludedBetas?: Set<string>): Headers;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAuBjD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EACL,eAAe,EACf,aAAa,EACb,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAA;AAgBzB,KAAK,OAAO,GAAG,OAAO,KAAK,CAAA;AAE3B,wBAAsB,cAAc,CAClC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,EAClB,OAAO,SAAI,EACX,SAAS,GAAE,OAAe,GACzB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,SAAY,EACnB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAC1B,OAAO,CA+CT;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGxD;AAID,QAAA,MAAM,MAAM,EAAE,MAwOb,CAAA;AAED,eAAO,MAAM,gBAAgB,QAAS,CAAA;AACtC,eAAe,MAAM,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { config } from "./model-config.js";
|
|
2
|
+
import { readAllClaudeAccounts } from "./keychain.js";
|
|
1
3
|
import { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
|
|
2
|
-
import { getCachedCredentials, refreshIfNeeded, syncAuthJson, } from "./credentials.js";
|
|
3
|
-
import { readClaudeCredentials } from "./keychain.js";
|
|
4
4
|
import { transformBody, transformResponseStream } from "./transforms.js";
|
|
5
|
+
import { getCachedCredentials, syncAuthJson, initAccounts, setActiveAccountSource, loadPersistedAccountSource, saveAccountSource, refreshAccountsList, } from "./credentials.js";
|
|
5
6
|
export { addExcludedBeta, getExcludedBetas, getModelBetas, getNextBetaToExclude, isLongContextError, LONG_CONTEXT_BETAS, } from "./betas.js";
|
|
6
|
-
export {
|
|
7
|
+
export { resetExcludedBetas } from "./betas.js";
|
|
7
8
|
export { stripToolPrefix, transformBody, transformResponseStream, } from "./transforms.js";
|
|
9
|
+
export { getCachedCredentials, syncAuthJson, refreshAccountsList, } from "./credentials.js";
|
|
8
10
|
const SYSTEM_IDENTITY_PREFIX = "You are Claude Code, Anthropic's official CLI for Claude.";
|
|
9
|
-
const DEFAULT_CC_VERSION = "2.1.80";
|
|
10
11
|
function getCliVersion() {
|
|
11
|
-
return process.env.ANTHROPIC_CLI_VERSION ??
|
|
12
|
+
return process.env.ANTHROPIC_CLI_VERSION ?? config.ccVersion;
|
|
12
13
|
}
|
|
13
14
|
function getUserAgent() {
|
|
14
15
|
return (process.env.ANTHROPIC_USER_AGENT ??
|
|
@@ -79,22 +80,27 @@ export function getBillingHeader(modelId) {
|
|
|
79
80
|
}
|
|
80
81
|
const SYNC_INTERVAL = 5 * 60 * 1000; // 5 minutes
|
|
81
82
|
const plugin = async () => {
|
|
82
|
-
let
|
|
83
|
+
let accounts = [];
|
|
83
84
|
try {
|
|
84
|
-
|
|
85
|
+
accounts = readAllClaudeAccounts();
|
|
85
86
|
}
|
|
86
87
|
catch (err) {
|
|
87
88
|
console.warn("opencode-claude-auth: Failed to read Claude Code credentials:", err instanceof Error ? err.message : err);
|
|
88
89
|
return {};
|
|
89
90
|
}
|
|
90
|
-
if (
|
|
91
|
+
if (accounts.length === 0) {
|
|
91
92
|
console.warn("opencode-claude-auth: No Claude Code credentials found. " +
|
|
92
93
|
"Plugin disabled. Run `claude` to authenticate.");
|
|
93
94
|
return {};
|
|
94
95
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
initAccounts(accounts);
|
|
97
|
+
const persistedSource = loadPersistedAccountSource();
|
|
98
|
+
const defaultAccount = (persistedSource && accounts.find((a) => a.source === persistedSource)) ||
|
|
99
|
+
accounts[0];
|
|
100
|
+
setActiveAccountSource(defaultAccount.source);
|
|
101
|
+
const initialCreds = getCachedCredentials();
|
|
102
|
+
if (initialCreds) {
|
|
103
|
+
syncAuthJson(initialCreds);
|
|
98
104
|
}
|
|
99
105
|
else {
|
|
100
106
|
console.warn("opencode-claude-auth: Claude credentials are expired and could not be refreshed via Claude CLI.");
|
|
@@ -102,10 +108,9 @@ const plugin = async () => {
|
|
|
102
108
|
// Keep auth.json synced, refreshing via CLI if token is near expiry
|
|
103
109
|
const syncTimer = setInterval(() => {
|
|
104
110
|
try {
|
|
105
|
-
const fresh =
|
|
106
|
-
if (fresh)
|
|
111
|
+
const fresh = getCachedCredentials();
|
|
112
|
+
if (fresh)
|
|
107
113
|
syncAuthJson(fresh);
|
|
108
|
-
}
|
|
109
114
|
}
|
|
110
115
|
catch {
|
|
111
116
|
// Non-fatal
|
|
@@ -195,9 +200,57 @@ const plugin = async () => {
|
|
|
195
200
|
},
|
|
196
201
|
methods: [
|
|
197
202
|
{
|
|
198
|
-
|
|
199
|
-
label: "
|
|
200
|
-
|
|
203
|
+
type: "oauth",
|
|
204
|
+
label: "Switch Claude Code account",
|
|
205
|
+
get prompts() {
|
|
206
|
+
const currentAccounts = refreshAccountsList();
|
|
207
|
+
const currentSource = loadPersistedAccountSource() ?? defaultAccount.source;
|
|
208
|
+
if (currentAccounts.length <= 1)
|
|
209
|
+
return [];
|
|
210
|
+
return [
|
|
211
|
+
{
|
|
212
|
+
type: "select",
|
|
213
|
+
key: "account",
|
|
214
|
+
message: "Select which Claude Code account to use:",
|
|
215
|
+
options: currentAccounts.map((a) => ({
|
|
216
|
+
label: a.label,
|
|
217
|
+
value: a.source,
|
|
218
|
+
hint: a.source === currentSource
|
|
219
|
+
? `${a.source} (active)`
|
|
220
|
+
: a.source,
|
|
221
|
+
})),
|
|
222
|
+
},
|
|
223
|
+
];
|
|
224
|
+
},
|
|
225
|
+
async authorize(inputs) {
|
|
226
|
+
const latestAccounts = refreshAccountsList();
|
|
227
|
+
const source = inputs?.account ?? latestAccounts[0]?.source ?? accounts[0].source;
|
|
228
|
+
const chosen = latestAccounts.find((a) => a.source === source) ??
|
|
229
|
+
accounts.find((a) => a.source === source) ??
|
|
230
|
+
latestAccounts[0] ??
|
|
231
|
+
accounts[0];
|
|
232
|
+
setActiveAccountSource(chosen.source);
|
|
233
|
+
const creds = getCachedCredentials() ?? chosen.credentials;
|
|
234
|
+
syncAuthJson(creds);
|
|
235
|
+
saveAccountSource(chosen.source);
|
|
236
|
+
const sourceDescription = chosen.source === "file"
|
|
237
|
+
? "credentials file (~/.claude/.credentials.json)"
|
|
238
|
+
: "macOS Keychain";
|
|
239
|
+
return {
|
|
240
|
+
url: "",
|
|
241
|
+
instructions: `Using ${chosen.label} — credentials loaded from ${sourceDescription}.`,
|
|
242
|
+
method: "auto",
|
|
243
|
+
async callback() {
|
|
244
|
+
return {
|
|
245
|
+
type: "success",
|
|
246
|
+
provider: "anthropic",
|
|
247
|
+
access: creds.accessToken,
|
|
248
|
+
refresh: creds.refreshToken,
|
|
249
|
+
expires: creds.expiresAt,
|
|
250
|
+
};
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
},
|
|
201
254
|
},
|
|
202
255
|
],
|
|
203
256
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AACnB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/keychain.d.ts
CHANGED
|
@@ -2,6 +2,16 @@ export interface ClaudeCredentials {
|
|
|
2
2
|
accessToken: string;
|
|
3
3
|
refreshToken: string;
|
|
4
4
|
expiresAt: number;
|
|
5
|
+
subscriptionType?: string;
|
|
5
6
|
}
|
|
7
|
+
export interface ClaudeAccount {
|
|
8
|
+
label: string;
|
|
9
|
+
source: string;
|
|
10
|
+
credentials: ClaudeCredentials;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildAccountLabels(credsList: ClaudeCredentials[]): string[];
|
|
13
|
+
export declare function readAllClaudeAccounts(): ClaudeAccount[];
|
|
14
|
+
export declare function refreshAccount(source: string): ClaudeCredentials | null;
|
|
15
|
+
/** @deprecated Use readAllClaudeAccounts() instead */
|
|
6
16
|
export declare function readClaudeCredentials(): ClaudeCredentials | null;
|
|
7
17
|
//# sourceMappingURL=keychain.d.ts.map
|
package/dist/keychain.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,iBAAiB,CAAA;CAC/B;AA4HD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,CAoB3E;AAED,wBAAgB,qBAAqB,IAAI,aAAa,EAAE,CA+BvD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAOvE;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,IAAI,iBAAiB,GAAG,IAAI,CAGhE"}
|
package/dist/keychain.js
CHANGED
|
@@ -2,36 +2,38 @@ import { execSync } from "node:child_process";
|
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
const
|
|
6
|
-
function
|
|
5
|
+
const PRIMARY_SERVICE = "Claude Code-credentials";
|
|
6
|
+
function parseCredentials(raw) {
|
|
7
|
+
let parsed;
|
|
7
8
|
try {
|
|
8
|
-
|
|
9
|
-
const raw = readFileSync(credPath, "utf-8");
|
|
10
|
-
const parsed = JSON.parse(raw);
|
|
11
|
-
const data = parsed.claudeAiOauth ?? parsed;
|
|
12
|
-
const creds = data;
|
|
13
|
-
if (typeof creds.accessToken !== "string" ||
|
|
14
|
-
typeof creds.refreshToken !== "string" ||
|
|
15
|
-
typeof creds.expiresAt !== "number") {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
return {
|
|
19
|
-
accessToken: creds.accessToken,
|
|
20
|
-
refreshToken: creds.refreshToken,
|
|
21
|
-
expiresAt: creds.expiresAt,
|
|
22
|
-
};
|
|
9
|
+
parsed = JSON.parse(raw);
|
|
23
10
|
}
|
|
24
11
|
catch {
|
|
25
12
|
return null;
|
|
26
13
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
14
|
+
const data = parsed.claudeAiOauth ?? parsed;
|
|
15
|
+
const creds = data;
|
|
16
|
+
// Entries that only contain mcpOAuth are MCP server credentials, not user accounts
|
|
17
|
+
if (parsed.mcpOAuth && !creds.accessToken) {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (typeof creds.accessToken !== "string" ||
|
|
21
|
+
typeof creds.refreshToken !== "string" ||
|
|
22
|
+
typeof creds.expiresAt !== "number") {
|
|
23
|
+
return null;
|
|
31
24
|
}
|
|
32
|
-
|
|
25
|
+
return {
|
|
26
|
+
accessToken: creds.accessToken,
|
|
27
|
+
refreshToken: creds.refreshToken,
|
|
28
|
+
expiresAt: creds.expiresAt,
|
|
29
|
+
subscriptionType: typeof creds.subscriptionType === "string"
|
|
30
|
+
? creds.subscriptionType
|
|
31
|
+
: undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function readKeychainService(serviceName) {
|
|
33
35
|
try {
|
|
34
|
-
|
|
36
|
+
return execSync(`security find-generic-password -s "${serviceName}" -w`, {
|
|
35
37
|
timeout: 2000,
|
|
36
38
|
encoding: "utf-8",
|
|
37
39
|
}).trim();
|
|
@@ -41,39 +43,122 @@ export function readClaudeCredentials() {
|
|
|
41
43
|
if (error.killed || error.code === "ETIMEDOUT") {
|
|
42
44
|
throw new Error("Keychain read timed out. This can happen on macOS Tahoe. Try restarting Keychain Access.", { cause: err });
|
|
43
45
|
}
|
|
44
|
-
if (error.status === 44) {
|
|
45
|
-
return readCredentialsFile();
|
|
46
|
-
}
|
|
47
46
|
if (error.status === 36) {
|
|
48
47
|
throw new Error("macOS Keychain is locked. Please unlock it or run: security unlock-keychain ~/Library/Keychains/login.keychain-db", { cause: err });
|
|
49
48
|
}
|
|
50
49
|
if (error.status === 128) {
|
|
51
50
|
throw new Error("Keychain access was denied. Please grant access when prompted by macOS.", { cause: err });
|
|
52
51
|
}
|
|
53
|
-
|
|
52
|
+
if (error.status === 44) {
|
|
53
|
+
return null; // item not found
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`Failed to read Keychain entry "${serviceName}" (exit ${error.status ?? "unknown"}). Try re-authenticating with Claude Code.`, { cause: err });
|
|
54
56
|
}
|
|
55
|
-
|
|
57
|
+
}
|
|
58
|
+
function listClaudeKeychainServices() {
|
|
56
59
|
try {
|
|
57
|
-
|
|
60
|
+
const dump = execSync("security dump-keychain", {
|
|
61
|
+
timeout: 5000,
|
|
62
|
+
encoding: "utf-8",
|
|
63
|
+
});
|
|
64
|
+
const services = [];
|
|
65
|
+
const seen = new Set();
|
|
66
|
+
const re = /"Claude Code-credentials(?:-[0-9a-f]+)?"/g;
|
|
67
|
+
let m = re.exec(dump);
|
|
68
|
+
while (m !== null) {
|
|
69
|
+
const svc = m[0].slice(1, -1);
|
|
70
|
+
if (!seen.has(svc)) {
|
|
71
|
+
seen.add(svc);
|
|
72
|
+
services.push(svc);
|
|
73
|
+
}
|
|
74
|
+
m = re.exec(dump);
|
|
75
|
+
}
|
|
76
|
+
const ordered = [];
|
|
77
|
+
if (seen.has(PRIMARY_SERVICE))
|
|
78
|
+
ordered.push(PRIMARY_SERVICE);
|
|
79
|
+
for (const svc of services) {
|
|
80
|
+
if (svc !== PRIMARY_SERVICE)
|
|
81
|
+
ordered.push(svc);
|
|
82
|
+
}
|
|
83
|
+
return ordered;
|
|
58
84
|
}
|
|
59
85
|
catch {
|
|
60
|
-
|
|
86
|
+
return [PRIMARY_SERVICE];
|
|
61
87
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
88
|
+
}
|
|
89
|
+
function readCredentialsFile() {
|
|
90
|
+
try {
|
|
91
|
+
const credPath = join(homedir(), ".claude", ".credentials.json");
|
|
92
|
+
const raw = readFileSync(credPath, "utf-8");
|
|
93
|
+
return parseCredentials(raw);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function buildAccountLabels(credsList) {
|
|
100
|
+
const baseLabels = credsList.map((c) => {
|
|
101
|
+
if (c.subscriptionType) {
|
|
102
|
+
const tier = c.subscriptionType.charAt(0).toUpperCase() + c.subscriptionType.slice(1);
|
|
103
|
+
return `Claude ${tier}`;
|
|
104
|
+
}
|
|
105
|
+
return "Claude";
|
|
106
|
+
});
|
|
107
|
+
const counts = new Map();
|
|
108
|
+
for (const l of baseLabels)
|
|
109
|
+
counts.set(l, (counts.get(l) ?? 0) + 1);
|
|
110
|
+
const seen = new Map();
|
|
111
|
+
return baseLabels.map((base) => {
|
|
112
|
+
if ((counts.get(base) ?? 0) <= 1)
|
|
113
|
+
return base;
|
|
114
|
+
const n = (seen.get(base) ?? 0) + 1;
|
|
115
|
+
seen.set(base, n);
|
|
116
|
+
return `${base} ${n}`;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
export function readAllClaudeAccounts() {
|
|
120
|
+
if (process.platform !== "darwin") {
|
|
121
|
+
const creds = readCredentialsFile();
|
|
122
|
+
if (!creds)
|
|
123
|
+
return [];
|
|
124
|
+
const [label] = buildAccountLabels([creds]);
|
|
125
|
+
return [{ label, source: "file", credentials: creds }];
|
|
66
126
|
}
|
|
67
|
-
|
|
68
|
-
|
|
127
|
+
const services = listClaudeKeychainServices();
|
|
128
|
+
const rawAccounts = [];
|
|
129
|
+
for (const svc of services) {
|
|
130
|
+
const raw = readKeychainService(svc);
|
|
131
|
+
if (!raw)
|
|
132
|
+
continue;
|
|
133
|
+
const creds = parseCredentials(raw);
|
|
134
|
+
if (!creds)
|
|
135
|
+
continue;
|
|
136
|
+
rawAccounts.push({ source: svc, credentials: creds });
|
|
69
137
|
}
|
|
70
|
-
if (
|
|
71
|
-
|
|
138
|
+
if (rawAccounts.length === 0) {
|
|
139
|
+
const creds = readCredentialsFile();
|
|
140
|
+
if (creds)
|
|
141
|
+
rawAccounts.push({ source: "file", credentials: creds });
|
|
72
142
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
143
|
+
const labels = buildAccountLabels(rawAccounts.map((a) => a.credentials));
|
|
144
|
+
return rawAccounts.map((a, i) => ({
|
|
145
|
+
label: labels[i],
|
|
146
|
+
source: a.source,
|
|
147
|
+
credentials: a.credentials,
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
export function refreshAccount(source) {
|
|
151
|
+
if (source === "file") {
|
|
152
|
+
return readCredentialsFile();
|
|
153
|
+
}
|
|
154
|
+
const raw = readKeychainService(source);
|
|
155
|
+
if (!raw)
|
|
156
|
+
return null;
|
|
157
|
+
return parseCredentials(raw);
|
|
158
|
+
}
|
|
159
|
+
/** @deprecated Use readAllClaudeAccounts() instead */
|
|
160
|
+
export function readClaudeCredentials() {
|
|
161
|
+
const accounts = readAllClaudeAccounts();
|
|
162
|
+
return accounts.length > 0 ? accounts[0].credentials : null;
|
|
78
163
|
}
|
|
79
164
|
//# sourceMappingURL=keychain.js.map
|
package/dist/keychain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"keychain.js","sourceRoot":"","sources":["../src/keychain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface ModelOverride {
|
|
2
|
+
exclude?: string[];
|
|
3
|
+
add?: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface ModelConfig {
|
|
6
|
+
ccVersion: string;
|
|
7
|
+
baseBetas: string[];
|
|
8
|
+
longContextBetas: string[];
|
|
9
|
+
modelOverrides: Record<string, ModelOverride>;
|
|
10
|
+
}
|
|
11
|
+
export declare const config: ModelConfig;
|
|
12
|
+
/**
|
|
13
|
+
* Find the override entry matching a model ID.
|
|
14
|
+
* Keys are matched via includes() against the lowercased model ID.
|
|
15
|
+
*
|
|
16
|
+
* First-match-wins: if multiple keys match, only the first (by insertion
|
|
17
|
+
* order) is returned. List more specific keys before broader ones
|
|
18
|
+
* (e.g. "opus-4-6" before "opus") so they take priority.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getModelOverride(modelId: string): ModelOverride | null;
|
|
21
|
+
//# sourceMappingURL=model-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../src/model-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;CAC9C;AAED,eAAO,MAAM,MAAM,EAAE,WAkBpB,CAAA;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAMtE"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const config = {
|
|
2
|
+
ccVersion: "2.1.80",
|
|
3
|
+
baseBetas: [
|
|
4
|
+
"claude-code-20250219",
|
|
5
|
+
"oauth-2025-04-20",
|
|
6
|
+
"interleaved-thinking-2025-05-14",
|
|
7
|
+
"prompt-caching-scope-2026-01-05",
|
|
8
|
+
"context-management-2025-06-27",
|
|
9
|
+
],
|
|
10
|
+
longContextBetas: [
|
|
11
|
+
"context-1m-2025-08-07",
|
|
12
|
+
"interleaved-thinking-2025-05-14",
|
|
13
|
+
],
|
|
14
|
+
modelOverrides: {
|
|
15
|
+
"4-6": {
|
|
16
|
+
add: ["effort-2025-11-24"],
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Find the override entry matching a model ID.
|
|
22
|
+
* Keys are matched via includes() against the lowercased model ID.
|
|
23
|
+
*
|
|
24
|
+
* First-match-wins: if multiple keys match, only the first (by insertion
|
|
25
|
+
* order) is returned. List more specific keys before broader ones
|
|
26
|
+
* (e.g. "opus-4-6" before "opus") so they take priority.
|
|
27
|
+
*/
|
|
28
|
+
export function getModelOverride(modelId) {
|
|
29
|
+
const lower = modelId.toLowerCase();
|
|
30
|
+
for (const [pattern, override] of Object.entries(config.modelOverrides)) {
|
|
31
|
+
if (lower.includes(pattern))
|
|
32
|
+
return override;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=model-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-config.js","sourceRoot":"","sources":["../src/model-config.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,MAAM,GAAgB;IACjC,SAAS,EAAE,QAAQ;IACnB,SAAS,EAAE;QACT,sBAAsB;QACtB,kBAAkB;QAClB,iCAAiC;QACjC,iCAAiC;QACjC,+BAA+B;KAChC;IACD,gBAAgB,EAAE;QAChB,uBAAuB;QACvB,iCAAiC;KAClC;IACD,cAAc,EAAE;QACd,KAAK,EAAE;YACL,GAAG,EAAE,CAAC,mBAAmB,CAAC;SAC3B;KACF;CACF,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA;IACnC,KAAK,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QACxE,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,QAAQ,CAAA;IAC9C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-claude-auth",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "OpenCode plugin that uses your Claude Code credentials — no separate login needed.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"anthropic",
|
|
@@ -59,6 +59,9 @@
|
|
|
59
59
|
"build": "tsc && cp src/anthropic-prompt.txt dist/",
|
|
60
60
|
"test": "node --test --experimental-strip-types src/**/*.test.ts",
|
|
61
61
|
"test:models": "pnpm run build && node scripts/test-models.ts",
|
|
62
|
+
"intercept": "pnpm run build && node --experimental-strip-types scripts/intercept-claude.ts",
|
|
63
|
+
"intercept:all": "pnpm run build && node --experimental-strip-types scripts/intercept-claude.ts --all",
|
|
64
|
+
"intercept:update": "pnpm run build && node --experimental-strip-types scripts/intercept-claude.ts --all --update",
|
|
62
65
|
"lint": "oxlint && oxfmt --check .",
|
|
63
66
|
"lint:fix": "oxlint --fix . && oxfmt --write .",
|
|
64
67
|
"format": "oxfmt --write ."
|