opencode-openai-profiles 0.1.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 +150 -0
- package/dist/auth-store.d.ts +21 -0
- package/dist/auth-store.js +270 -0
- package/dist/auth-store.js.map +1 -0
- package/dist/codex-oauth.d.ts +9 -0
- package/dist/codex-oauth.js +126 -0
- package/dist/codex-oauth.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +573 -0
- package/dist/index.js.map +1 -0
- package/dist/openai-auth-method.d.ts +9 -0
- package/dist/openai-auth-method.js +31 -0
- package/dist/openai-auth-method.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.js +20 -0
- package/dist/paths.js.map +1 -0
- package/dist/profile-name.d.ts +1 -0
- package/dist/profile-name.js +12 -0
- package/dist/profile-name.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -0
- package/dist/tui.d.ts +5 -0
- package/dist/tui.js +7 -0
- package/dist/tui.js.map +1 -0
- package/package.json +52 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { authFileExists, getActiveOpenAIProfile, listOpenAIProfiles, openProfilesFolder, renameOpenAIProfile, saveActiveOpenAIProfile, saveActiveOpenAIProfileIfUnsaved, setActiveOpenAIProfile, switchActiveOpenAIProfile, } from "./auth-store.js";
|
|
3
|
+
import { completeManualCodexLogin, createManualCodexLogin, } from "./codex-oauth.js";
|
|
4
|
+
import { findOpenAIAuthMethodIndex, OPENAI_HEADLESS_LOGIN_METHOD_LABEL, parseOpenAIAuthMethodPreference, } from "./openai-auth-method.js";
|
|
5
|
+
import { getOpenCodeAuthPaths, OPENAI_PROVIDER_ID } from "./paths.js";
|
|
6
|
+
const PLUGIN_ID = "opencode-openai-profiles";
|
|
7
|
+
const TUI_COMMAND_NAME = "openai-profiles.open";
|
|
8
|
+
const COMMAND_NAME = "openai-profiles";
|
|
9
|
+
const COMMAND_ALIAS = "oa";
|
|
10
|
+
const FALLBACK_COMMAND_NAME = "openai-account-cli";
|
|
11
|
+
const RESTART_MESSAGE = "Restart opencode for the change to take effect.";
|
|
12
|
+
const OPENAI_ACCOUNT_TOAST_TITLE = "OpenAI Account";
|
|
13
|
+
export const id = PLUGIN_ID;
|
|
14
|
+
export const OpenAIAccountSwitcherPlugin = async (ctx) => {
|
|
15
|
+
return {
|
|
16
|
+
"command.execute.before": async (input, output) => {
|
|
17
|
+
if (input.command !== FALLBACK_COMMAND_NAME) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const message = await handleServerCommand(ctx, input.arguments);
|
|
21
|
+
output.parts.splice(0, output.parts.length, {
|
|
22
|
+
type: "text",
|
|
23
|
+
text: `OpenAI account command handled locally. Report this result to the user exactly: ${message}`,
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export default OpenAIAccountSwitcherPlugin;
|
|
29
|
+
export const tui = async (inputApi) => {
|
|
30
|
+
if (!isTuiPluginApi(inputApi)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const api = inputApi;
|
|
34
|
+
const paths = getOpenCodeAuthPaths();
|
|
35
|
+
function showToast(variant, message, title = OPENAI_ACCOUNT_TOAST_TITLE) {
|
|
36
|
+
api.ui.toast({
|
|
37
|
+
variant,
|
|
38
|
+
title,
|
|
39
|
+
message,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function showError(error) {
|
|
43
|
+
showToast("error", error instanceof Error ? error.message : "Unknown error");
|
|
44
|
+
}
|
|
45
|
+
async function applyActiveOpenAIProfile(profile) {
|
|
46
|
+
if (!api.client.auth) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const authSetResult = await api.client.auth.set({
|
|
50
|
+
providerID: OPENAI_PROVIDER_ID,
|
|
51
|
+
auth: profile,
|
|
52
|
+
});
|
|
53
|
+
return !authSetResult.error && authSetResult.data === true;
|
|
54
|
+
}
|
|
55
|
+
async function runSafely(action) {
|
|
56
|
+
try {
|
|
57
|
+
await action();
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
showError(error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function showMainDialog() {
|
|
64
|
+
const options = [
|
|
65
|
+
{
|
|
66
|
+
title: "Switch Profile",
|
|
67
|
+
value: "switch",
|
|
68
|
+
description: "Use saved profile",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
title: "Save Current Profile",
|
|
72
|
+
value: "save",
|
|
73
|
+
description: "Save active account",
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
title: "Rename Profile",
|
|
77
|
+
value: "rename",
|
|
78
|
+
description: "Edit profile name",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
title: "Login to OpenAI",
|
|
82
|
+
value: "login",
|
|
83
|
+
description: "Add another account",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
title: "Show Active Account",
|
|
87
|
+
value: "show-active",
|
|
88
|
+
description: "Current account ID",
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
title: "Open Profiles Folder",
|
|
92
|
+
value: "open-folder",
|
|
93
|
+
description: "Saved profile files",
|
|
94
|
+
},
|
|
95
|
+
];
|
|
96
|
+
api.ui.dialog.replace(() => api.ui.DialogSelect({
|
|
97
|
+
title: OPENAI_ACCOUNT_TOAST_TITLE,
|
|
98
|
+
options,
|
|
99
|
+
onSelect: (option) => {
|
|
100
|
+
api.ui.dialog.clear();
|
|
101
|
+
if (option.value === "switch") {
|
|
102
|
+
void runSafely(showSwitchProfileDialog);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
if (option.value === "save") {
|
|
106
|
+
void runSafely(showSaveProfileDialog);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (option.value === "rename") {
|
|
110
|
+
void runSafely(showRenameProfileDialog);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (option.value === "login") {
|
|
114
|
+
void runSafely(showLoginMethodDialog);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (option.value === "show-active") {
|
|
118
|
+
void runSafely(showActiveAccount);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
void runSafely(openProfileDirectory);
|
|
122
|
+
},
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
async function showSwitchProfileDialog() {
|
|
126
|
+
const savedProfiles = await listOpenAIProfiles(paths);
|
|
127
|
+
if (savedProfiles.length === 0) {
|
|
128
|
+
showToast("warning", "No saved OpenAI profiles found. Save the current profile first.");
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
api.ui.dialog.replace(() => api.ui.DialogSelect({
|
|
132
|
+
title: "Switch OpenAI Profile",
|
|
133
|
+
options: savedProfiles.map((profile) => ({
|
|
134
|
+
title: profile.name,
|
|
135
|
+
value: profile,
|
|
136
|
+
description: formatTuiAccountIdDescription(profile.accountId),
|
|
137
|
+
})),
|
|
138
|
+
onSelect: (option) => {
|
|
139
|
+
api.ui.dialog.clear();
|
|
140
|
+
void runSafely(async () => {
|
|
141
|
+
const switchedProfile = await switchActiveOpenAIProfile(paths, option.value.name);
|
|
142
|
+
const activeProfile = await getActiveOpenAIProfile(paths);
|
|
143
|
+
const didApplyActiveProfile = await applyActiveOpenAIProfile(activeProfile);
|
|
144
|
+
const message = didApplyActiveProfile ? "" : ` ${RESTART_MESSAGE}`;
|
|
145
|
+
showToast("success", `Switched to ${switchedProfile.name}.${message}`);
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
async function showSaveProfileDialog() {
|
|
151
|
+
const placeholder = await getNextProfileNamePlaceholder();
|
|
152
|
+
api.ui.dialog.replace(() => api.ui.DialogPrompt({
|
|
153
|
+
title: "Save Current OpenAI Profile",
|
|
154
|
+
placeholder,
|
|
155
|
+
onConfirm: (profileName) => {
|
|
156
|
+
api.ui.dialog.clear();
|
|
157
|
+
void runSafely(async () => {
|
|
158
|
+
const savedProfile = await saveActiveOpenAIProfile(paths, profileName);
|
|
159
|
+
showToast("success", `Saved ${savedProfile.name}.`);
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
onCancel: () => {
|
|
163
|
+
api.ui.dialog.clear();
|
|
164
|
+
},
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
async function showRenameProfileDialog() {
|
|
168
|
+
const savedProfiles = await listOpenAIProfiles(paths);
|
|
169
|
+
if (savedProfiles.length === 0) {
|
|
170
|
+
showToast("warning", "No saved OpenAI profiles found.");
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
api.ui.dialog.replace(() => api.ui.DialogSelect({
|
|
174
|
+
title: "Rename OpenAI Profile",
|
|
175
|
+
options: savedProfiles.map((profile) => ({
|
|
176
|
+
title: profile.name,
|
|
177
|
+
value: profile,
|
|
178
|
+
description: formatTuiAccountIdDescription(profile.accountId),
|
|
179
|
+
})),
|
|
180
|
+
onSelect: (option) => {
|
|
181
|
+
showRenameProfilePrompt(option.value);
|
|
182
|
+
},
|
|
183
|
+
}));
|
|
184
|
+
}
|
|
185
|
+
function showRenameProfilePrompt(profile) {
|
|
186
|
+
api.ui.dialog.replace(() => api.ui.DialogPrompt({
|
|
187
|
+
title: `Rename ${profile.name}`,
|
|
188
|
+
placeholder: profile.name,
|
|
189
|
+
onConfirm: (nextName) => {
|
|
190
|
+
api.ui.dialog.clear();
|
|
191
|
+
void runSafely(async () => {
|
|
192
|
+
const renamedProfile = await renameOpenAIProfile(paths, profile.name, nextName);
|
|
193
|
+
showToast("success", `Renamed ${profile.name} to ${renamedProfile.name}.`);
|
|
194
|
+
});
|
|
195
|
+
},
|
|
196
|
+
onCancel: () => {
|
|
197
|
+
api.ui.dialog.clear();
|
|
198
|
+
},
|
|
199
|
+
}));
|
|
200
|
+
}
|
|
201
|
+
async function getNextProfileNamePlaceholder() {
|
|
202
|
+
const savedProfiles = await listOpenAIProfiles(paths);
|
|
203
|
+
const usedProfileNames = new Set(savedProfiles.map((profile) => profile.name));
|
|
204
|
+
let nextProfileIndex = 1;
|
|
205
|
+
while (usedProfileNames.has(`account-${nextProfileIndex}`)) {
|
|
206
|
+
nextProfileIndex += 1;
|
|
207
|
+
}
|
|
208
|
+
return `account-${nextProfileIndex}`;
|
|
209
|
+
}
|
|
210
|
+
async function showActiveAccount() {
|
|
211
|
+
if (!(await authFileExists(paths))) {
|
|
212
|
+
showToast("warning", "No opencode auth.json found. Log in to OpenAI first.");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const activeProfile = await getActiveOpenAIProfile(paths);
|
|
216
|
+
const savedProfileDescription = await getSavedProfileDescription(paths, activeProfile.accountId);
|
|
217
|
+
showToast("info", `${savedProfileDescription}\n${formatAccountIdDescription(activeProfile.accountId)}`);
|
|
218
|
+
}
|
|
219
|
+
async function showLoginMethodDialog() {
|
|
220
|
+
await saveCurrentProfileBeforeLogin();
|
|
221
|
+
const authMethodsResult = await api.client.provider.auth({
|
|
222
|
+
directory: api.state.path.directory,
|
|
223
|
+
});
|
|
224
|
+
if (authMethodsResult.error || !authMethodsResult.data) {
|
|
225
|
+
throw new Error("Unable to load OpenAI login methods");
|
|
226
|
+
}
|
|
227
|
+
const openAIAuthMethods = authMethodsResult.data[OPENAI_PROVIDER_ID] ?? [];
|
|
228
|
+
if (openAIAuthMethods.length === 0) {
|
|
229
|
+
throw new Error("No OpenAI login methods found");
|
|
230
|
+
}
|
|
231
|
+
api.ui.dialog.replace(() => api.ui.DialogSelect({
|
|
232
|
+
title: "OpenAI Login Method",
|
|
233
|
+
options: openAIAuthMethods.map((method, index) => {
|
|
234
|
+
const option = {
|
|
235
|
+
title: method.label,
|
|
236
|
+
value: { index, label: method.label },
|
|
237
|
+
};
|
|
238
|
+
if (method.label === OPENAI_HEADLESS_LOGIN_METHOD_LABEL) {
|
|
239
|
+
option.description = "For account mixups";
|
|
240
|
+
}
|
|
241
|
+
return option;
|
|
242
|
+
}),
|
|
243
|
+
onSelect: (option) => {
|
|
244
|
+
api.ui.dialog.clear();
|
|
245
|
+
void runSafely(async () => startOpenAILogin(option.value));
|
|
246
|
+
},
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
async function saveCurrentProfileBeforeLogin() {
|
|
250
|
+
const savedProfile = await saveActiveOpenAIProfileIfUnsaved(paths);
|
|
251
|
+
if (savedProfile) {
|
|
252
|
+
showToast("success", `Saved current profile as ${savedProfile.name} before login.`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
async function startOpenAILogin(method) {
|
|
256
|
+
if (method.label === OPENAI_HEADLESS_LOGIN_METHOD_LABEL) {
|
|
257
|
+
const login = await createManualCodexLogin();
|
|
258
|
+
showManualCallbackLoginDialog(login);
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
const authorizationResult = await api.client.provider.oauth.authorize({
|
|
262
|
+
providerID: OPENAI_PROVIDER_ID,
|
|
263
|
+
directory: api.state.path.directory,
|
|
264
|
+
method: method.index,
|
|
265
|
+
});
|
|
266
|
+
if (authorizationResult.error || !authorizationResult.data) {
|
|
267
|
+
throw new Error("Unable to start OpenAI login");
|
|
268
|
+
}
|
|
269
|
+
if (authorizationResult.data.method === "code" ||
|
|
270
|
+
method.label === OPENAI_HEADLESS_LOGIN_METHOD_LABEL) {
|
|
271
|
+
showHeadlessLoginInstructions(method.label, authorizationResult.data);
|
|
272
|
+
void runSafely(async () => completeOpenAILogin(method.index));
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
openPathOrUrl(authorizationResult.data.url);
|
|
276
|
+
showToast("info", "Opened OpenAI login. Keep opencode open until login completes.");
|
|
277
|
+
void runSafely(async () => completeOpenAILogin(method.index));
|
|
278
|
+
}
|
|
279
|
+
function showManualCallbackLoginDialog(login) {
|
|
280
|
+
api.ui.dialog.replace(() => api.ui.DialogAlert({
|
|
281
|
+
title: "Headless OpenAI Login",
|
|
282
|
+
message: `Open this URL in the browser account you want to save:\n\n${login.url}\n\nAfter ChatGPT redirects to localhost, copy the full URL from the browser address bar and press OK.`,
|
|
283
|
+
onConfirm: () => showManualCallbackPrompt(login),
|
|
284
|
+
}));
|
|
285
|
+
}
|
|
286
|
+
function showManualCallbackPrompt(login) {
|
|
287
|
+
api.ui.dialog.replace(() => api.ui.DialogPrompt({
|
|
288
|
+
title: "Paste OpenAI Callback URL",
|
|
289
|
+
placeholder: "http://localhost:1455/auth/callback?code=...",
|
|
290
|
+
onConfirm: (callbackUrlOrCode) => {
|
|
291
|
+
api.ui.dialog.clear();
|
|
292
|
+
void runSafely(async () => {
|
|
293
|
+
const activeProfile = await completeManualCodexLogin(login, callbackUrlOrCode);
|
|
294
|
+
await setActiveOpenAIProfile(paths, activeProfile);
|
|
295
|
+
showToast("success", "OpenAI login complete.");
|
|
296
|
+
await showSaveProfileDialog();
|
|
297
|
+
});
|
|
298
|
+
},
|
|
299
|
+
onCancel: () => {
|
|
300
|
+
api.ui.dialog.clear();
|
|
301
|
+
},
|
|
302
|
+
}));
|
|
303
|
+
}
|
|
304
|
+
async function completeOpenAILogin(methodIndex) {
|
|
305
|
+
const callbackResult = await api.client.provider.oauth.callback({
|
|
306
|
+
providerID: OPENAI_PROVIDER_ID,
|
|
307
|
+
method: methodIndex,
|
|
308
|
+
});
|
|
309
|
+
if (callbackResult.error) {
|
|
310
|
+
throw new Error("OpenAI login did not complete");
|
|
311
|
+
}
|
|
312
|
+
showToast("success", "OpenAI login complete.");
|
|
313
|
+
await showSaveProfileDialog();
|
|
314
|
+
}
|
|
315
|
+
function showHeadlessLoginInstructions(methodLabel, authorization) {
|
|
316
|
+
api.ui.dialog.replace(() => api.ui.DialogAlert({
|
|
317
|
+
title: methodLabel,
|
|
318
|
+
message: `${authorization.url}\n\n${authorization.instructions}\n\nWaiting for authorization...\n\nKeep opencode open until login completes. You will be prompted to save the profile.`,
|
|
319
|
+
}));
|
|
320
|
+
}
|
|
321
|
+
async function openProfileDirectory() {
|
|
322
|
+
await openProfilesFolder(paths);
|
|
323
|
+
openPathOrUrl(paths.profileDirectoryPath);
|
|
324
|
+
showToast("info", paths.profileDirectoryPath);
|
|
325
|
+
}
|
|
326
|
+
const unregisterCallbacks = [];
|
|
327
|
+
const commandLayer = {
|
|
328
|
+
commands: [
|
|
329
|
+
{
|
|
330
|
+
name: TUI_COMMAND_NAME,
|
|
331
|
+
title: OPENAI_ACCOUNT_TOAST_TITLE,
|
|
332
|
+
desc: "Switch saved OpenAI ChatGPT account profiles",
|
|
333
|
+
description: "Switch saved OpenAI ChatGPT account profiles",
|
|
334
|
+
category: "OpenAI",
|
|
335
|
+
namespace: "palette",
|
|
336
|
+
slashName: COMMAND_NAME,
|
|
337
|
+
slashAliases: [COMMAND_ALIAS],
|
|
338
|
+
slash: {
|
|
339
|
+
name: COMMAND_NAME,
|
|
340
|
+
aliases: [COMMAND_ALIAS],
|
|
341
|
+
},
|
|
342
|
+
run: showMainDialog,
|
|
343
|
+
},
|
|
344
|
+
],
|
|
345
|
+
};
|
|
346
|
+
const unregisterCommandLayer = api.keymap?.registerLayer?.(commandLayer);
|
|
347
|
+
if (unregisterCommandLayer) {
|
|
348
|
+
unregisterCallbacks.push(unregisterCommandLayer);
|
|
349
|
+
}
|
|
350
|
+
const unregisterLegacyCommand = api.command?.register(() => [
|
|
351
|
+
{
|
|
352
|
+
title: OPENAI_ACCOUNT_TOAST_TITLE,
|
|
353
|
+
value: TUI_COMMAND_NAME,
|
|
354
|
+
description: "Switch saved OpenAI ChatGPT account profiles",
|
|
355
|
+
category: "OpenAI",
|
|
356
|
+
slash: {
|
|
357
|
+
name: COMMAND_NAME,
|
|
358
|
+
aliases: [COMMAND_ALIAS],
|
|
359
|
+
},
|
|
360
|
+
onSelect: showMainDialog,
|
|
361
|
+
},
|
|
362
|
+
]);
|
|
363
|
+
if (unregisterLegacyCommand) {
|
|
364
|
+
unregisterCallbacks.push(unregisterLegacyCommand);
|
|
365
|
+
}
|
|
366
|
+
api.lifecycle.onDispose(() => {
|
|
367
|
+
for (const unregisterCallback of unregisterCallbacks) {
|
|
368
|
+
unregisterCallback();
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
};
|
|
372
|
+
function isTuiPluginApi(api) {
|
|
373
|
+
return "ui" in api && "lifecycle" in api;
|
|
374
|
+
}
|
|
375
|
+
const _typecheckTuiPlugin = tui;
|
|
376
|
+
void _typecheckTuiPlugin;
|
|
377
|
+
function formatAccountIdDescription(accountId) {
|
|
378
|
+
return accountId ? `Account ID: ${accountId}` : "Account ID unavailable";
|
|
379
|
+
}
|
|
380
|
+
function formatTuiAccountIdDescription(accountId) {
|
|
381
|
+
if (!accountId) {
|
|
382
|
+
return "ID unavailable";
|
|
383
|
+
}
|
|
384
|
+
if (accountId.length <= 18) {
|
|
385
|
+
return `ID: ${accountId}`;
|
|
386
|
+
}
|
|
387
|
+
return `ID: ${accountId.slice(0, 8)}...${accountId.slice(-6)}`;
|
|
388
|
+
}
|
|
389
|
+
async function getSavedProfileDescription(paths, accountId) {
|
|
390
|
+
const matchingProfileNames = await getMatchingSavedProfileNames(paths, accountId);
|
|
391
|
+
return formatSavedProfileDescription(matchingProfileNames);
|
|
392
|
+
}
|
|
393
|
+
async function getMatchingSavedProfileNames(paths, accountId) {
|
|
394
|
+
if (!accountId) {
|
|
395
|
+
return [];
|
|
396
|
+
}
|
|
397
|
+
const savedProfiles = await listOpenAIProfiles(paths);
|
|
398
|
+
return savedProfiles
|
|
399
|
+
.filter((profile) => profile.accountId === accountId)
|
|
400
|
+
.map((profile) => profile.name);
|
|
401
|
+
}
|
|
402
|
+
function formatSavedProfileDescription(profileNames) {
|
|
403
|
+
if (profileNames.length === 0) {
|
|
404
|
+
return "Saved profile: unsaved";
|
|
405
|
+
}
|
|
406
|
+
if (profileNames.length === 1) {
|
|
407
|
+
return `Saved profile: ${profileNames[0]}`;
|
|
408
|
+
}
|
|
409
|
+
return `Saved profiles: ${profileNames.join(", ")}`;
|
|
410
|
+
}
|
|
411
|
+
async function handleServerCommand(ctx, rawArguments) {
|
|
412
|
+
const paths = getOpenCodeAuthPaths();
|
|
413
|
+
const [action, ...actionArguments] = rawArguments
|
|
414
|
+
.trim()
|
|
415
|
+
.split(/\s+/)
|
|
416
|
+
.filter((argument) => argument.length > 0);
|
|
417
|
+
const argument = actionArguments[0];
|
|
418
|
+
try {
|
|
419
|
+
if (!action || action === "help") {
|
|
420
|
+
const message = `Usage: /${FALLBACK_COMMAND_NAME} save <name> | switch <name> | rename <old> <new> | list | active | login [browser|headless]`;
|
|
421
|
+
await showServerToast(ctx, "info", message);
|
|
422
|
+
return message;
|
|
423
|
+
}
|
|
424
|
+
if (action === "save") {
|
|
425
|
+
if (!argument) {
|
|
426
|
+
throw new Error(`Usage: /${FALLBACK_COMMAND_NAME} save <name>`);
|
|
427
|
+
}
|
|
428
|
+
const savedProfile = await saveActiveOpenAIProfile(paths, argument);
|
|
429
|
+
const message = `Saved ${savedProfile.name}.`;
|
|
430
|
+
await showServerToast(ctx, "success", message);
|
|
431
|
+
return message;
|
|
432
|
+
}
|
|
433
|
+
if (action === "switch") {
|
|
434
|
+
if (!argument) {
|
|
435
|
+
throw new Error(`Usage: /${FALLBACK_COMMAND_NAME} switch <name>`);
|
|
436
|
+
}
|
|
437
|
+
const client = ctx.client;
|
|
438
|
+
const switchedProfile = await switchActiveOpenAIProfile(paths, argument);
|
|
439
|
+
const activeProfile = await getActiveOpenAIProfile(paths);
|
|
440
|
+
const didApplyActiveProfile = await applyServerActiveOpenAIProfile(client, activeProfile);
|
|
441
|
+
const switchMessage = didApplyActiveProfile ? "" : ` ${RESTART_MESSAGE}`;
|
|
442
|
+
const message = `Switched to ${switchedProfile.name}.${switchMessage}`;
|
|
443
|
+
await showServerToast(ctx, "success", message);
|
|
444
|
+
return message;
|
|
445
|
+
}
|
|
446
|
+
if (action === "rename") {
|
|
447
|
+
const [currentName, nextName] = actionArguments;
|
|
448
|
+
if (!currentName || !nextName) {
|
|
449
|
+
throw new Error(`Usage: /${FALLBACK_COMMAND_NAME} rename <old> <new>`);
|
|
450
|
+
}
|
|
451
|
+
const renamedProfile = await renameOpenAIProfile(paths, currentName, nextName);
|
|
452
|
+
const message = `Renamed ${currentName} to ${renamedProfile.name}.`;
|
|
453
|
+
await showServerToast(ctx, "success", message);
|
|
454
|
+
return message;
|
|
455
|
+
}
|
|
456
|
+
if (action === "list") {
|
|
457
|
+
const profiles = await listOpenAIProfiles(paths);
|
|
458
|
+
const profileNames = profiles.map((profile) => profile.name).join(", ") || "none";
|
|
459
|
+
const message = `Saved profiles: ${profileNames}`;
|
|
460
|
+
await showServerToast(ctx, "info", message);
|
|
461
|
+
return message;
|
|
462
|
+
}
|
|
463
|
+
if (action === "active") {
|
|
464
|
+
const activeProfile = await getActiveOpenAIProfile(paths);
|
|
465
|
+
const savedProfileDescription = await getSavedProfileDescription(paths, activeProfile.accountId);
|
|
466
|
+
const message = `${savedProfileDescription}\n${formatAccountIdDescription(activeProfile.accountId)}`;
|
|
467
|
+
await showServerToast(ctx, "info", message);
|
|
468
|
+
return message;
|
|
469
|
+
}
|
|
470
|
+
if (action === "login") {
|
|
471
|
+
return await startServerOpenAILogin(ctx, argument);
|
|
472
|
+
}
|
|
473
|
+
throw new Error(`Unknown action: ${action}`);
|
|
474
|
+
}
|
|
475
|
+
catch (error) {
|
|
476
|
+
const message = error instanceof Error ? error.message : "Unknown error";
|
|
477
|
+
await showServerToast(ctx, "error", message);
|
|
478
|
+
return message;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
async function startServerOpenAILogin(ctx, methodPreference) {
|
|
482
|
+
const client = ctx.client;
|
|
483
|
+
const parsedMethodPreference = parseOpenAIAuthMethodPreference(methodPreference);
|
|
484
|
+
const savedProfile = await saveActiveOpenAIProfileIfUnsaved(getOpenCodeAuthPaths());
|
|
485
|
+
const authMethodsResult = await client.provider.auth({
|
|
486
|
+
directory: ctx.directory,
|
|
487
|
+
});
|
|
488
|
+
if (authMethodsResult.error || !authMethodsResult.data) {
|
|
489
|
+
throw new Error("Unable to load OpenAI login methods");
|
|
490
|
+
}
|
|
491
|
+
const openAIAuthMethods = authMethodsResult.data[OPENAI_PROVIDER_ID] ?? [];
|
|
492
|
+
const methodIndex = findOpenAIAuthMethodIndex(openAIAuthMethods, parsedMethodPreference);
|
|
493
|
+
if (methodIndex === undefined) {
|
|
494
|
+
const availableMethods = openAIAuthMethods.map((method) => method.label).join(", ") || "none";
|
|
495
|
+
throw new Error(`OpenAI login method not found. Available: ${availableMethods}`);
|
|
496
|
+
}
|
|
497
|
+
const authorizationResult = await client.provider.oauth.authorize({
|
|
498
|
+
providerID: OPENAI_PROVIDER_ID,
|
|
499
|
+
directory: ctx.directory,
|
|
500
|
+
method: methodIndex,
|
|
501
|
+
});
|
|
502
|
+
if (authorizationResult.error || !authorizationResult.data) {
|
|
503
|
+
throw new Error("Unable to start OpenAI login");
|
|
504
|
+
}
|
|
505
|
+
const shouldOpenLoginUrl = authorizationResult.data.method !== "code" &&
|
|
506
|
+
openAIAuthMethods[methodIndex]?.label !==
|
|
507
|
+
OPENAI_HEADLESS_LOGIN_METHOD_LABEL;
|
|
508
|
+
if (shouldOpenLoginUrl) {
|
|
509
|
+
openPathOrUrl(authorizationResult.data.url);
|
|
510
|
+
}
|
|
511
|
+
const loginMessage = shouldOpenLoginUrl
|
|
512
|
+
? `Opened OpenAI login. After login completes, run /${FALLBACK_COMMAND_NAME} save <name>.`
|
|
513
|
+
: `${authorizationResult.data.url} ${authorizationResult.data.instructions} Waiting for authorization. After login completes, restart opencode and run /${FALLBACK_COMMAND_NAME} save <name>.`;
|
|
514
|
+
const message = savedProfile
|
|
515
|
+
? `Saved current profile as ${savedProfile.name} before login. ${loginMessage}`
|
|
516
|
+
: loginMessage;
|
|
517
|
+
await showServerToast(ctx, "info", message);
|
|
518
|
+
return message;
|
|
519
|
+
}
|
|
520
|
+
async function applyServerActiveOpenAIProfile(client, profile) {
|
|
521
|
+
if (!client.auth) {
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
const authSetResult = await client.auth.set({
|
|
525
|
+
providerID: OPENAI_PROVIDER_ID,
|
|
526
|
+
auth: profile,
|
|
527
|
+
});
|
|
528
|
+
return !authSetResult.error && authSetResult.data === true;
|
|
529
|
+
}
|
|
530
|
+
async function showServerToast(ctx, variant, message) {
|
|
531
|
+
const client = ctx.client;
|
|
532
|
+
if (client.tui) {
|
|
533
|
+
await client.tui.showToast({
|
|
534
|
+
directory: ctx.directory,
|
|
535
|
+
title: OPENAI_ACCOUNT_TOAST_TITLE,
|
|
536
|
+
message,
|
|
537
|
+
variant,
|
|
538
|
+
});
|
|
539
|
+
return;
|
|
540
|
+
}
|
|
541
|
+
await client.app.log({
|
|
542
|
+
level: variant === "error" ? "error" : "info",
|
|
543
|
+
message,
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
function openPathOrUrl(pathOrUrl) {
|
|
547
|
+
const command = getOpenCommand(pathOrUrl);
|
|
548
|
+
const childProcess = spawn(command.executable, command.args, {
|
|
549
|
+
detached: true,
|
|
550
|
+
stdio: "ignore",
|
|
551
|
+
});
|
|
552
|
+
childProcess.on("error", () => undefined);
|
|
553
|
+
childProcess.unref();
|
|
554
|
+
}
|
|
555
|
+
function getOpenCommand(pathOrUrl) {
|
|
556
|
+
if (process.platform === "darwin") {
|
|
557
|
+
return {
|
|
558
|
+
executable: "open",
|
|
559
|
+
args: [pathOrUrl],
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
if (process.platform === "win32") {
|
|
563
|
+
return {
|
|
564
|
+
executable: "explorer",
|
|
565
|
+
args: [pathOrUrl],
|
|
566
|
+
};
|
|
567
|
+
}
|
|
568
|
+
return {
|
|
569
|
+
executable: "xdg-open",
|
|
570
|
+
args: [pathOrUrl],
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ProviderAuthMethod } from "@opencode-ai/sdk/v2";
|
|
2
|
+
export declare const OPENAI_BROWSER_LOGIN_METHOD_LABEL = "ChatGPT Pro/Plus (browser)";
|
|
3
|
+
export declare const OPENAI_HEADLESS_LOGIN_METHOD_LABEL = "ChatGPT Pro/Plus (headless)";
|
|
4
|
+
declare const OPENAI_BROWSER_METHOD_PREFERENCE = "browser";
|
|
5
|
+
declare const OPENAI_HEADLESS_METHOD_PREFERENCE = "headless";
|
|
6
|
+
export type OpenAIAuthMethodPreference = typeof OPENAI_BROWSER_METHOD_PREFERENCE | typeof OPENAI_HEADLESS_METHOD_PREFERENCE;
|
|
7
|
+
export declare function parseOpenAIAuthMethodPreference(methodPreference: string | undefined): OpenAIAuthMethodPreference;
|
|
8
|
+
export declare function findOpenAIAuthMethodIndex(openAIAuthMethods: ProviderAuthMethod[], methodPreference: OpenAIAuthMethodPreference): number | undefined;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const OPENAI_BROWSER_LOGIN_METHOD_LABEL = "ChatGPT Pro/Plus (browser)";
|
|
2
|
+
export const OPENAI_HEADLESS_LOGIN_METHOD_LABEL = "ChatGPT Pro/Plus (headless)";
|
|
3
|
+
const OPENAI_BROWSER_METHOD_PREFERENCE = "browser";
|
|
4
|
+
const OPENAI_HEADLESS_METHOD_PREFERENCE = "headless";
|
|
5
|
+
const NOT_FOUND_INDEX = -1;
|
|
6
|
+
export function parseOpenAIAuthMethodPreference(methodPreference) {
|
|
7
|
+
const trimmedMethodPreference = methodPreference?.trim();
|
|
8
|
+
if (!trimmedMethodPreference ||
|
|
9
|
+
trimmedMethodPreference === OPENAI_BROWSER_METHOD_PREFERENCE) {
|
|
10
|
+
return OPENAI_BROWSER_METHOD_PREFERENCE;
|
|
11
|
+
}
|
|
12
|
+
if (trimmedMethodPreference === OPENAI_HEADLESS_METHOD_PREFERENCE) {
|
|
13
|
+
return OPENAI_HEADLESS_METHOD_PREFERENCE;
|
|
14
|
+
}
|
|
15
|
+
throw new Error("Use browser or headless for OpenAI login method");
|
|
16
|
+
}
|
|
17
|
+
export function findOpenAIAuthMethodIndex(openAIAuthMethods, methodPreference) {
|
|
18
|
+
const preferredMethodLabel = getOpenAIAuthMethodLabel(methodPreference);
|
|
19
|
+
const methodIndex = openAIAuthMethods.findIndex((method) => method.label === preferredMethodLabel);
|
|
20
|
+
if (methodIndex === NOT_FOUND_INDEX) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return methodIndex;
|
|
24
|
+
}
|
|
25
|
+
function getOpenAIAuthMethodLabel(methodPreference) {
|
|
26
|
+
if (methodPreference === OPENAI_HEADLESS_METHOD_PREFERENCE) {
|
|
27
|
+
return OPENAI_HEADLESS_LOGIN_METHOD_LABEL;
|
|
28
|
+
}
|
|
29
|
+
return OPENAI_BROWSER_LOGIN_METHOD_LABEL;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=openai-auth-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-auth-method.js","sourceRoot":"","sources":["../src/openai-auth-method.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iCAAiC,GAAG,4BAA4B,CAAC;AAC9E,MAAM,CAAC,MAAM,kCAAkC,GAAG,6BAA6B,CAAC;AAEhF,MAAM,gCAAgC,GAAG,SAAS,CAAC;AACnD,MAAM,iCAAiC,GAAG,UAAU,CAAC;AACrD,MAAM,eAAe,GAAG,CAAC,CAAC,CAAC;AAM3B,MAAM,UAAU,+BAA+B,CAC9C,gBAAoC;IAEpC,MAAM,uBAAuB,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC;IAEzD,IACC,CAAC,uBAAuB;QACxB,uBAAuB,KAAK,gCAAgC,EAC3D,CAAC;QACF,OAAO,gCAAgC,CAAC;IACzC,CAAC;IAED,IAAI,uBAAuB,KAAK,iCAAiC,EAAE,CAAC;QACnE,OAAO,iCAAiC,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,yBAAyB,CACxC,iBAAuC,EACvC,gBAA4C;IAE5C,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IACxE,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAC9C,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,oBAAoB,CACjD,CAAC;IAEF,IAAI,WAAW,KAAK,eAAe,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,SAAS,wBAAwB,CAChC,gBAA4C;IAE5C,IAAI,gBAAgB,KAAK,iCAAiC,EAAE,CAAC;QAC5D,OAAO,kCAAkC,CAAC;IAC3C,CAAC;IAED,OAAO,iCAAiC,CAAC;AAC1C,CAAC"}
|
package/dist/paths.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const OPENAI_PROVIDER_ID = "openai";
|
|
2
|
+
export declare const PROFILE_FILE_PREFIX = "openai-";
|
|
3
|
+
export declare const PROFILE_FILE_EXTENSION = ".json";
|
|
4
|
+
export type OpenCodeAuthPaths = {
|
|
5
|
+
authFilePath: string;
|
|
6
|
+
profileDirectoryPath: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function getOpenCodeAuthPaths(environment?: NodeJS.ProcessEnv): OpenCodeAuthPaths;
|
|
9
|
+
export declare function getProfileFileName(profileName: string): string;
|