opencode-openai-codex-auth-multi 4.3.0-multiaccount.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 +37 -0
- package/README.md +107 -0
- package/assets/opencode-logo-ornate-dark.svg +18 -0
- package/assets/readme-hero.svg +31 -0
- package/config/README.md +110 -0
- package/config/minimal-opencode.json +13 -0
- package/config/opencode-legacy.json +572 -0
- package/config/opencode-modern.json +240 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +666 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/accounts.d.ts +48 -0
- package/dist/lib/accounts.d.ts.map +1 -0
- package/dist/lib/accounts.js +282 -0
- package/dist/lib/accounts.js.map +1 -0
- package/dist/lib/auth/auth.d.ts +43 -0
- package/dist/lib/auth/auth.d.ts.map +1 -0
- package/dist/lib/auth/auth.js +163 -0
- package/dist/lib/auth/auth.js.map +1 -0
- package/dist/lib/auth/browser.d.ts +17 -0
- package/dist/lib/auth/browser.d.ts.map +1 -0
- package/dist/lib/auth/browser.js +76 -0
- package/dist/lib/auth/browser.js.map +1 -0
- package/dist/lib/auth/server.d.ts +10 -0
- package/dist/lib/auth/server.d.ts.map +1 -0
- package/dist/lib/auth/server.js +78 -0
- package/dist/lib/auth/server.js.map +1 -0
- package/dist/lib/cli.d.ts +8 -0
- package/dist/lib/cli.d.ts.map +1 -0
- package/dist/lib/cli.js +44 -0
- package/dist/lib/cli.js.map +1 -0
- package/dist/lib/config.d.ts +17 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +51 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +67 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +67 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/logger.d.ts +26 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +110 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/oauth-success.html +712 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
- package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
- package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
- package/dist/lib/prompts/codex.d.ts +27 -0
- package/dist/lib/prompts/codex.d.ts.map +1 -0
- package/dist/lib/prompts/codex.js +241 -0
- package/dist/lib/prompts/codex.js.map +1 -0
- package/dist/lib/prompts/opencode-codex.d.ts +21 -0
- package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-codex.js +91 -0
- package/dist/lib/prompts/opencode-codex.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +81 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +321 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/helpers/input-utils.d.ts +6 -0
- package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
- package/dist/lib/request/helpers/input-utils.js +174 -0
- package/dist/lib/request/helpers/input-utils.js.map +1 -0
- package/dist/lib/request/helpers/model-map.d.ts +28 -0
- package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
- package/dist/lib/request/helpers/model-map.js +109 -0
- package/dist/lib/request/helpers/model-map.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +93 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +403 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +14 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +90 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/storage.d.ts +23 -0
- package/dist/lib/storage.d.ts.map +1 -0
- package/dist/lib/storage.js +153 -0
- package/dist/lib/storage.js.map +1 -0
- package/dist/lib/types.d.ts +170 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +71 -0
- package/scripts/copy-oauth-success.js +37 -0
- package/scripts/install-opencode-codex-auth.js +193 -0
- package/scripts/test-all-models.sh +260 -0
- package/scripts/validate-model-map.sh +97 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { createLogger, logRequest, LOGGING_ENABLED } from "../logger.js";
|
|
2
|
+
const log = createLogger("response-handler");
|
|
3
|
+
/**
|
|
4
|
+
|
|
5
|
+
* Parse SSE stream to extract final response
|
|
6
|
+
* @param sseText - Complete SSE stream text
|
|
7
|
+
* @returns Final response object or null if not found
|
|
8
|
+
*/
|
|
9
|
+
function parseSseStream(sseText) {
|
|
10
|
+
const lines = sseText.split('\n');
|
|
11
|
+
for (const line of lines) {
|
|
12
|
+
if (line.startsWith('data: ')) {
|
|
13
|
+
try {
|
|
14
|
+
const data = JSON.parse(line.substring(6));
|
|
15
|
+
// Look for response.done event with final data
|
|
16
|
+
if (data.type === 'response.done' || data.type === 'response.completed') {
|
|
17
|
+
return data.response;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
catch (e) {
|
|
21
|
+
// Skip malformed JSON
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Convert SSE stream response to JSON for generateText()
|
|
29
|
+
* @param response - Fetch response with SSE stream
|
|
30
|
+
* @param headers - Response headers
|
|
31
|
+
* @returns Response with JSON body
|
|
32
|
+
*/
|
|
33
|
+
export async function convertSseToJson(response, headers) {
|
|
34
|
+
if (!response.body) {
|
|
35
|
+
throw new Error('[openai-codex-plugin] Response has no body');
|
|
36
|
+
}
|
|
37
|
+
const reader = response.body.getReader();
|
|
38
|
+
const decoder = new TextDecoder();
|
|
39
|
+
let fullText = '';
|
|
40
|
+
try {
|
|
41
|
+
// Consume the entire stream
|
|
42
|
+
while (true) {
|
|
43
|
+
const { done, value } = await reader.read();
|
|
44
|
+
if (done)
|
|
45
|
+
break;
|
|
46
|
+
fullText += decoder.decode(value, { stream: true });
|
|
47
|
+
}
|
|
48
|
+
if (LOGGING_ENABLED) {
|
|
49
|
+
logRequest("stream-full", { fullContent: fullText });
|
|
50
|
+
}
|
|
51
|
+
// Parse SSE events to extract the final response
|
|
52
|
+
const finalResponse = parseSseStream(fullText);
|
|
53
|
+
if (!finalResponse) {
|
|
54
|
+
log.warn("Could not find final response in SSE stream");
|
|
55
|
+
logRequest("stream-error", { error: "No response.done event found" });
|
|
56
|
+
// Return original stream if we can't parse
|
|
57
|
+
return new Response(fullText, {
|
|
58
|
+
status: response.status,
|
|
59
|
+
statusText: response.statusText,
|
|
60
|
+
headers: headers,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
// Return as plain JSON (not SSE)
|
|
64
|
+
const jsonHeaders = new Headers(headers);
|
|
65
|
+
jsonHeaders.set('content-type', 'application/json; charset=utf-8');
|
|
66
|
+
return new Response(JSON.stringify(finalResponse), {
|
|
67
|
+
status: response.status,
|
|
68
|
+
statusText: response.statusText,
|
|
69
|
+
headers: jsonHeaders,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
log.error("Error converting stream", { error: String(error) });
|
|
74
|
+
logRequest("stream-error", { error: String(error) });
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Ensure response has content-type header
|
|
80
|
+
* @param headers - Response headers
|
|
81
|
+
* @returns Headers with content-type set
|
|
82
|
+
*/
|
|
83
|
+
export function ensureContentType(headers) {
|
|
84
|
+
const responseHeaders = new Headers(headers);
|
|
85
|
+
if (!responseHeaders.has('content-type')) {
|
|
86
|
+
responseHeaders.set('content-type', 'text/event-stream; charset=utf-8');
|
|
87
|
+
}
|
|
88
|
+
return responseHeaders;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=response-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-handler.js","sourceRoot":"","sources":["../../../lib/request/response-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type CooldownReason = "auth-failure" | "network-error";
|
|
2
|
+
export interface AccountMetadataV1 {
|
|
3
|
+
accountId?: string;
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
addedAt: number;
|
|
6
|
+
lastUsed: number;
|
|
7
|
+
lastSwitchReason?: "rate-limit" | "initial" | "rotation";
|
|
8
|
+
rateLimitResetTime?: number;
|
|
9
|
+
coolingDownUntil?: number;
|
|
10
|
+
cooldownReason?: CooldownReason;
|
|
11
|
+
}
|
|
12
|
+
export interface AccountStorageV1 {
|
|
13
|
+
version: 1;
|
|
14
|
+
accounts: AccountMetadataV1[];
|
|
15
|
+
activeIndex: number;
|
|
16
|
+
}
|
|
17
|
+
export declare function getStoragePath(): string;
|
|
18
|
+
export declare function deduplicateAccounts(accounts: AccountMetadataV1[]): AccountMetadataV1[];
|
|
19
|
+
export declare function normalizeAccountStorage(data: unknown): AccountStorageV1 | null;
|
|
20
|
+
export declare function loadAccounts(): Promise<AccountStorageV1 | null>;
|
|
21
|
+
export declare function saveAccounts(storage: AccountStorageV1): Promise<void>;
|
|
22
|
+
export declare function clearAccounts(): Promise<void>;
|
|
23
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../lib/storage.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GAAG,cAAc,GAAG,eAAe,CAAC;AAE9D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,UAAU,CAAC;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAC;IACX,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAgBD,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,iBAAiB,EAAE,GAC5B,iBAAiB,EAAE,CAiCrB;AAiCD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI,CAoD9E;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAerE;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3E;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAUnD"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { createLogger } from "./logger.js";
|
|
5
|
+
const log = createLogger("storage");
|
|
6
|
+
function getConfigDir() {
|
|
7
|
+
return join(homedir(), ".opencode");
|
|
8
|
+
}
|
|
9
|
+
export function getStoragePath() {
|
|
10
|
+
return join(getConfigDir(), "openai-codex-accounts.json");
|
|
11
|
+
}
|
|
12
|
+
function selectNewestAccount(current, candidate) {
|
|
13
|
+
if (!current)
|
|
14
|
+
return candidate;
|
|
15
|
+
const currentLastUsed = current.lastUsed || 0;
|
|
16
|
+
const candidateLastUsed = candidate.lastUsed || 0;
|
|
17
|
+
if (candidateLastUsed > currentLastUsed)
|
|
18
|
+
return candidate;
|
|
19
|
+
if (candidateLastUsed < currentLastUsed)
|
|
20
|
+
return current;
|
|
21
|
+
const currentAddedAt = current.addedAt || 0;
|
|
22
|
+
const candidateAddedAt = candidate.addedAt || 0;
|
|
23
|
+
return candidateAddedAt >= currentAddedAt ? candidate : current;
|
|
24
|
+
}
|
|
25
|
+
export function deduplicateAccounts(accounts) {
|
|
26
|
+
const keyToIndex = new Map();
|
|
27
|
+
const indicesToKeep = new Set();
|
|
28
|
+
for (let i = 0; i < accounts.length; i += 1) {
|
|
29
|
+
const account = accounts[i];
|
|
30
|
+
if (!account)
|
|
31
|
+
continue;
|
|
32
|
+
const key = account.accountId || account.refreshToken;
|
|
33
|
+
if (!key)
|
|
34
|
+
continue;
|
|
35
|
+
const existingIndex = keyToIndex.get(key);
|
|
36
|
+
if (existingIndex === undefined) {
|
|
37
|
+
keyToIndex.set(key, i);
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const existing = accounts[existingIndex];
|
|
41
|
+
const newest = selectNewestAccount(existing, account);
|
|
42
|
+
keyToIndex.set(key, newest === account ? i : existingIndex);
|
|
43
|
+
}
|
|
44
|
+
for (const idx of keyToIndex.values()) {
|
|
45
|
+
indicesToKeep.add(idx);
|
|
46
|
+
}
|
|
47
|
+
const result = [];
|
|
48
|
+
for (let i = 0; i < accounts.length; i += 1) {
|
|
49
|
+
if (indicesToKeep.has(i)) {
|
|
50
|
+
const account = accounts[i];
|
|
51
|
+
if (account)
|
|
52
|
+
result.push(account);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return result;
|
|
56
|
+
}
|
|
57
|
+
function isRecord(value) {
|
|
58
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
59
|
+
}
|
|
60
|
+
function clampIndex(index, length) {
|
|
61
|
+
if (length <= 0)
|
|
62
|
+
return 0;
|
|
63
|
+
return Math.max(0, Math.min(index, length - 1));
|
|
64
|
+
}
|
|
65
|
+
function toAccountKey(account) {
|
|
66
|
+
return account.accountId || account.refreshToken;
|
|
67
|
+
}
|
|
68
|
+
function extractActiveKey(accounts, activeIndex) {
|
|
69
|
+
const candidate = accounts[activeIndex];
|
|
70
|
+
if (!isRecord(candidate))
|
|
71
|
+
return undefined;
|
|
72
|
+
const accountId = typeof candidate.accountId === "string" && candidate.accountId.trim()
|
|
73
|
+
? candidate.accountId
|
|
74
|
+
: undefined;
|
|
75
|
+
const refreshToken = typeof candidate.refreshToken === "string" && candidate.refreshToken.trim()
|
|
76
|
+
? candidate.refreshToken
|
|
77
|
+
: undefined;
|
|
78
|
+
return accountId || refreshToken;
|
|
79
|
+
}
|
|
80
|
+
export function normalizeAccountStorage(data) {
|
|
81
|
+
if (!isRecord(data)) {
|
|
82
|
+
log.warn("Invalid storage format, ignoring");
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
if (data.version !== 1) {
|
|
86
|
+
log.warn("Unknown storage version, ignoring", {
|
|
87
|
+
version: data.version,
|
|
88
|
+
});
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const rawAccounts = data.accounts;
|
|
92
|
+
if (!Array.isArray(rawAccounts)) {
|
|
93
|
+
log.warn("Invalid storage format, ignoring");
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const activeIndexValue = typeof data.activeIndex === "number" && Number.isFinite(data.activeIndex)
|
|
97
|
+
? data.activeIndex
|
|
98
|
+
: 0;
|
|
99
|
+
const rawActiveIndex = clampIndex(activeIndexValue, rawAccounts.length);
|
|
100
|
+
const activeKey = extractActiveKey(rawAccounts, rawActiveIndex);
|
|
101
|
+
const validAccounts = rawAccounts.filter((account) => isRecord(account) && typeof account.refreshToken === "string");
|
|
102
|
+
const deduplicatedAccounts = deduplicateAccounts(validAccounts);
|
|
103
|
+
const activeIndex = (() => {
|
|
104
|
+
if (deduplicatedAccounts.length === 0)
|
|
105
|
+
return 0;
|
|
106
|
+
if (activeKey) {
|
|
107
|
+
const mappedIndex = deduplicatedAccounts.findIndex((account) => toAccountKey(account) === activeKey);
|
|
108
|
+
if (mappedIndex >= 0)
|
|
109
|
+
return mappedIndex;
|
|
110
|
+
}
|
|
111
|
+
return clampIndex(rawActiveIndex, deduplicatedAccounts.length);
|
|
112
|
+
})();
|
|
113
|
+
return {
|
|
114
|
+
version: 1,
|
|
115
|
+
accounts: deduplicatedAccounts,
|
|
116
|
+
activeIndex,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
export async function loadAccounts() {
|
|
120
|
+
try {
|
|
121
|
+
const path = getStoragePath();
|
|
122
|
+
const content = await fs.readFile(path, "utf-8");
|
|
123
|
+
const data = JSON.parse(content);
|
|
124
|
+
return normalizeAccountStorage(data);
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
const code = error.code;
|
|
128
|
+
if (code === "ENOENT") {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
log.error("Failed to load account storage", { error: String(error) });
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export async function saveAccounts(storage) {
|
|
136
|
+
const path = getStoragePath();
|
|
137
|
+
await fs.mkdir(dirname(path), { recursive: true });
|
|
138
|
+
const content = JSON.stringify(storage, null, 2);
|
|
139
|
+
await fs.writeFile(path, content, "utf-8");
|
|
140
|
+
}
|
|
141
|
+
export async function clearAccounts() {
|
|
142
|
+
try {
|
|
143
|
+
const path = getStoragePath();
|
|
144
|
+
await fs.unlink(path);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
const code = error.code;
|
|
148
|
+
if (code !== "ENOENT") {
|
|
149
|
+
log.error("Failed to clear account storage", { error: String(error) });
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../lib/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;AAuBpC,SAAS,YAAY;IACnB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,YAAY,EAAE,EAAE,4BAA4B,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAsC,EACtC,SAA4B;IAE5B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9C,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;IAClD,IAAI,iBAAiB,GAAG,eAAe;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,iBAAiB,GAAG,eAAe;QAAE,OAAO,OAAO,CAAC;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;IAC5C,MAAM,gBAAgB,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC;IAChD,OAAO,gBAAgB,IAAI,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAA6B;IAE7B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;QACtD,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;YAChC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtD,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,OAAO;gBAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,MAAc;IAC/C,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CACnB,OAA8D;IAE9D,OAAO,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC;AACnD,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAmB,EAAE,WAAmB;IAChE,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,SAAS,GACb,OAAO,SAAS,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE;QACnE,CAAC,CAAC,SAAS,CAAC,SAAS;QACrB,CAAC,CAAC,SAAS,CAAC;IAChB,MAAM,YAAY,GAChB,OAAO,SAAS,CAAC,YAAY,KAAK,QAAQ,IAAI,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE;QACzE,CAAC,CAAC,SAAS,CAAC,YAAY;QACxB,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,SAAS,IAAI,YAAY,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAC5C,OAAO,EAAG,IAA8B,CAAC,OAAO;SACjD,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,gBAAgB,GACpB,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;QACvE,CAAC,CAAC,IAAI,CAAC,WAAW;QAClB,CAAC,CAAC,CAAC,CAAC;IAER,MAAM,cAAc,GAAG,UAAU,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,gBAAgB,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAEhE,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,CACtC,CAAC,OAAO,EAAgC,EAAE,CACxC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ,CAChE,CAAC;IAEF,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAEhE,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE;QACxB,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEhD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAChD,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CACjD,CAAC;YACF,IAAI,WAAW,IAAI,CAAC;gBAAE,OAAO,WAAW,CAAC;QAC3C,CAAC;QAED,OAAO,UAAU,CAAC,cAAc,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO;QACL,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,oBAAoB;QAC9B,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QAE5C,OAAO,uBAAuB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,gCAAgC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;QAC9B,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import type { Auth, Provider, Model } from "@opencode-ai/sdk";
|
|
2
|
+
/**
|
|
3
|
+
* Plugin configuration from ~/.opencode/openai-codex-auth-config.json
|
|
4
|
+
*/
|
|
5
|
+
export interface PluginConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Enable CODEX_MODE (Codex-OpenCode bridge prompt instead of tool remap)
|
|
8
|
+
* @default true
|
|
9
|
+
*/
|
|
10
|
+
codexMode?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* User configuration structure from opencode.json
|
|
14
|
+
*/
|
|
15
|
+
export interface UserConfig {
|
|
16
|
+
global: ConfigOptions;
|
|
17
|
+
models: {
|
|
18
|
+
[modelName: string]: {
|
|
19
|
+
options?: ConfigOptions;
|
|
20
|
+
variants?: Record<string, (ConfigOptions & {
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
}) | undefined>;
|
|
23
|
+
[key: string]: unknown;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configuration options for reasoning and text settings
|
|
29
|
+
*/
|
|
30
|
+
export interface ConfigOptions {
|
|
31
|
+
reasoningEffort?: "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
32
|
+
reasoningSummary?: "auto" | "concise" | "detailed" | "off" | "on";
|
|
33
|
+
textVerbosity?: "low" | "medium" | "high";
|
|
34
|
+
include?: string[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reasoning configuration for requests
|
|
38
|
+
*/
|
|
39
|
+
export interface ReasoningConfig {
|
|
40
|
+
effort: "none" | "minimal" | "low" | "medium" | "high" | "xhigh";
|
|
41
|
+
summary: "auto" | "concise" | "detailed" | "off" | "on";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* OAuth server information
|
|
45
|
+
*/
|
|
46
|
+
export interface OAuthServerInfo {
|
|
47
|
+
port: number;
|
|
48
|
+
ready: boolean;
|
|
49
|
+
close: () => void;
|
|
50
|
+
waitForCode: (state: string) => Promise<{
|
|
51
|
+
code: string;
|
|
52
|
+
} | null>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* PKCE challenge and verifier
|
|
56
|
+
*/
|
|
57
|
+
export interface PKCEPair {
|
|
58
|
+
challenge: string;
|
|
59
|
+
verifier: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Authorization flow result
|
|
63
|
+
*/
|
|
64
|
+
export interface AuthorizationFlow {
|
|
65
|
+
pkce: PKCEPair;
|
|
66
|
+
state: string;
|
|
67
|
+
url: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Token exchange success result
|
|
71
|
+
*/
|
|
72
|
+
export interface TokenSuccess {
|
|
73
|
+
type: "success";
|
|
74
|
+
access: string;
|
|
75
|
+
refresh: string;
|
|
76
|
+
expires: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Token exchange failure result
|
|
80
|
+
*/
|
|
81
|
+
export interface TokenFailure {
|
|
82
|
+
type: "failed";
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Token exchange result
|
|
86
|
+
*/
|
|
87
|
+
export type TokenResult = TokenSuccess | TokenFailure;
|
|
88
|
+
/**
|
|
89
|
+
* Parsed authorization input
|
|
90
|
+
*/
|
|
91
|
+
export interface ParsedAuthInput {
|
|
92
|
+
code?: string;
|
|
93
|
+
state?: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* JWT payload with ChatGPT account info
|
|
97
|
+
*/
|
|
98
|
+
export interface JWTPayload {
|
|
99
|
+
"https://api.openai.com/auth"?: {
|
|
100
|
+
chatgpt_account_id?: string;
|
|
101
|
+
};
|
|
102
|
+
[key: string]: unknown;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Message input item
|
|
106
|
+
*/
|
|
107
|
+
export interface InputItem {
|
|
108
|
+
id?: string;
|
|
109
|
+
type: string;
|
|
110
|
+
role: string;
|
|
111
|
+
content?: unknown;
|
|
112
|
+
[key: string]: unknown;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Request body structure
|
|
116
|
+
*/
|
|
117
|
+
export interface RequestBody {
|
|
118
|
+
model: string;
|
|
119
|
+
store?: boolean;
|
|
120
|
+
stream?: boolean;
|
|
121
|
+
instructions?: string;
|
|
122
|
+
input?: InputItem[];
|
|
123
|
+
tools?: unknown;
|
|
124
|
+
reasoning?: Partial<ReasoningConfig>;
|
|
125
|
+
text?: {
|
|
126
|
+
verbosity?: "low" | "medium" | "high";
|
|
127
|
+
};
|
|
128
|
+
include?: string[];
|
|
129
|
+
providerOptions?: {
|
|
130
|
+
openai?: Partial<ConfigOptions> & {
|
|
131
|
+
store?: boolean;
|
|
132
|
+
include?: string[];
|
|
133
|
+
};
|
|
134
|
+
[key: string]: unknown;
|
|
135
|
+
};
|
|
136
|
+
/** Stable key to enable prompt-token caching on Codex backend */
|
|
137
|
+
prompt_cache_key?: string;
|
|
138
|
+
max_output_tokens?: number;
|
|
139
|
+
max_completion_tokens?: number;
|
|
140
|
+
[key: string]: unknown;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* SSE event data structure
|
|
144
|
+
*/
|
|
145
|
+
export interface SSEEventData {
|
|
146
|
+
type: string;
|
|
147
|
+
response?: unknown;
|
|
148
|
+
[key: string]: unknown;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Cache metadata for Codex instructions
|
|
152
|
+
*/
|
|
153
|
+
export interface CacheMetadata {
|
|
154
|
+
etag: string | null;
|
|
155
|
+
tag: string;
|
|
156
|
+
lastChecked: number;
|
|
157
|
+
url: string;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* GitHub release data
|
|
161
|
+
*/
|
|
162
|
+
export interface GitHubRelease {
|
|
163
|
+
tag_name: string;
|
|
164
|
+
[key: string]: unknown;
|
|
165
|
+
}
|
|
166
|
+
export type { Auth, Provider, Model };
|
|
167
|
+
export type OAuthAuthDetails = Extract<Auth, {
|
|
168
|
+
type: "oauth";
|
|
169
|
+
}>;
|
|
170
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opencode-openai-codex-auth-multi",
|
|
3
|
+
"version": "4.3.0-multiaccount.1",
|
|
4
|
+
"description": "Fork of opencode-openai-codex-auth with multi-account rotation (ChatGPT OAuth / Codex backend)",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"license": "MIT",
|
|
9
|
+
"author": "Numman Ali",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "git+https://github.com/ndycode/opencode-openai-codex-auth-multi.git"
|
|
13
|
+
},
|
|
14
|
+
"keywords": [
|
|
15
|
+
"opencode",
|
|
16
|
+
"openai",
|
|
17
|
+
"codex",
|
|
18
|
+
"chatgpt",
|
|
19
|
+
"oauth",
|
|
20
|
+
"gpt-5",
|
|
21
|
+
"plugin",
|
|
22
|
+
"auth",
|
|
23
|
+
"chatgpt-plus",
|
|
24
|
+
"chatgpt-pro"
|
|
25
|
+
],
|
|
26
|
+
"homepage": "https://github.com/ndycode/opencode-openai-codex-auth-multi#readme",
|
|
27
|
+
"bugs": {
|
|
28
|
+
"url": "https://github.com/ndycode/opencode-openai-codex-auth-multi/issues"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc && node scripts/copy-oauth-success.js",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:ui": "vitest --ui",
|
|
36
|
+
"test:coverage": "vitest run --coverage"
|
|
37
|
+
},
|
|
38
|
+
"bin": {
|
|
39
|
+
"opencode-openai-codex-auth-multi": "scripts/install-opencode-codex-auth.js"
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist/",
|
|
43
|
+
"assets/",
|
|
44
|
+
"config/",
|
|
45
|
+
"scripts/",
|
|
46
|
+
"README.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=20.0.0"
|
|
51
|
+
},
|
|
52
|
+
"peerDependencies": {
|
|
53
|
+
"@opencode-ai/plugin": "^1.0.150"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@opencode-ai/plugin": "^1.0.150",
|
|
57
|
+
"@opencode-ai/sdk": "^1.0.150",
|
|
58
|
+
"@types/node": "^24.6.2",
|
|
59
|
+
"@vitest/ui": "^3.2.4",
|
|
60
|
+
"typescript": "^5.9.3",
|
|
61
|
+
"vitest": "^3.2.4"
|
|
62
|
+
},
|
|
63
|
+
"dependencies": {
|
|
64
|
+
"@openauthjs/openauth": "^0.4.3",
|
|
65
|
+
"hono": "^4.10.4"
|
|
66
|
+
},
|
|
67
|
+
"overrides": {
|
|
68
|
+
"hono": "^4.10.4",
|
|
69
|
+
"vite": "^7.1.12"
|
|
70
|
+
}
|
|
71
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { promises as fs } from "node:fs";
|
|
2
|
+
import { dirname, join, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
|
|
8
|
+
function normalizePathForCompare(path) {
|
|
9
|
+
const resolved = resolve(path);
|
|
10
|
+
return process.platform === "win32" ? resolved.toLowerCase() : resolved;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function getDefaultPaths() {
|
|
14
|
+
const src = join(__dirname, "..", "lib", "oauth-success.html");
|
|
15
|
+
const dest = join(__dirname, "..", "dist", "lib", "oauth-success.html");
|
|
16
|
+
return { src, dest };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export async function copyOAuthSuccessHtml(options = {}) {
|
|
20
|
+
const defaults = getDefaultPaths();
|
|
21
|
+
const src = options.src ?? defaults.src;
|
|
22
|
+
const dest = options.dest ?? defaults.dest;
|
|
23
|
+
|
|
24
|
+
await fs.mkdir(dirname(dest), { recursive: true });
|
|
25
|
+
await fs.copyFile(src, dest);
|
|
26
|
+
|
|
27
|
+
return { src, dest };
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const isDirectRun = (() => {
|
|
31
|
+
if (!process.argv[1]) return false;
|
|
32
|
+
return normalizePathForCompare(process.argv[1]) === normalizePathForCompare(__filename);
|
|
33
|
+
})();
|
|
34
|
+
|
|
35
|
+
if (isDirectRun) {
|
|
36
|
+
await copyOAuthSuccessHtml();
|
|
37
|
+
}
|