@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,141 @@
|
|
|
1
|
+
const COPILOT_API = "https://api.githubcopilot.com";
|
|
2
|
+
const GH_API = "https://api.github.com";
|
|
3
|
+
const GITHUB_CLIENT_ID = "Iv1.b507a08c87ecfe98";
|
|
4
|
+
export const COPILOT_DEFAULT_MODELS = [
|
|
5
|
+
"gpt-4o",
|
|
6
|
+
"gpt-4o-mini",
|
|
7
|
+
"o3-mini",
|
|
8
|
+
"claude-3.5-sonnet",
|
|
9
|
+
"claude-sonnet-4-5",
|
|
10
|
+
];
|
|
11
|
+
// In-memory cache: GitHub OAuth access token ??{Copilot token, expiresAt ms}
|
|
12
|
+
const tokenCache = new Map();
|
|
13
|
+
export async function startCopilotDeviceAuth() {
|
|
14
|
+
const res = await fetch("https://github.com/login/device/code", {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
"accept": "application/json",
|
|
18
|
+
"content-type": "application/json",
|
|
19
|
+
"User-Agent": "GithubCopilot/1.155.0",
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({ client_id: GITHUB_CLIENT_ID, scope: "read:user" }),
|
|
22
|
+
signal: AbortSignal.timeout(15_000),
|
|
23
|
+
});
|
|
24
|
+
if (!res.ok)
|
|
25
|
+
throw new Error(`GitHub device auth failed (${res.status}): ${await res.text()}`);
|
|
26
|
+
const data = await res.json();
|
|
27
|
+
return {
|
|
28
|
+
deviceCode: data.device_code,
|
|
29
|
+
userCode: data.user_code,
|
|
30
|
+
verificationUri: data.verification_uri,
|
|
31
|
+
expiresIn: data.expires_in,
|
|
32
|
+
interval: data.interval ?? 5,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export async function pollCopilotDeviceToken(auth) {
|
|
36
|
+
const startedAt = Date.now();
|
|
37
|
+
let intervalMs = Math.max(1, auth.interval) * 1000;
|
|
38
|
+
while (Date.now() - startedAt < auth.expiresIn * 1000) {
|
|
39
|
+
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
40
|
+
const res = await fetch("https://github.com/login/oauth/access_token", {
|
|
41
|
+
method: "POST",
|
|
42
|
+
headers: {
|
|
43
|
+
"accept": "application/json",
|
|
44
|
+
"content-type": "application/json",
|
|
45
|
+
"User-Agent": "GithubCopilot/1.155.0",
|
|
46
|
+
},
|
|
47
|
+
body: JSON.stringify({
|
|
48
|
+
client_id: GITHUB_CLIENT_ID,
|
|
49
|
+
device_code: auth.deviceCode,
|
|
50
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
51
|
+
}),
|
|
52
|
+
signal: AbortSignal.timeout(15_000),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok)
|
|
55
|
+
throw new Error(`GitHub token polling failed (${res.status}): ${await res.text()}`);
|
|
56
|
+
const data = await res.json();
|
|
57
|
+
if (data.access_token) {
|
|
58
|
+
return { accessToken: data.access_token, tokenType: data.token_type, scope: data.scope };
|
|
59
|
+
}
|
|
60
|
+
if (data.error === "authorization_pending")
|
|
61
|
+
continue;
|
|
62
|
+
if (data.error === "slow_down") {
|
|
63
|
+
intervalMs += 5_000;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (data.error === "access_denied")
|
|
67
|
+
throw new Error("GitHub Copilot login was denied by the user");
|
|
68
|
+
if (data.error === "expired_token")
|
|
69
|
+
throw new Error("GitHub Copilot login code expired");
|
|
70
|
+
throw new Error(data.error_description || data.error || "GitHub Copilot login failed");
|
|
71
|
+
}
|
|
72
|
+
throw new Error("GitHub Copilot login timed out");
|
|
73
|
+
}
|
|
74
|
+
export async function getCopilotToken(githubToken) {
|
|
75
|
+
const cached = tokenCache.get(githubToken);
|
|
76
|
+
if (cached && cached.expiresAt > Date.now() + 30_000)
|
|
77
|
+
return cached.token;
|
|
78
|
+
const res = await fetch(`${GH_API}/copilot_internal/v2/token`, {
|
|
79
|
+
headers: {
|
|
80
|
+
"Authorization": `token ${githubToken}`,
|
|
81
|
+
"User-Agent": "GithubCopilot/1.155.0",
|
|
82
|
+
},
|
|
83
|
+
signal: AbortSignal.timeout(15_000),
|
|
84
|
+
});
|
|
85
|
+
if (!res.ok)
|
|
86
|
+
throw new Error(`Copilot token exchange failed (${res.status}): ${await res.text()}`);
|
|
87
|
+
const data = await res.json();
|
|
88
|
+
tokenCache.set(githubToken, { token: data.token, expiresAt: data.expires_at * 1000 });
|
|
89
|
+
return data.token;
|
|
90
|
+
}
|
|
91
|
+
function copilotHeaders(token) {
|
|
92
|
+
return {
|
|
93
|
+
"Authorization": `Bearer ${token}`,
|
|
94
|
+
"Content-Type": "application/json",
|
|
95
|
+
"Editor-Version": "vscode/1.90.2",
|
|
96
|
+
"Editor-Plugin-Version": "copilot-chat/0.17.2",
|
|
97
|
+
"Openai-Intent": "conversation-panel",
|
|
98
|
+
"User-Agent": "GithubCopilot/1.155.0",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
export async function getCopilotModels(githubToken) {
|
|
102
|
+
if (!githubToken)
|
|
103
|
+
return [];
|
|
104
|
+
try {
|
|
105
|
+
const token = await getCopilotToken(githubToken);
|
|
106
|
+
const res = await fetch(`${COPILOT_API}/models`, {
|
|
107
|
+
headers: copilotHeaders(token),
|
|
108
|
+
signal: AbortSignal.timeout(10_000),
|
|
109
|
+
});
|
|
110
|
+
if (!res.ok)
|
|
111
|
+
return [];
|
|
112
|
+
const data = await res.json();
|
|
113
|
+
const models = (data.data || [])
|
|
114
|
+
.filter(m => m.model_picker_enabled !== false)
|
|
115
|
+
.filter(m => (m.supported_endpoints ?? []).includes("/chat/completions"))
|
|
116
|
+
.map(m => m.id)
|
|
117
|
+
.filter(Boolean);
|
|
118
|
+
return models;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return [];
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export async function callCopilot(githubToken, model, messages, instructions, stream = true, signal, tools) {
|
|
125
|
+
const token = await getCopilotToken(githubToken);
|
|
126
|
+
const fullMessages = instructions
|
|
127
|
+
? [{ role: "system", content: instructions }, ...messages]
|
|
128
|
+
: messages;
|
|
129
|
+
const body = { model, messages: fullMessages, stream };
|
|
130
|
+
if (tools && tools.length > 0) {
|
|
131
|
+
body.tools = tools;
|
|
132
|
+
body.tool_choice = "auto";
|
|
133
|
+
}
|
|
134
|
+
return fetch(`${COPILOT_API}/chat/completions`, {
|
|
135
|
+
method: "POST",
|
|
136
|
+
headers: copilotHeaders(token),
|
|
137
|
+
body: JSON.stringify(body),
|
|
138
|
+
signal,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/gateway/providers/copilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ProviderAuth } from "../auth.js";
|
|
2
|
+
import type { Message } from "./anthropic.js";
|
|
3
|
+
export declare function isGoogleModel(model: string): boolean;
|
|
4
|
+
export declare function callGoogle(auth: ProviderAuth, model: string, messages: Message[], systemPrompt: string | undefined, stream: boolean, signal?: AbortSignal, tools?: unknown[], prebuiltContents?: unknown[]): Promise<Response>;
|
|
5
|
+
export declare function getGoogleModels(auth: ProviderAuth): Promise<string[]>;
|
|
6
|
+
export declare const GOOGLE_OAUTH: {
|
|
7
|
+
clientId: string;
|
|
8
|
+
authUrl: string;
|
|
9
|
+
tokenUrl: string;
|
|
10
|
+
scope: string;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=google.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../../src/gateway/providers/google.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAI9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAsB,UAAU,CAC9B,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,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAC3B,OAAO,CAAC,QAAQ,CAAC,CA6BnB;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB3E;AAGD,eAAO,MAAM,YAAY;;;;;CAKxB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const API_BASE = "https://generativelanguage.googleapis.com/v1beta";
|
|
2
|
+
export function isGoogleModel(model) {
|
|
3
|
+
return model.startsWith("gemini-");
|
|
4
|
+
}
|
|
5
|
+
export async function callGoogle(auth, model, messages, systemPrompt, stream, signal, tools, prebuiltContents) {
|
|
6
|
+
const apiKey = auth.apiKey || auth.oauthToken;
|
|
7
|
+
if (!apiKey)
|
|
8
|
+
throw new Error("Google: no valid authentication configured");
|
|
9
|
+
const contents = prebuiltContents ?? messages.map((m) => ({
|
|
10
|
+
role: m.role === "assistant" ? "model" : "user",
|
|
11
|
+
parts: [{ text: typeof m.content === "string"
|
|
12
|
+
? m.content
|
|
13
|
+
: m.content.map((c) => c.text ?? "").join("") }],
|
|
14
|
+
}));
|
|
15
|
+
const body = { contents };
|
|
16
|
+
if (systemPrompt) {
|
|
17
|
+
body.systemInstruction = { parts: [{ text: systemPrompt }] };
|
|
18
|
+
}
|
|
19
|
+
if (tools?.length) {
|
|
20
|
+
body.tools = [{ functionDeclarations: tools }];
|
|
21
|
+
}
|
|
22
|
+
const endpoint = stream
|
|
23
|
+
? `${API_BASE}/models/${model}:streamGenerateContent?key=${apiKey}&alt=sse`
|
|
24
|
+
: `${API_BASE}/models/${model}:generateContent?key=${apiKey}`;
|
|
25
|
+
return fetch(endpoint, {
|
|
26
|
+
method: "POST",
|
|
27
|
+
headers: { "content-type": "application/json" },
|
|
28
|
+
body: JSON.stringify(body),
|
|
29
|
+
signal,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
export async function getGoogleModels(auth) {
|
|
33
|
+
const apiKey = auth.apiKey || auth.oauthToken;
|
|
34
|
+
if (!apiKey)
|
|
35
|
+
return [];
|
|
36
|
+
try {
|
|
37
|
+
const res = await fetch(`${API_BASE}/models?key=${apiKey}`);
|
|
38
|
+
if (!res.ok)
|
|
39
|
+
throw new Error("failed");
|
|
40
|
+
const data = await res.json();
|
|
41
|
+
return data.models
|
|
42
|
+
.filter((m) => (m.supportedGenerationMethods ?? []).some(method => method === "generateContent" || method === "streamGenerateContent"))
|
|
43
|
+
.map((m) => m.name.replace("models/", ""))
|
|
44
|
+
.filter((id) => id.startsWith("gemini-") &&
|
|
45
|
+
!/(embedding|embed|tts|audio|image|robotics|computer-use)/i.test(id));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Google OAuth endpoints
|
|
52
|
+
export const GOOGLE_OAUTH = {
|
|
53
|
+
clientId: "", // user must configure
|
|
54
|
+
authUrl: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
55
|
+
tokenUrl: "https://oauth2.googleapis.com/token",
|
|
56
|
+
scope: "https://www.googleapis.com/auth/generative-language",
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=google.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/gateway/providers/google.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Message } from "./anthropic.js";
|
|
2
|
+
export declare function isOllamaModel(model: string): boolean;
|
|
3
|
+
export declare function callOllama(baseUrl: string, model: string, messages: Message[], systemPrompt: string | undefined, stream: boolean, signal?: AbortSignal, tools?: unknown[], prebuiltMessages?: unknown[]): Promise<Response>;
|
|
4
|
+
export declare function getOllamaModels(baseUrl: string): Promise<string[]>;
|
|
5
|
+
export declare function isOllamaRunning(baseUrl: string): Promise<boolean>;
|
|
6
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/gateway/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,EAAE,OAAO,EACf,MAAM,CAAC,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,gBAAgB,CAAC,EAAE,OAAO,EAAE,GAC3B,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CASxE;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function isOllamaModel(model) {
|
|
2
|
+
return model.includes(":") || model.includes("/");
|
|
3
|
+
}
|
|
4
|
+
export async function callOllama(baseUrl, model, messages, systemPrompt, stream, signal, tools, prebuiltMessages) {
|
|
5
|
+
const allMessages = prebuiltMessages ?? (() => {
|
|
6
|
+
const msgs = [];
|
|
7
|
+
if (systemPrompt)
|
|
8
|
+
msgs.push({ role: "system", content: systemPrompt });
|
|
9
|
+
msgs.push(...messages.map((m) => ({
|
|
10
|
+
role: m.role,
|
|
11
|
+
// Ollama only accepts string content ??flatten content-part arrays
|
|
12
|
+
content: typeof m.content === "string"
|
|
13
|
+
? m.content
|
|
14
|
+
: m.content.map((c) => c.text ?? "").join(""),
|
|
15
|
+
})));
|
|
16
|
+
return msgs;
|
|
17
|
+
})();
|
|
18
|
+
const body = { model, messages: allMessages, stream };
|
|
19
|
+
if (stream)
|
|
20
|
+
body.stream_options = { include_usage: true };
|
|
21
|
+
if (tools?.length)
|
|
22
|
+
body.tools = tools;
|
|
23
|
+
// Enable thinking mode for models that support it (qwen3, deepseek-r1, etc.).
|
|
24
|
+
// Ollama passes unknown options to the model runtime ??unsupported models ignore it.
|
|
25
|
+
body.options = { think: true };
|
|
26
|
+
return fetch(`${baseUrl}/v1/chat/completions`, {
|
|
27
|
+
method: "POST",
|
|
28
|
+
headers: { "content-type": "application/json" },
|
|
29
|
+
body: JSON.stringify(body),
|
|
30
|
+
signal,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
export async function getOllamaModels(baseUrl) {
|
|
34
|
+
try {
|
|
35
|
+
const res = await fetch(`${baseUrl}/api/tags`, { signal: AbortSignal.timeout(3000) });
|
|
36
|
+
if (!res.ok)
|
|
37
|
+
return [];
|
|
38
|
+
const data = await res.json();
|
|
39
|
+
return data.models.map((m) => m.name);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function isOllamaRunning(baseUrl) {
|
|
46
|
+
try {
|
|
47
|
+
const res = await fetch(`${baseUrl}/api/tags`, { signal: AbortSignal.timeout(2000) });
|
|
48
|
+
return res.ok;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/gateway/providers/ollama.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,OAAe,EACf,KAAa,EACb,QAAmB,EACnB,YAAgC,EAChC,MAAe,EACf,MAAoB,EACpB,KAAiB,EACjB,gBAA4B;IAE5B,MAAM,WAAW,GAAc,gBAAgB,IAAI,CAAC,GAAG,EAAE;QACvD,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,IAAI,YAAY;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,mEAAmE;YACnE,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;gBACpC,CAAC,CAAC,CAAC,CAAC,OAAO;gBACX,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC,CAAC,CAAC;QACL,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAC/E,IAAI,MAAM;QAAE,IAAI,CAAC,cAAc,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IAC1D,IAAI,KAAK,EAAE,MAAM;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACtC,8EAA8E;IAC9E,qFAAqF;IACrF,IAAI,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAE/B,OAAO,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;QAC7C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM;KACP,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtF,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoC,CAAC;QAChE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtF,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface OAuthTokens {
|
|
2
|
+
accessToken: string;
|
|
3
|
+
refreshToken: string;
|
|
4
|
+
expiresIn: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function buildAuthUrl(): {
|
|
7
|
+
url: string;
|
|
8
|
+
state: string;
|
|
9
|
+
verifier: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function exchangeCode(code: string, verifier: string): Promise<OAuthTokens>;
|
|
12
|
+
export declare function refreshOpenAIAccessToken(refreshToken: string): Promise<OAuthTokens>;
|
|
13
|
+
export declare function waitForCallback(expectedState: string): Promise<string>;
|
|
14
|
+
export declare function runOAuthFlow(): Promise<OAuthTokens>;
|
|
15
|
+
//# sourceMappingURL=openai-oauth-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-oauth-flow.d.ts","sourceRoot":"","sources":["../../../src/gateway/providers/openai-oauth-flow.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAsB/E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA8BvF;AAED,wBAAsB,wBAAwB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA4BzF;AAID,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CtE;AAWD,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,CAKzD"}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { createServer } from "http";
|
|
2
|
+
import { createHash, randomBytes } from "crypto";
|
|
3
|
+
import { execSync } from "child_process";
|
|
4
|
+
const CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
|
|
5
|
+
const AUTH_URL = "https://auth.openai.com/oauth/authorize";
|
|
6
|
+
const TOKEN_URL = "https://auth.openai.com/oauth/token";
|
|
7
|
+
const CALLBACK_PORT = 1455;
|
|
8
|
+
const REDIRECT_URI = `http://localhost:${CALLBACK_PORT}/auth/callback`;
|
|
9
|
+
const SCOPES = "openid profile email offline_access";
|
|
10
|
+
function generatePKCE() {
|
|
11
|
+
const verifier = randomBytes(32).toString("base64url");
|
|
12
|
+
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
|
13
|
+
return { verifier, challenge };
|
|
14
|
+
}
|
|
15
|
+
export function buildAuthUrl() {
|
|
16
|
+
const { verifier, challenge } = generatePKCE();
|
|
17
|
+
const state = randomBytes(16).toString("hex");
|
|
18
|
+
// Build query string manually to preserve %20 encoding (OpenAI requires this)
|
|
19
|
+
const paramEntries = {
|
|
20
|
+
response_type: "code",
|
|
21
|
+
client_id: CLIENT_ID,
|
|
22
|
+
redirect_uri: REDIRECT_URI,
|
|
23
|
+
scope: SCOPES,
|
|
24
|
+
code_challenge: challenge,
|
|
25
|
+
code_challenge_method: "S256",
|
|
26
|
+
id_token_add_organizations: "true",
|
|
27
|
+
codex_cli_simplified_flow: "true",
|
|
28
|
+
originator: "codex_cli_rs",
|
|
29
|
+
state,
|
|
30
|
+
};
|
|
31
|
+
const query = Object.entries(paramEntries)
|
|
32
|
+
.map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
|
|
33
|
+
.join("&");
|
|
34
|
+
return { url: `${AUTH_URL}?${query}`, state, verifier };
|
|
35
|
+
}
|
|
36
|
+
export async function exchangeCode(code, verifier) {
|
|
37
|
+
const res = await fetch(TOKEN_URL, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
40
|
+
body: new URLSearchParams({
|
|
41
|
+
grant_type: "authorization_code",
|
|
42
|
+
code,
|
|
43
|
+
redirect_uri: REDIRECT_URI,
|
|
44
|
+
client_id: CLIENT_ID,
|
|
45
|
+
code_verifier: verifier,
|
|
46
|
+
}).toString(),
|
|
47
|
+
signal: AbortSignal.timeout(30_000),
|
|
48
|
+
});
|
|
49
|
+
if (!res.ok) {
|
|
50
|
+
const err = await res.text();
|
|
51
|
+
throw new Error(`OpenAI token exchange failed (${res.status}): ${err}`);
|
|
52
|
+
}
|
|
53
|
+
const data = await res.json();
|
|
54
|
+
return {
|
|
55
|
+
accessToken: data.access_token,
|
|
56
|
+
refreshToken: data.refresh_token,
|
|
57
|
+
expiresIn: data.expires_in,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export async function refreshOpenAIAccessToken(refreshToken) {
|
|
61
|
+
const res = await fetch(TOKEN_URL, {
|
|
62
|
+
method: "POST",
|
|
63
|
+
headers: { "content-type": "application/x-www-form-urlencoded" },
|
|
64
|
+
body: new URLSearchParams({
|
|
65
|
+
grant_type: "refresh_token",
|
|
66
|
+
refresh_token: refreshToken,
|
|
67
|
+
client_id: CLIENT_ID,
|
|
68
|
+
}).toString(),
|
|
69
|
+
signal: AbortSignal.timeout(30_000),
|
|
70
|
+
});
|
|
71
|
+
if (!res.ok) {
|
|
72
|
+
const err = await res.text();
|
|
73
|
+
throw new Error(`OpenAI token refresh failed (${res.status}): ${err}`);
|
|
74
|
+
}
|
|
75
|
+
const data = await res.json();
|
|
76
|
+
return {
|
|
77
|
+
accessToken: data.access_token,
|
|
78
|
+
refreshToken: data.refresh_token ?? refreshToken,
|
|
79
|
+
expiresIn: data.expires_in,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Opens a one-shot HTTP server on port 1455 to receive the OAuth callback.
|
|
83
|
+
// Resolves with the authorization code when received (or rejects on error/timeout).
|
|
84
|
+
export function waitForCallback(expectedState) {
|
|
85
|
+
return new Promise((resolve, reject) => {
|
|
86
|
+
const server = createServer((req, res) => {
|
|
87
|
+
const url = new URL(req.url ?? "/", `http://localhost:${CALLBACK_PORT}`);
|
|
88
|
+
if (url.pathname !== "/auth/callback") {
|
|
89
|
+
res.writeHead(404);
|
|
90
|
+
res.end();
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const error = url.searchParams.get("error");
|
|
94
|
+
if (error) {
|
|
95
|
+
res.writeHead(200, { "content-type": "text/html" });
|
|
96
|
+
res.end(successPage(`Login failed: ${error}`, true));
|
|
97
|
+
server.close();
|
|
98
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const state = url.searchParams.get("state");
|
|
102
|
+
const code = url.searchParams.get("code");
|
|
103
|
+
if (state !== expectedState || !code) {
|
|
104
|
+
res.writeHead(400);
|
|
105
|
+
res.end("Bad request");
|
|
106
|
+
server.close();
|
|
107
|
+
reject(new Error("Invalid OAuth callback"));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
res.writeHead(200, { "content-type": "text/html" });
|
|
111
|
+
res.end(successPage("ChatGPT connected! You can close this tab.", false));
|
|
112
|
+
server.close();
|
|
113
|
+
resolve(code);
|
|
114
|
+
});
|
|
115
|
+
server.on("error", reject);
|
|
116
|
+
server.listen(CALLBACK_PORT, "127.0.0.1");
|
|
117
|
+
// 5-minute timeout
|
|
118
|
+
setTimeout(() => {
|
|
119
|
+
server.close();
|
|
120
|
+
reject(new Error("OAuth login timed out after 5 minutes"));
|
|
121
|
+
}, 5 * 60 * 1000);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function openBrowser(url) {
|
|
125
|
+
try {
|
|
126
|
+
if (process.platform === "darwin")
|
|
127
|
+
execSync(`open "${url}"`);
|
|
128
|
+
else if (process.platform === "win32")
|
|
129
|
+
execSync(`start "" "${url}"`, { windowsHide: true });
|
|
130
|
+
else
|
|
131
|
+
execSync(`xdg-open "${url}"`);
|
|
132
|
+
}
|
|
133
|
+
catch { /* ignore */ }
|
|
134
|
+
}
|
|
135
|
+
// Full OAuth flow: opens browser and waits for callback. Returns tokens.
|
|
136
|
+
export async function runOAuthFlow() {
|
|
137
|
+
const { url, state, verifier } = buildAuthUrl();
|
|
138
|
+
openBrowser(url);
|
|
139
|
+
const code = await waitForCallback(state);
|
|
140
|
+
return exchangeCode(code, verifier);
|
|
141
|
+
}
|
|
142
|
+
function successPage(msg, isError) {
|
|
143
|
+
return `<!DOCTYPE html><html><head><meta charset="UTF-8">
|
|
144
|
+
<style>body{font-family:-apple-system,sans-serif;display:flex;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#0d0d12;color:#e2e2f0}
|
|
145
|
+
.box{text-align:center;padding:40px;border-radius:16px;background:#16161e;border:1px solid ${isError ? "#ef4444" : "#22c55e"}33}
|
|
146
|
+
h2{color:${isError ? "#ef4444" : "#22c55e"};margin-bottom:8px}p{color:#6b6b8a}</style></head>
|
|
147
|
+
<body><div class="box"><h2>${isError ? "Error:" : "Success:"} ${msg}</h2><p>Return to the rcodex Gateway tab.</p></div></body></html>`;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=openai-oauth-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-oauth-flow.js","sourceRoot":"","sources":["../../../src/gateway/providers/openai-oauth-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ProviderAuth } from "../auth.js";
|
|
2
|
+
import type { Message } from "./anthropic.js";
|
|
3
|
+
export declare function isOpenAIModel(model: string): boolean;
|
|
4
|
+
export declare function callCodexAPI(token: string, body: Record<string, unknown>, signal?: AbortSignal): Promise<Response>;
|
|
5
|
+
export declare function callOpenAI(auth: ProviderAuth, model: string, messages: Message[], systemPrompt: string | undefined, stream: boolean, signal?: AbortSignal): Promise<Response>;
|
|
6
|
+
export declare function callOpenAIAndParse(auth: ProviderAuth, model: string, messages: Message[], systemPrompt: string | undefined, signal?: AbortSignal): Promise<import("../proxy.js").ResponsesResponse>;
|
|
7
|
+
export declare function getOpenAIModels(auth: ProviderAuth): Promise<string[]>;
|
|
8
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/gateway/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAe9C,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAQpD;AAID,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,QAAQ,CAAC,CAYnB;AA0HD,wBAAsB,UAAU,CAC9B,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,GACnB,OAAO,CAAC,QAAQ,CAAC,CAWnB;AAGD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,OAAO,aAAa,EAAE,iBAAiB,CAAC,CAWlD;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuB3E"}
|