@kevin0181/rcodex 0.0.1
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/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +114 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/gateway-daemon.d.ts +2 -0
- package/dist/commands/gateway-daemon.d.ts.map +1 -0
- package/dist/commands/gateway-daemon.js +22 -0
- package/dist/commands/gateway-daemon.js.map +1 -0
- package/dist/commands/launch.d.ts +2 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +129 -0
- package/dist/commands/launch.js.map +1 -0
- package/dist/commands/migrate.d.ts +4 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +137 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/setup.d.ts +2 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +78 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +20 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/switch.d.ts +4 -0
- package/dist/commands/switch.d.ts.map +1 -0
- package/dist/commands/switch.js +78 -0
- package/dist/commands/switch.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +107 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/core/codex.d.ts +6 -0
- package/dist/core/codex.d.ts.map +1 -0
- package/dist/core/codex.js +123 -0
- package/dist/core/codex.js.map +1 -0
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +68 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/constants.d.ts +4 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +7 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/ollama.d.ts +3 -0
- package/dist/core/ollama.d.ts.map +1 -0
- package/dist/core/ollama.js +20 -0
- package/dist/core/ollama.js.map +1 -0
- package/dist/gateway/auth.d.ts +58 -0
- package/dist/gateway/auth.d.ts.map +1 -0
- package/dist/gateway/auth.js +248 -0
- package/dist/gateway/auth.js.map +1 -0
- package/dist/gateway/providers/anthropic.d.ts +15 -0
- package/dist/gateway/providers/anthropic.d.ts.map +1 -0
- package/dist/gateway/providers/anthropic.js +122 -0
- package/dist/gateway/providers/anthropic.js.map +1 -0
- package/dist/gateway/providers/antigravity-oauth-flow.d.ts +21 -0
- package/dist/gateway/providers/antigravity-oauth-flow.d.ts.map +1 -0
- package/dist/gateway/providers/antigravity-oauth-flow.js +231 -0
- package/dist/gateway/providers/antigravity-oauth-flow.js.map +1 -0
- package/dist/gateway/providers/antigravity.d.ts +5 -0
- package/dist/gateway/providers/antigravity.d.ts.map +1 -0
- package/dist/gateway/providers/antigravity.js +111 -0
- package/dist/gateway/providers/antigravity.js.map +1 -0
- package/dist/gateway/providers/claude-oauth-flow.d.ts +16 -0
- package/dist/gateway/providers/claude-oauth-flow.d.ts.map +1 -0
- package/dist/gateway/providers/claude-oauth-flow.js +178 -0
- package/dist/gateway/providers/claude-oauth-flow.js.map +1 -0
- package/dist/gateway/providers/copilot.d.ts +19 -0
- package/dist/gateway/providers/copilot.d.ts.map +1 -0
- package/dist/gateway/providers/copilot.js +141 -0
- package/dist/gateway/providers/copilot.js.map +1 -0
- package/dist/gateway/providers/google.d.ts +12 -0
- package/dist/gateway/providers/google.d.ts.map +1 -0
- package/dist/gateway/providers/google.js +58 -0
- package/dist/gateway/providers/google.js.map +1 -0
- package/dist/gateway/providers/ollama.d.ts +6 -0
- package/dist/gateway/providers/ollama.d.ts.map +1 -0
- package/dist/gateway/providers/ollama.js +54 -0
- package/dist/gateway/providers/ollama.js.map +1 -0
- package/dist/gateway/providers/openai-oauth-flow.d.ts +15 -0
- package/dist/gateway/providers/openai-oauth-flow.d.ts.map +1 -0
- package/dist/gateway/providers/openai-oauth-flow.js +149 -0
- package/dist/gateway/providers/openai-oauth-flow.js.map +1 -0
- package/dist/gateway/providers/openai.d.ts +8 -0
- package/dist/gateway/providers/openai.d.ts.map +1 -0
- package/dist/gateway/providers/openai.js +193 -0
- package/dist/gateway/providers/openai.js.map +1 -0
- package/dist/gateway/proxy.d.ts +119 -0
- package/dist/gateway/proxy.d.ts.map +1 -0
- package/dist/gateway/proxy.js +1949 -0
- package/dist/gateway/proxy.js.map +1 -0
- package/dist/gateway/server.d.ts +6 -0
- package/dist/gateway/server.d.ts.map +1 -0
- package/dist/gateway/server.js +890 -0
- package/dist/gateway/server.js.map +1 -0
- package/dist/gateway/ui.d.ts +2 -0
- package/dist/gateway/ui.d.ts.map +1 -0
- package/dist/gateway/ui.js +1748 -0
- package/dist/gateway/ui.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +78 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +4 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +22 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/shell.d.ts +8 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +27 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/updates.d.ts +2 -0
- package/dist/utils/updates.d.ts.map +1 -0
- package/dist/utils/updates.js +83 -0
- package/dist/utils/updates.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export interface ModelSlot {
|
|
2
|
+
slotId: string;
|
|
3
|
+
model: string;
|
|
4
|
+
order: number;
|
|
5
|
+
}
|
|
6
|
+
export interface Account {
|
|
7
|
+
id: string;
|
|
8
|
+
provider: "anthropic" | "openai" | "google" | "ollama" | "antigravity" | "copilot";
|
|
9
|
+
label: string;
|
|
10
|
+
method: "apikey" | "oauth-official" | "oauth-unofficial" | "local";
|
|
11
|
+
apiKey?: string;
|
|
12
|
+
sessionToken?: string;
|
|
13
|
+
oauthToken?: string;
|
|
14
|
+
oauthRefresh?: string;
|
|
15
|
+
oauthExpiry?: number;
|
|
16
|
+
projectId?: string;
|
|
17
|
+
connectedAt: string;
|
|
18
|
+
selectedModel?: string;
|
|
19
|
+
connectedToOut: boolean;
|
|
20
|
+
connectedOrder?: number;
|
|
21
|
+
activeModels?: ModelSlot[];
|
|
22
|
+
}
|
|
23
|
+
export interface ProviderAuth {
|
|
24
|
+
apiKey?: string;
|
|
25
|
+
sessionToken?: string;
|
|
26
|
+
oauthToken?: string;
|
|
27
|
+
oauthRefresh?: string;
|
|
28
|
+
oauthExpiry?: number;
|
|
29
|
+
method?: "apikey" | "oauth-official" | "oauth-unofficial";
|
|
30
|
+
connectedAt?: string;
|
|
31
|
+
selectedModel?: string;
|
|
32
|
+
connectedToOut?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface GatewayConfig {
|
|
35
|
+
port: number;
|
|
36
|
+
pid?: number;
|
|
37
|
+
accounts: Account[];
|
|
38
|
+
ollamaBaseUrl: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function accountToProviderAuth(account: Account): ProviderAuth;
|
|
41
|
+
export declare function loadConfig(): GatewayConfig;
|
|
42
|
+
export declare function saveConfig(config: GatewayConfig): void;
|
|
43
|
+
export declare function addAccount(provider: Account["provider"], label: string, method: Account["method"], credentials: Pick<Account, "apiKey" | "sessionToken" | "oauthToken" | "oauthRefresh" | "oauthExpiry">): Account;
|
|
44
|
+
export declare function updateAccountOAuth(id: string, accessToken: string, refreshToken: string, expiry: number): void;
|
|
45
|
+
export declare function updateAccountProjectId(id: string, projectId: string): void;
|
|
46
|
+
export declare function removeAccount(id: string): void;
|
|
47
|
+
export declare function addModelSlot(accountId: string, model: string, clientSlotId?: string): ModelSlot | null;
|
|
48
|
+
export declare function removeModelSlot(accountId: string, slotId: string): void;
|
|
49
|
+
export declare function reorderAllSlots(orderedItems: {
|
|
50
|
+
accountId: string;
|
|
51
|
+
slotId: string;
|
|
52
|
+
}[]): void;
|
|
53
|
+
export declare function setAccountNodeState(id: string, selectedModel: string | null, connectedToOut: boolean, connectedOrder?: number): void;
|
|
54
|
+
export declare function reorderConnectedAccounts(orderedIds: string[]): void;
|
|
55
|
+
export declare function saveGatewayPid(pid: number): void;
|
|
56
|
+
export declare function clearGatewayPid(): void;
|
|
57
|
+
export declare function killExistingGateway(): boolean;
|
|
58
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/gateway/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
const RCODEX_DIR = join(homedir(), ".rcodex");
|
|
5
|
+
const CONFIG_PATH = join(RCODEX_DIR, "gateway.json");
|
|
6
|
+
export function accountToProviderAuth(account) {
|
|
7
|
+
return {
|
|
8
|
+
apiKey: account.apiKey,
|
|
9
|
+
sessionToken: account.sessionToken,
|
|
10
|
+
oauthToken: account.oauthToken,
|
|
11
|
+
oauthRefresh: account.oauthRefresh,
|
|
12
|
+
oauthExpiry: account.oauthExpiry,
|
|
13
|
+
method: account.method,
|
|
14
|
+
connectedAt: account.connectedAt,
|
|
15
|
+
selectedModel: account.selectedModel,
|
|
16
|
+
connectedToOut: account.connectedToOut,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const DEFAULT_CONFIG = {
|
|
20
|
+
port: 3141,
|
|
21
|
+
accounts: [],
|
|
22
|
+
ollamaBaseUrl: "http://localhost:11434",
|
|
23
|
+
};
|
|
24
|
+
function ensureDir() {
|
|
25
|
+
if (!existsSync(RCODEX_DIR))
|
|
26
|
+
mkdirSync(RCODEX_DIR, { recursive: true });
|
|
27
|
+
}
|
|
28
|
+
function genId(prefix) {
|
|
29
|
+
return `${prefix}_${Date.now()}_${Math.random().toString(36).slice(2, 6)}`;
|
|
30
|
+
}
|
|
31
|
+
// One-time migration from the old providers-map format
|
|
32
|
+
function migrateOldFormat(raw) {
|
|
33
|
+
const old = raw.providers;
|
|
34
|
+
if (!old)
|
|
35
|
+
return raw;
|
|
36
|
+
const accounts = [];
|
|
37
|
+
const LABELS = { anthropic: "Claude", openai: "ChatGPT / Codex", google: "Gemini" };
|
|
38
|
+
for (const p of ["anthropic", "openai", "google"]) {
|
|
39
|
+
const auth = old[p];
|
|
40
|
+
if (!auth?.method)
|
|
41
|
+
continue;
|
|
42
|
+
accounts.push({
|
|
43
|
+
id: genId(p),
|
|
44
|
+
provider: p,
|
|
45
|
+
label: LABELS[p],
|
|
46
|
+
method: auth.method,
|
|
47
|
+
apiKey: auth.apiKey,
|
|
48
|
+
sessionToken: auth.sessionToken,
|
|
49
|
+
oauthToken: auth.oauthToken,
|
|
50
|
+
oauthRefresh: auth.oauthRefresh,
|
|
51
|
+
oauthExpiry: auth.oauthExpiry,
|
|
52
|
+
connectedAt: auth.connectedAt || new Date().toISOString(),
|
|
53
|
+
selectedModel: auth.selectedModel,
|
|
54
|
+
connectedToOut: auth.connectedToOut || false,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
port: raw.port || 3141,
|
|
59
|
+
pid: raw.pid,
|
|
60
|
+
accounts,
|
|
61
|
+
ollamaBaseUrl: old.ollama?.baseUrl || "http://localhost:11434",
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export function loadConfig() {
|
|
65
|
+
ensureDir();
|
|
66
|
+
if (!existsSync(CONFIG_PATH))
|
|
67
|
+
return structuredClone(DEFAULT_CONFIG);
|
|
68
|
+
try {
|
|
69
|
+
const raw = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
70
|
+
if (raw.providers && !raw.accounts) {
|
|
71
|
+
const migrated = migrateOldFormat(raw);
|
|
72
|
+
saveConfig(migrated);
|
|
73
|
+
return migrated;
|
|
74
|
+
}
|
|
75
|
+
if (!raw.accounts)
|
|
76
|
+
raw.accounts = [];
|
|
77
|
+
if (!raw.ollamaBaseUrl)
|
|
78
|
+
raw.ollamaBaseUrl = "http://localhost:11434";
|
|
79
|
+
const config = raw;
|
|
80
|
+
// Migration 1: assign connectedOrder to connected accounts that pre-date this field
|
|
81
|
+
let dirty = false;
|
|
82
|
+
let next = Math.max(-1, ...config.accounts.map(a => a.connectedOrder ?? -1)) + 1;
|
|
83
|
+
for (const account of config.accounts) {
|
|
84
|
+
if (account.connectedToOut && account.connectedOrder === undefined) {
|
|
85
|
+
account.connectedOrder = next++;
|
|
86
|
+
dirty = true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Migration 2: convert legacy connectedToOut/selectedModel into activeModels slots
|
|
90
|
+
for (const account of config.accounts) {
|
|
91
|
+
if (account.connectedToOut && !account.activeModels?.length) {
|
|
92
|
+
account.activeModels = [{
|
|
93
|
+
slotId: genId("slot"),
|
|
94
|
+
model: account.selectedModel || "",
|
|
95
|
+
order: account.connectedOrder ?? 999,
|
|
96
|
+
}];
|
|
97
|
+
dirty = true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (dirty)
|
|
101
|
+
saveConfig(config);
|
|
102
|
+
return config;
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return structuredClone(DEFAULT_CONFIG);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function saveConfig(config) {
|
|
109
|
+
ensureDir();
|
|
110
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
|
|
111
|
+
}
|
|
112
|
+
export function addAccount(provider, label, method, credentials) {
|
|
113
|
+
const config = loadConfig();
|
|
114
|
+
const account = {
|
|
115
|
+
id: genId(provider),
|
|
116
|
+
provider,
|
|
117
|
+
label,
|
|
118
|
+
method,
|
|
119
|
+
connectedAt: new Date().toISOString(),
|
|
120
|
+
connectedToOut: false,
|
|
121
|
+
...credentials,
|
|
122
|
+
};
|
|
123
|
+
config.accounts.push(account);
|
|
124
|
+
saveConfig(config);
|
|
125
|
+
return account;
|
|
126
|
+
}
|
|
127
|
+
export function updateAccountOAuth(id, accessToken, refreshToken, expiry) {
|
|
128
|
+
const config = loadConfig();
|
|
129
|
+
const account = config.accounts.find(a => a.id === id);
|
|
130
|
+
if (!account)
|
|
131
|
+
return;
|
|
132
|
+
account.oauthToken = accessToken;
|
|
133
|
+
account.oauthRefresh = refreshToken;
|
|
134
|
+
account.oauthExpiry = expiry;
|
|
135
|
+
saveConfig(config);
|
|
136
|
+
}
|
|
137
|
+
export function updateAccountProjectId(id, projectId) {
|
|
138
|
+
const config = loadConfig();
|
|
139
|
+
const account = config.accounts.find(a => a.id === id);
|
|
140
|
+
if (!account)
|
|
141
|
+
return;
|
|
142
|
+
account.projectId = projectId;
|
|
143
|
+
saveConfig(config);
|
|
144
|
+
}
|
|
145
|
+
export function removeAccount(id) {
|
|
146
|
+
const config = loadConfig();
|
|
147
|
+
config.accounts = config.accounts.filter(a => a.id !== id);
|
|
148
|
+
saveConfig(config);
|
|
149
|
+
}
|
|
150
|
+
// ?�?� Model slot management ?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�
|
|
151
|
+
export function addModelSlot(accountId, model, clientSlotId) {
|
|
152
|
+
const config = loadConfig();
|
|
153
|
+
const account = config.accounts.find(a => a.id === accountId);
|
|
154
|
+
if (!account)
|
|
155
|
+
return null;
|
|
156
|
+
if (!account.activeModels)
|
|
157
|
+
account.activeModels = [];
|
|
158
|
+
// If slot with this ID already exists, return it (idempotent)
|
|
159
|
+
if (clientSlotId) {
|
|
160
|
+
const existing = account.activeModels.find(s => s.slotId === clientSlotId);
|
|
161
|
+
if (existing)
|
|
162
|
+
return existing;
|
|
163
|
+
}
|
|
164
|
+
// Global max order across all accounts
|
|
165
|
+
let maxOrder = -1;
|
|
166
|
+
for (const acc of config.accounts) {
|
|
167
|
+
for (const s of acc.activeModels ?? []) {
|
|
168
|
+
if (s.order > maxOrder)
|
|
169
|
+
maxOrder = s.order;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
const slot = { slotId: clientSlotId ?? genId("slot"), model, order: maxOrder + 1 };
|
|
173
|
+
account.activeModels.push(slot);
|
|
174
|
+
account.connectedToOut = true;
|
|
175
|
+
saveConfig(config);
|
|
176
|
+
return slot;
|
|
177
|
+
}
|
|
178
|
+
export function removeModelSlot(accountId, slotId) {
|
|
179
|
+
const config = loadConfig();
|
|
180
|
+
const account = config.accounts.find(a => a.id === accountId);
|
|
181
|
+
if (!account)
|
|
182
|
+
return;
|
|
183
|
+
account.activeModels = (account.activeModels ?? []).filter(s => s.slotId !== slotId);
|
|
184
|
+
if (!account.activeModels.length) {
|
|
185
|
+
account.connectedToOut = false;
|
|
186
|
+
delete account.connectedOrder;
|
|
187
|
+
}
|
|
188
|
+
saveConfig(config);
|
|
189
|
+
}
|
|
190
|
+
export function reorderAllSlots(orderedItems) {
|
|
191
|
+
const config = loadConfig();
|
|
192
|
+
orderedItems.forEach(({ accountId, slotId }, idx) => {
|
|
193
|
+
const account = config.accounts.find(a => a.id === accountId);
|
|
194
|
+
const slot = account?.activeModels?.find(s => s.slotId === slotId);
|
|
195
|
+
if (slot)
|
|
196
|
+
slot.order = idx;
|
|
197
|
+
});
|
|
198
|
+
saveConfig(config);
|
|
199
|
+
}
|
|
200
|
+
// Legacy: kept for backward compat with old node-state endpoint
|
|
201
|
+
export function setAccountNodeState(id, selectedModel, connectedToOut, connectedOrder) {
|
|
202
|
+
const config = loadConfig();
|
|
203
|
+
const account = config.accounts.find(a => a.id === id);
|
|
204
|
+
if (!account)
|
|
205
|
+
return;
|
|
206
|
+
account.selectedModel = selectedModel ?? undefined;
|
|
207
|
+
account.connectedToOut = connectedToOut;
|
|
208
|
+
if (connectedOrder !== undefined)
|
|
209
|
+
account.connectedOrder = connectedOrder;
|
|
210
|
+
else if (!connectedToOut)
|
|
211
|
+
delete account.connectedOrder;
|
|
212
|
+
saveConfig(config);
|
|
213
|
+
}
|
|
214
|
+
export function reorderConnectedAccounts(orderedIds) {
|
|
215
|
+
const config = loadConfig();
|
|
216
|
+
orderedIds.forEach((id, idx) => {
|
|
217
|
+
const account = config.accounts.find(a => a.id === id);
|
|
218
|
+
if (account)
|
|
219
|
+
account.connectedOrder = idx;
|
|
220
|
+
});
|
|
221
|
+
saveConfig(config);
|
|
222
|
+
}
|
|
223
|
+
export function saveGatewayPid(pid) {
|
|
224
|
+
const config = loadConfig();
|
|
225
|
+
config.pid = pid;
|
|
226
|
+
saveConfig(config);
|
|
227
|
+
}
|
|
228
|
+
export function clearGatewayPid() {
|
|
229
|
+
const config = loadConfig();
|
|
230
|
+
delete config.pid;
|
|
231
|
+
saveConfig(config);
|
|
232
|
+
}
|
|
233
|
+
export function killExistingGateway() {
|
|
234
|
+
const config = loadConfig();
|
|
235
|
+
if (!config.pid)
|
|
236
|
+
return false;
|
|
237
|
+
const pid = config.pid;
|
|
238
|
+
clearGatewayPid();
|
|
239
|
+
try {
|
|
240
|
+
process.kill(pid, 0);
|
|
241
|
+
process.kill(pid);
|
|
242
|
+
return true;
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/gateway/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ProviderAuth } from "../auth.js";
|
|
2
|
+
export interface Message {
|
|
3
|
+
role: string;
|
|
4
|
+
content: string | ContentPart[];
|
|
5
|
+
}
|
|
6
|
+
export interface ContentPart {
|
|
7
|
+
type: string;
|
|
8
|
+
text?: string;
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export declare function isAnthropicModel(model: string): boolean;
|
|
12
|
+
export declare function supportsThinking(model: string): boolean;
|
|
13
|
+
export declare function callAnthropic(auth: ProviderAuth, model: string, messages: Message[], systemPrompt: string | undefined, stream: boolean, signal?: AbortSignal, enableThinking?: boolean, tools?: unknown[], betas?: string[]): Promise<Response>;
|
|
14
|
+
export declare function getAnthropicModels(auth: ProviderAuth): Promise<string[]>;
|
|
15
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/gateway/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;CAAE;AAE3E,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAAE;AAErF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAGD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,EAAE,OAAO,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,cAAc,UAAQ,EACtB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,KAAK,CAAC,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,QAAQ,CAAC,CAanB;AAyGD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAoB9E"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
const API_BASE = "https://api.anthropic.com/v1";
|
|
2
|
+
export function isAnthropicModel(model) {
|
|
3
|
+
return model.startsWith("claude-");
|
|
4
|
+
}
|
|
5
|
+
// claude-3-7+, claude-sonnet-4+, claude-opus-4+ support extended thinking
|
|
6
|
+
export function supportsThinking(model) {
|
|
7
|
+
return /^claude-(3-7|opus-4|sonnet-4|haiku-4)/.test(model);
|
|
8
|
+
}
|
|
9
|
+
export async function callAnthropic(auth, model, messages, systemPrompt, stream, signal, enableThinking = false, tools, betas) {
|
|
10
|
+
// OAuth official: always use Bearer token ??routes through Claude Code subscription quota
|
|
11
|
+
// (create_api_key keys bill against separate API credits, not the subscription)
|
|
12
|
+
if (auth.method === "oauth-official" && auth.oauthToken) {
|
|
13
|
+
return callAnthropicBearer(auth.oauthToken, model, messages, systemPrompt, stream, signal, enableThinking, tools, betas);
|
|
14
|
+
}
|
|
15
|
+
if (auth.method === "oauth-unofficial" && auth.sessionToken) {
|
|
16
|
+
return callAnthropicUnofficial(auth.sessionToken, model, messages, systemPrompt, stream, signal);
|
|
17
|
+
}
|
|
18
|
+
if (auth.apiKey) {
|
|
19
|
+
return callAnthropicAPI(auth.apiKey, model, messages, systemPrompt, stream, signal, enableThinking, tools, betas);
|
|
20
|
+
}
|
|
21
|
+
throw new Error("Anthropic: no valid authentication configured");
|
|
22
|
+
}
|
|
23
|
+
function serializeMessages(messages) {
|
|
24
|
+
return messages.map((m) => {
|
|
25
|
+
if (typeof m.content === "string")
|
|
26
|
+
return { role: m.role, content: m.content };
|
|
27
|
+
const parts = m.content;
|
|
28
|
+
// If any part has a non-text/thinking/thinking type (e.g. tool_use, tool_result),
|
|
29
|
+
// pass the content array through as-is ??it's already Anthropic-formatted.
|
|
30
|
+
const hasSpecial = parts.some(p => p.type !== "text" && p.type !== "thinking");
|
|
31
|
+
if (hasSpecial)
|
|
32
|
+
return { role: m.role, content: parts };
|
|
33
|
+
return {
|
|
34
|
+
role: m.role,
|
|
35
|
+
content: parts.map(c => c.type === "thinking" ? c : { type: "text", text: c.text ?? "" }),
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async function callAnthropicAPI(apiKey, model, messages, systemPrompt, stream, signal, enableThinking = false, tools, betas) {
|
|
40
|
+
const body = {
|
|
41
|
+
model,
|
|
42
|
+
max_tokens: enableThinking ? 16000 : 8192,
|
|
43
|
+
messages: serializeMessages(messages),
|
|
44
|
+
stream,
|
|
45
|
+
};
|
|
46
|
+
if (systemPrompt)
|
|
47
|
+
body.system = systemPrompt;
|
|
48
|
+
if (enableThinking)
|
|
49
|
+
body.thinking = { type: "enabled", budget_tokens: 8000 };
|
|
50
|
+
if (tools?.length)
|
|
51
|
+
body.tools = tools;
|
|
52
|
+
const headers = {
|
|
53
|
+
"content-type": "application/json",
|
|
54
|
+
"x-api-key": apiKey,
|
|
55
|
+
"anthropic-version": "2023-06-01",
|
|
56
|
+
};
|
|
57
|
+
if (betas?.length)
|
|
58
|
+
headers["anthropic-beta"] = betas.join(",");
|
|
59
|
+
return fetch(`${API_BASE}/messages`, {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers,
|
|
62
|
+
body: JSON.stringify(body),
|
|
63
|
+
signal,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
async function callAnthropicBearer(accessToken, model, messages, systemPrompt, stream, signal, enableThinking = false, tools, betas) {
|
|
67
|
+
const body = {
|
|
68
|
+
model,
|
|
69
|
+
max_tokens: enableThinking ? 16000 : 8192,
|
|
70
|
+
messages: serializeMessages(messages),
|
|
71
|
+
stream,
|
|
72
|
+
};
|
|
73
|
+
if (systemPrompt)
|
|
74
|
+
body.system = systemPrompt;
|
|
75
|
+
if (enableThinking)
|
|
76
|
+
body.thinking = { type: "enabled", budget_tokens: 8000 };
|
|
77
|
+
if (tools?.length)
|
|
78
|
+
body.tools = tools;
|
|
79
|
+
const headers = {
|
|
80
|
+
"content-type": "application/json",
|
|
81
|
+
"authorization": `Bearer ${accessToken}`,
|
|
82
|
+
"anthropic-version": "2023-06-01",
|
|
83
|
+
};
|
|
84
|
+
if (betas?.length)
|
|
85
|
+
headers["anthropic-beta"] = betas.join(",");
|
|
86
|
+
return fetch(`${API_BASE}/messages`, {
|
|
87
|
+
method: "POST",
|
|
88
|
+
headers,
|
|
89
|
+
body: JSON.stringify(body),
|
|
90
|
+
signal,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async function callAnthropicUnofficial(_sessionToken, _model, _messages, _systemPrompt, _stream, _signal) {
|
|
94
|
+
// Claude.ai's internal API requires a multi-step conversation protocol
|
|
95
|
+
// (create conversation ??stream completion) that differs significantly from
|
|
96
|
+
// the Anthropic API. Not implemented ??use an API key instead.
|
|
97
|
+
throw new Error("Unofficial Claude.ai session auth is not supported. Please add an Anthropic API key in the gateway UI.");
|
|
98
|
+
}
|
|
99
|
+
export async function getAnthropicModels(auth) {
|
|
100
|
+
if (auth.method === "oauth-official") {
|
|
101
|
+
return ["claude-haiku-4-5-20251001"];
|
|
102
|
+
}
|
|
103
|
+
if (auth.method === "oauth-unofficial") {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
if (!auth.apiKey) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
const res = await fetch(`${API_BASE}/models`, {
|
|
111
|
+
headers: { "x-api-key": auth.apiKey, "anthropic-version": "2023-06-01" },
|
|
112
|
+
});
|
|
113
|
+
if (!res.ok)
|
|
114
|
+
throw new Error("failed");
|
|
115
|
+
const data = await res.json();
|
|
116
|
+
return data.data.map((m) => m.id);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/gateway/providers/anthropic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type AppCreds = {
|
|
2
|
+
clientId: string;
|
|
3
|
+
clientSecret: string;
|
|
4
|
+
};
|
|
5
|
+
export declare function getAppCredentials(): AppCreds;
|
|
6
|
+
export declare function hasAppCredentials(): boolean;
|
|
7
|
+
export interface AntigravityTokens {
|
|
8
|
+
accessToken: string;
|
|
9
|
+
refreshToken: string;
|
|
10
|
+
expiresIn: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildAntigravityAuthUrl(): {
|
|
13
|
+
url: string;
|
|
14
|
+
state: string;
|
|
15
|
+
};
|
|
16
|
+
export declare function exchangeAntigravityCode(code: string): Promise<AntigravityTokens>;
|
|
17
|
+
export declare function refreshAntigravityAccessToken(refreshToken: string): Promise<AntigravityTokens>;
|
|
18
|
+
export declare function loadAntigravityProject(accessToken: string): Promise<string>;
|
|
19
|
+
export declare function waitForAntigravityCallback(expectedState: string): Promise<string>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=antigravity-oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"antigravity-oauth-flow.d.ts","sourceRoot":"","sources":["../../../src/gateway/providers/antigravity-oauth-flow.ts"],"names":[],"mappings":"AAQA,KAAK,QAAQ,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAW3D,wBAAgB,iBAAiB,IAAI,QAAQ,CAiB5C;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAYD,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,uBAAuB,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAaxE;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAiBtF;AAED,wBAAsB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgBpG;AAuBD,wBAAsB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCjF;AASD,wBAAgB,0BAA0B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA2BjF"}
|