@terminai/core 0.23.0 → 0.25.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/dist/src/audit/redaction.js +24 -0
- package/dist/src/audit/redaction.js.map +1 -1
- package/dist/src/audit/redaction.test.d.ts +7 -0
- package/dist/src/audit/redaction.test.js +45 -0
- package/dist/src/audit/redaction.test.js.map +1 -0
- package/dist/src/auth/providerRegistry.js +20 -0
- package/dist/src/auth/providerRegistry.js.map +1 -1
- package/dist/src/auth/wizardSettings.d.ts +5 -0
- package/dist/src/auth/wizardSettings.js +43 -0
- package/dist/src/auth/wizardSettings.js.map +1 -1
- package/dist/src/auth/wizardSettings.test.js +20 -0
- package/dist/src/auth/wizardSettings.test.js.map +1 -1
- package/dist/src/auth/wizardState.d.ts +1 -1
- package/dist/src/auth/wizardState.js +2 -0
- package/dist/src/auth/wizardState.js.map +1 -1
- package/dist/src/auth/wizardState.test.js +23 -0
- package/dist/src/auth/wizardState.test.js.map +1 -1
- package/dist/src/config/builder.js +23 -0
- package/dist/src/config/builder.js.map +1 -1
- package/dist/src/config/config.js +40 -1
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/settings/schema.d.ts +50 -0
- package/dist/src/config/settings/schema.js +48 -0
- package/dist/src/config/settings/schema.js.map +1 -1
- package/dist/src/core/chatGptCodexContentGenerator.d.ts +35 -0
- package/dist/src/core/chatGptCodexContentGenerator.js +605 -0
- package/dist/src/core/chatGptCodexContentGenerator.js.map +1 -0
- package/dist/src/core/chatGptCodexContentGenerator.test.d.ts +7 -0
- package/dist/src/core/chatGptCodexContentGenerator.test.js +250 -0
- package/dist/src/core/chatGptCodexContentGenerator.test.js.map +1 -0
- package/dist/src/core/contentGenerator.d.ts +2 -1
- package/dist/src/core/contentGenerator.js +10 -0
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +36 -0
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.d.ts +1 -0
- package/dist/src/core/loggingContentGenerator.js +30 -0
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +62 -0
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/openaiContentGenerator.d.ts +16 -0
- package/dist/src/core/openaiContentGenerator.js +244 -52
- package/dist/src/core/openaiContentGenerator.js.map +1 -1
- package/dist/src/core/openaiContentGenerator.test.js +176 -7
- package/dist/src/core/openaiContentGenerator.test.js.map +1 -1
- package/dist/src/core/providerTypes.d.ts +17 -1
- package/dist/src/core/providerTypes.js +10 -0
- package/dist/src/core/providerTypes.js.map +1 -1
- package/dist/src/core/providerTypes.test.js +11 -0
- package/dist/src/core/providerTypes.test.js.map +1 -1
- package/dist/src/core/turn.js +1 -1
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +1 -1
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +7 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/openai_chatgpt/constants.d.ts +23 -0
- package/dist/src/openai_chatgpt/constants.js +35 -0
- package/dist/src/openai_chatgpt/constants.js.map +1 -0
- package/dist/src/openai_chatgpt/credentialStorage.d.ts +18 -0
- package/dist/src/openai_chatgpt/credentialStorage.js +116 -0
- package/dist/src/openai_chatgpt/credentialStorage.js.map +1 -0
- package/dist/src/openai_chatgpt/credentialStorage.test.d.ts +7 -0
- package/dist/src/openai_chatgpt/credentialStorage.test.js +73 -0
- package/dist/src/openai_chatgpt/credentialStorage.test.js.map +1 -0
- package/dist/src/openai_chatgpt/imports.d.ts +10 -0
- package/dist/src/openai_chatgpt/imports.js +164 -0
- package/dist/src/openai_chatgpt/imports.js.map +1 -0
- package/dist/src/openai_chatgpt/imports.test.d.ts +7 -0
- package/dist/src/openai_chatgpt/imports.test.js +82 -0
- package/dist/src/openai_chatgpt/imports.test.js.map +1 -0
- package/dist/src/openai_chatgpt/jwt.d.ts +7 -0
- package/dist/src/openai_chatgpt/jwt.js +31 -0
- package/dist/src/openai_chatgpt/jwt.js.map +1 -0
- package/dist/src/openai_chatgpt/jwt.test.d.ts +7 -0
- package/dist/src/openai_chatgpt/jwt.test.js +23 -0
- package/dist/src/openai_chatgpt/jwt.test.js.map +1 -0
- package/dist/src/openai_chatgpt/oauthClient.d.ts +52 -0
- package/dist/src/openai_chatgpt/oauthClient.js +196 -0
- package/dist/src/openai_chatgpt/oauthClient.js.map +1 -0
- package/dist/src/openai_chatgpt/oauthClient.test.d.ts +7 -0
- package/dist/src/openai_chatgpt/oauthClient.test.js +138 -0
- package/dist/src/openai_chatgpt/oauthClient.test.js.map +1 -0
- package/dist/src/openai_chatgpt/types.d.ts +34 -0
- package/dist/src/openai_chatgpt/types.js +8 -0
- package/dist/src/openai_chatgpt/types.js.map +1 -0
- package/dist/src/utils/errorReporting.js +1 -1
- package/dist/src/utils/errorReporting.js.map +1 -1
- package/dist/src/utils/errorReporting.test.js +1 -1
- package/dist/src/utils/errorReporting.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025 Google LLC
|
|
4
|
+
* Portions Copyright 2025 TerminaI Authors
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
import { GenerateContentResponse, } from '@google/genai';
|
|
8
|
+
import { toContents } from '../code_assist/converter.js';
|
|
9
|
+
import { ProxyAgent } from 'undici';
|
|
10
|
+
import { estimateTokenCountSync } from '../utils/tokenCalculation.js';
|
|
11
|
+
import { CHATGPT_CODEX_RESPONSES_PATH, CODEX_ORIGINATOR, } from '../openai_chatgpt/constants.js';
|
|
12
|
+
import { ChatGptOAuthCredentialStorage } from '../openai_chatgpt/credentialStorage.js';
|
|
13
|
+
import { ChatGptOAuthClient, RefreshTokenReusedError, } from '../openai_chatgpt/oauthClient.js';
|
|
14
|
+
import { tryImportFromCodexCli, tryImportFromOpenCode, } from '../openai_chatgpt/imports.js';
|
|
15
|
+
export class ChatGptCodexContentGenerator {
|
|
16
|
+
providerConfig;
|
|
17
|
+
globalConfig;
|
|
18
|
+
oauthClient = new ChatGptOAuthClient();
|
|
19
|
+
// Maps sanitized tool names back to original Gemini names (e.g. "ui_click" → "ui.click")
|
|
20
|
+
toolNameMap = new Map();
|
|
21
|
+
constructor(providerConfig, globalConfig) {
|
|
22
|
+
this.providerConfig = providerConfig;
|
|
23
|
+
this.globalConfig = globalConfig;
|
|
24
|
+
}
|
|
25
|
+
hasUnsupportedModalities(contents) {
|
|
26
|
+
for (const content of contents) {
|
|
27
|
+
if (content.parts) {
|
|
28
|
+
for (const part of content.parts) {
|
|
29
|
+
if (part && typeof part === 'object') {
|
|
30
|
+
if ('inlineData' in part || 'fileData' in part) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
partUnionToText(part) {
|
|
40
|
+
if (typeof part === 'string')
|
|
41
|
+
return part;
|
|
42
|
+
if (part && typeof part === 'object') {
|
|
43
|
+
const maybe = part;
|
|
44
|
+
if (typeof maybe.text === 'string')
|
|
45
|
+
return maybe.text;
|
|
46
|
+
}
|
|
47
|
+
return '';
|
|
48
|
+
}
|
|
49
|
+
contentUnionToText(content) {
|
|
50
|
+
if (!content)
|
|
51
|
+
return '';
|
|
52
|
+
if (typeof content === 'string')
|
|
53
|
+
return content;
|
|
54
|
+
if (Array.isArray(content)) {
|
|
55
|
+
return content.map((p) => this.partUnionToText(p)).join('');
|
|
56
|
+
}
|
|
57
|
+
if (content && typeof content === 'object') {
|
|
58
|
+
const maybeContent = content;
|
|
59
|
+
if (Array.isArray(maybeContent.parts)) {
|
|
60
|
+
return maybeContent.parts.map((p) => this.partUnionToText(p)).join('');
|
|
61
|
+
}
|
|
62
|
+
return this.partUnionToText(content);
|
|
63
|
+
}
|
|
64
|
+
return '';
|
|
65
|
+
}
|
|
66
|
+
isPlainObject(value) {
|
|
67
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
68
|
+
}
|
|
69
|
+
getParametersJsonSchema(fn) {
|
|
70
|
+
if (!this.isPlainObject(fn))
|
|
71
|
+
return null;
|
|
72
|
+
const parametersJsonSchema = fn['parametersJsonSchema'];
|
|
73
|
+
return this.isPlainObject(parametersJsonSchema)
|
|
74
|
+
? parametersJsonSchema
|
|
75
|
+
: null;
|
|
76
|
+
}
|
|
77
|
+
parseToolArguments(value) {
|
|
78
|
+
if (value === undefined || value === null)
|
|
79
|
+
return null;
|
|
80
|
+
if (typeof value === 'string') {
|
|
81
|
+
const trimmed = value.trim();
|
|
82
|
+
if (!trimmed)
|
|
83
|
+
return null;
|
|
84
|
+
const parsed = JSON.parse(trimmed);
|
|
85
|
+
return this.isPlainObject(parsed) ? parsed : {};
|
|
86
|
+
}
|
|
87
|
+
return this.isPlainObject(value) ? value : null;
|
|
88
|
+
}
|
|
89
|
+
normalizeTools(tools) {
|
|
90
|
+
if (!tools)
|
|
91
|
+
return [];
|
|
92
|
+
return Array.isArray(tools) ? tools : [tools];
|
|
93
|
+
}
|
|
94
|
+
async generateContent(request, _userPromptId) {
|
|
95
|
+
const stream = await this.generateContentStream(request, _userPromptId);
|
|
96
|
+
let last = null;
|
|
97
|
+
for await (const chunk of stream) {
|
|
98
|
+
last = chunk;
|
|
99
|
+
}
|
|
100
|
+
if (!last) {
|
|
101
|
+
throw new Error('No response from ChatGPT Codex backend');
|
|
102
|
+
}
|
|
103
|
+
return last;
|
|
104
|
+
}
|
|
105
|
+
async generateContentStream(request, _userPromptId) {
|
|
106
|
+
const contents = toContents(request.contents);
|
|
107
|
+
if (this.hasUnsupportedModalities(contents)) {
|
|
108
|
+
throw new Error('The ChatGPT Codex provider currently only supports text. To use images or other files, please switch to the Gemini provider.');
|
|
109
|
+
}
|
|
110
|
+
const instructions = this.contentUnionToText(request.config?.systemInstruction);
|
|
111
|
+
const tools = this.normalizeTools(request.config?.tools);
|
|
112
|
+
const body = {
|
|
113
|
+
model: request.model || this.providerConfig.model,
|
|
114
|
+
store: false,
|
|
115
|
+
stream: true,
|
|
116
|
+
include: ['reasoning.encrypted_content'],
|
|
117
|
+
...(instructions ? { instructions } : {}),
|
|
118
|
+
input: this.convertContentsToResponsesInput(contents.filter((c) => c.role !== 'system')),
|
|
119
|
+
...(tools.length > 0 ? { tools: this.convertTools(tools) } : {}),
|
|
120
|
+
...(request.config?.maxOutputTokens
|
|
121
|
+
? { max_tokens: request.config.maxOutputTokens }
|
|
122
|
+
: {}),
|
|
123
|
+
...(request.config?.temperature !== undefined
|
|
124
|
+
? { temperature: request.config.temperature }
|
|
125
|
+
: {}),
|
|
126
|
+
...(request.config?.topP !== undefined
|
|
127
|
+
? { top_p: request.config.topP }
|
|
128
|
+
: {}),
|
|
129
|
+
...(request.config?.stopSequences
|
|
130
|
+
? { stop: request.config.stopSequences }
|
|
131
|
+
: {}),
|
|
132
|
+
...(request.config?.presencePenalty
|
|
133
|
+
? { presence_penalty: request.config.presencePenalty }
|
|
134
|
+
: {}),
|
|
135
|
+
...(request.config?.frequencyPenalty
|
|
136
|
+
? { frequency_penalty: request.config.frequencyPenalty }
|
|
137
|
+
: {}),
|
|
138
|
+
...(request.config?.seed !== undefined
|
|
139
|
+
? { seed: request.config.seed }
|
|
140
|
+
: {}),
|
|
141
|
+
};
|
|
142
|
+
const debugMode = this.globalConfig.getDebugMode();
|
|
143
|
+
const response = await this.fetchWithAuthRecovery(CHATGPT_CODEX_RESPONSES_PATH, body, request.config?.abortSignal);
|
|
144
|
+
if (!response.body) {
|
|
145
|
+
throw new Error('No response body from ChatGPT Codex stream');
|
|
146
|
+
}
|
|
147
|
+
const toolNameMap = this.toolNameMap;
|
|
148
|
+
const parseToolArguments = (value) => this.parseToolArguments(value);
|
|
149
|
+
return async function* () {
|
|
150
|
+
const reader = response.body.getReader();
|
|
151
|
+
const decoder = new TextDecoder();
|
|
152
|
+
let buffer = '';
|
|
153
|
+
let terminalResponse = null;
|
|
154
|
+
let hasYieldedText = false;
|
|
155
|
+
try {
|
|
156
|
+
while (true) {
|
|
157
|
+
const { done, value } = await reader.read();
|
|
158
|
+
if (done)
|
|
159
|
+
break;
|
|
160
|
+
buffer += decoder.decode(value, { stream: true });
|
|
161
|
+
const lines = buffer.split('\n');
|
|
162
|
+
buffer = lines.pop() || '';
|
|
163
|
+
for (const line of lines) {
|
|
164
|
+
const trimmed = line.trim();
|
|
165
|
+
if (!trimmed)
|
|
166
|
+
continue;
|
|
167
|
+
if (!trimmed.startsWith('data:'))
|
|
168
|
+
continue;
|
|
169
|
+
const dataText = trimmed.slice('data:'.length).trim();
|
|
170
|
+
if (!dataText || dataText === '[DONE]')
|
|
171
|
+
continue;
|
|
172
|
+
let event;
|
|
173
|
+
try {
|
|
174
|
+
event = JSON.parse(dataText);
|
|
175
|
+
}
|
|
176
|
+
catch (e) {
|
|
177
|
+
if (debugMode) {
|
|
178
|
+
console.error('[ChatGPT OAuth] Failed to parse SSE JSON:', e);
|
|
179
|
+
}
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
if (!this.isPlainObject(event))
|
|
183
|
+
continue;
|
|
184
|
+
const type = event['type'];
|
|
185
|
+
const delta = event['delta'];
|
|
186
|
+
if (type === 'response.output_text.delta' &&
|
|
187
|
+
typeof delta === 'string') {
|
|
188
|
+
const resp = new GenerateContentResponse();
|
|
189
|
+
resp.candidates = [
|
|
190
|
+
{
|
|
191
|
+
content: { role: 'model', parts: [{ text: delta }] },
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
hasYieldedText = true;
|
|
195
|
+
yield resp;
|
|
196
|
+
}
|
|
197
|
+
if ((type === 'response.completed' ||
|
|
198
|
+
type === 'response.done' ||
|
|
199
|
+
type === 'response.completed_event' ||
|
|
200
|
+
type === 'response.output_item.done') && // Added extra finish parsing
|
|
201
|
+
(this.isPlainObject(event['response']) ||
|
|
202
|
+
this.isPlainObject(event['item'])) // Handle item-level done
|
|
203
|
+
) {
|
|
204
|
+
// Prefer top-level response if available, else item (though usually response.done has the usage)
|
|
205
|
+
const candidate = (event['response'] ||
|
|
206
|
+
event['item']);
|
|
207
|
+
// Only overwrite if it looks like a terminal response (has output or usage)
|
|
208
|
+
if (candidate.output || candidate.usage) {
|
|
209
|
+
terminalResponse = candidate;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
reader.releaseLock();
|
|
217
|
+
}
|
|
218
|
+
if (!terminalResponse) {
|
|
219
|
+
throw new Error('ChatGPT Codex stream ended without terminal response');
|
|
220
|
+
}
|
|
221
|
+
const { text, toolCalls, usage } = this.extractTextAndToolCallsFromResponse(terminalResponse);
|
|
222
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
223
|
+
const parts = [];
|
|
224
|
+
if (text && !hasYieldedText)
|
|
225
|
+
parts.push({ text });
|
|
226
|
+
for (const tc of toolCalls) {
|
|
227
|
+
try {
|
|
228
|
+
const args = parseToolArguments(tc.arguments) ?? {};
|
|
229
|
+
const originalName = toolNameMap.get(tc.name) || tc.name;
|
|
230
|
+
parts.push({
|
|
231
|
+
functionCall: {
|
|
232
|
+
...(tc.id ? { id: tc.id } : {}),
|
|
233
|
+
name: originalName,
|
|
234
|
+
args,
|
|
235
|
+
},
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (e) {
|
|
239
|
+
if (debugMode) {
|
|
240
|
+
console.error('[ChatGPT OAuth] Failed to parse tool arguments:', e);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
const candidate = {
|
|
245
|
+
content: { role: 'model', parts },
|
|
246
|
+
finishReason: 'STOP',
|
|
247
|
+
};
|
|
248
|
+
const final = new GenerateContentResponse();
|
|
249
|
+
final.candidates = [candidate];
|
|
250
|
+
if (usage) {
|
|
251
|
+
final.usageMetadata = {
|
|
252
|
+
promptTokenCount: usage.prompt_tokens ?? 0,
|
|
253
|
+
candidatesTokenCount: usage.completion_tokens ?? 0,
|
|
254
|
+
totalTokenCount: usage.total_tokens ?? 0,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
yield final;
|
|
258
|
+
}.call(this);
|
|
259
|
+
}
|
|
260
|
+
async countTokens(request) {
|
|
261
|
+
const contents = toContents(request.contents);
|
|
262
|
+
let totalTokens = 0;
|
|
263
|
+
for (const content of contents) {
|
|
264
|
+
if (content.parts) {
|
|
265
|
+
totalTokens += estimateTokenCountSync(content.parts);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return { totalTokens };
|
|
269
|
+
}
|
|
270
|
+
async embedContent(_request) {
|
|
271
|
+
throw new Error('Embeddings not supported for ChatGPT OAuth provider yet.');
|
|
272
|
+
}
|
|
273
|
+
async fetchWithAuthRecovery(pathSuffix, body, signal) {
|
|
274
|
+
let credentials = await this.loadOrImportCredentials();
|
|
275
|
+
const doFetch = async (accessToken, accountId) => {
|
|
276
|
+
const baseUrl = normalizeBaseUrl(this.providerConfig.baseUrl);
|
|
277
|
+
const url = `${baseUrl}/${pathSuffix}`;
|
|
278
|
+
const headers = {
|
|
279
|
+
'Content-Type': 'application/json',
|
|
280
|
+
Authorization: `Bearer ${accessToken}`,
|
|
281
|
+
'ChatGPT-Account-ID': accountId,
|
|
282
|
+
originator: CODEX_ORIGINATOR,
|
|
283
|
+
session_id: this.globalConfig.getSessionId(),
|
|
284
|
+
...this.providerConfig.headers,
|
|
285
|
+
};
|
|
286
|
+
if (process.env['TERMINAI_OPENAI_CHATGPT_BETA_RESPONSES_EXPERIMENTAL'] ===
|
|
287
|
+
'true') {
|
|
288
|
+
headers['OpenAI-Beta'] = 'responses=experimental';
|
|
289
|
+
}
|
|
290
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
|
+
const options = {
|
|
292
|
+
method: 'POST',
|
|
293
|
+
headers,
|
|
294
|
+
body: JSON.stringify(body),
|
|
295
|
+
signal,
|
|
296
|
+
};
|
|
297
|
+
const proxy = this.globalConfig.getProxy();
|
|
298
|
+
if (proxy) {
|
|
299
|
+
options.dispatcher = new ProxyAgent(proxy);
|
|
300
|
+
}
|
|
301
|
+
return fetch(url, options);
|
|
302
|
+
};
|
|
303
|
+
const attemptWithCreds = async () => {
|
|
304
|
+
const stalenessRefresh = this.oauthClient.shouldRefreshByStaleness(credentials.lastRefresh);
|
|
305
|
+
if (stalenessRefresh) {
|
|
306
|
+
try {
|
|
307
|
+
const refreshed = await this.oauthClient.refresh({
|
|
308
|
+
refreshToken: credentials.token.refreshToken ?? '',
|
|
309
|
+
existingRefreshToken: credentials.token.refreshToken ?? undefined,
|
|
310
|
+
});
|
|
311
|
+
await ChatGptOAuthCredentialStorage.save(refreshed);
|
|
312
|
+
const reloaded = await ChatGptOAuthCredentialStorage.load();
|
|
313
|
+
if (reloaded)
|
|
314
|
+
credentials = reloaded;
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
if (error instanceof RefreshTokenReusedError) {
|
|
318
|
+
// Clear invalid credentials so user can re-auth
|
|
319
|
+
await ChatGptOAuthCredentialStorage.clear();
|
|
320
|
+
throw error; // Re-throw with user-friendly message
|
|
321
|
+
}
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const accountId = this.oauthClient.deriveAccountId({
|
|
326
|
+
accountId: credentials.accountId,
|
|
327
|
+
idToken: credentials.idToken,
|
|
328
|
+
accessToken: credentials.token.accessToken,
|
|
329
|
+
}) ?? credentials.accountId;
|
|
330
|
+
if (!accountId) {
|
|
331
|
+
throw new Error('ChatGPT OAuth account id is missing. Re-authenticate to obtain an id_token with chatgpt_account_id.');
|
|
332
|
+
}
|
|
333
|
+
return doFetch(credentials.token.accessToken, accountId);
|
|
334
|
+
};
|
|
335
|
+
// 401 recovery: reload -> retry -> refresh -> retry -> fail
|
|
336
|
+
let response;
|
|
337
|
+
try {
|
|
338
|
+
response = await attemptWithCreds();
|
|
339
|
+
}
|
|
340
|
+
catch (error) {
|
|
341
|
+
if (error instanceof RefreshTokenReusedError) {
|
|
342
|
+
throw error; // Already has user-friendly message
|
|
343
|
+
}
|
|
344
|
+
throw error;
|
|
345
|
+
}
|
|
346
|
+
if (response.status !== 401) {
|
|
347
|
+
return ensureOk(response);
|
|
348
|
+
}
|
|
349
|
+
{
|
|
350
|
+
const reloaded = await ChatGptOAuthCredentialStorage.load().catch(() => null);
|
|
351
|
+
if (reloaded)
|
|
352
|
+
credentials = reloaded;
|
|
353
|
+
}
|
|
354
|
+
try {
|
|
355
|
+
response = await attemptWithCreds();
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
if (error instanceof RefreshTokenReusedError) {
|
|
359
|
+
throw error;
|
|
360
|
+
}
|
|
361
|
+
throw error;
|
|
362
|
+
}
|
|
363
|
+
if (response.status !== 401) {
|
|
364
|
+
return ensureOk(response);
|
|
365
|
+
}
|
|
366
|
+
// Final refresh attempt
|
|
367
|
+
try {
|
|
368
|
+
const refreshed = await this.oauthClient.refresh({
|
|
369
|
+
refreshToken: credentials.token.refreshToken ?? '',
|
|
370
|
+
existingRefreshToken: credentials.token.refreshToken ?? undefined,
|
|
371
|
+
});
|
|
372
|
+
await ChatGptOAuthCredentialStorage.save(refreshed);
|
|
373
|
+
{
|
|
374
|
+
const reloaded = await ChatGptOAuthCredentialStorage.load();
|
|
375
|
+
if (reloaded)
|
|
376
|
+
credentials = reloaded;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
if (error instanceof RefreshTokenReusedError) {
|
|
381
|
+
await ChatGptOAuthCredentialStorage.clear();
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
throw error;
|
|
385
|
+
}
|
|
386
|
+
response = await attemptWithCreds();
|
|
387
|
+
if (response.status !== 401) {
|
|
388
|
+
return ensureOk(response);
|
|
389
|
+
}
|
|
390
|
+
// All recovery attempts failed - clear creds and tell user to re-auth
|
|
391
|
+
await ChatGptOAuthCredentialStorage.clear();
|
|
392
|
+
throw new Error('ChatGPT OAuth unauthorized. Credentials cleared. Run /auth wizard to re-authenticate.');
|
|
393
|
+
}
|
|
394
|
+
async loadOrImportCredentials() {
|
|
395
|
+
// Attempt load first
|
|
396
|
+
const loaded = await ChatGptOAuthCredentialStorage.load().catch(() => null);
|
|
397
|
+
if (loaded) {
|
|
398
|
+
// Validate loaded credentials have required fields
|
|
399
|
+
if (!loaded.accountId || !loaded.token.refreshToken) {
|
|
400
|
+
// Silently clear corrupted credentials and continue to import/error
|
|
401
|
+
await ChatGptOAuthCredentialStorage.clear();
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
return loaded;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// Try importing from external sources
|
|
408
|
+
const imported = (await tryImportFromCodexCli(this.oauthClient)) ??
|
|
409
|
+
(await tryImportFromOpenCode(this.oauthClient));
|
|
410
|
+
// Strict validation before saving - must have accountId AND refreshToken
|
|
411
|
+
if (imported && imported.accountId && imported.token.refreshToken) {
|
|
412
|
+
await ChatGptOAuthCredentialStorage.save(imported);
|
|
413
|
+
const reloaded = await ChatGptOAuthCredentialStorage.load().catch(() => null);
|
|
414
|
+
if (reloaded)
|
|
415
|
+
return reloaded;
|
|
416
|
+
}
|
|
417
|
+
throw new Error('[ChatGPT OAuth] Not authenticated. Run /auth wizard to complete OpenAI login.');
|
|
418
|
+
}
|
|
419
|
+
convertTools(tools) {
|
|
420
|
+
const out = [];
|
|
421
|
+
for (const tool of tools) {
|
|
422
|
+
if (tool.functionDeclarations) {
|
|
423
|
+
for (const fn of tool.functionDeclarations) {
|
|
424
|
+
const parametersFromJsonSchema = this.getParametersJsonSchema(fn);
|
|
425
|
+
out.push({
|
|
426
|
+
type: 'function',
|
|
427
|
+
name: this.sanitizeToolName(fn.name || 'unknown_tool'),
|
|
428
|
+
description: fn.description,
|
|
429
|
+
parameters: parametersFromJsonSchema ??
|
|
430
|
+
(fn.parameters
|
|
431
|
+
? this.convertSchemaToJsonSchema(fn.parameters)
|
|
432
|
+
: undefined),
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return out;
|
|
438
|
+
}
|
|
439
|
+
sanitizeToolName(name) {
|
|
440
|
+
let sanitized = name.replace(/[^a-zA-Z0-9_-]/g, '_');
|
|
441
|
+
if (/^[0-9]/.test(sanitized)) {
|
|
442
|
+
sanitized = '_' + sanitized;
|
|
443
|
+
}
|
|
444
|
+
if (sanitized !== name) {
|
|
445
|
+
this.toolNameMap.set(sanitized, name);
|
|
446
|
+
}
|
|
447
|
+
return sanitized;
|
|
448
|
+
}
|
|
449
|
+
convertSchemaToJsonSchema(schema) {
|
|
450
|
+
const result = {};
|
|
451
|
+
if (schema.type) {
|
|
452
|
+
result['type'] = String(schema.type).toLowerCase();
|
|
453
|
+
}
|
|
454
|
+
if (schema.description) {
|
|
455
|
+
result['description'] = schema.description;
|
|
456
|
+
}
|
|
457
|
+
if (schema.enum) {
|
|
458
|
+
result['enum'] = schema.enum;
|
|
459
|
+
}
|
|
460
|
+
if (schema.properties) {
|
|
461
|
+
const convertedProperties = {};
|
|
462
|
+
for (const [key, value] of Object.entries(schema.properties)) {
|
|
463
|
+
convertedProperties[key] = this.convertSchemaToJsonSchema(value);
|
|
464
|
+
}
|
|
465
|
+
result['properties'] = convertedProperties;
|
|
466
|
+
}
|
|
467
|
+
if (schema.required) {
|
|
468
|
+
result['required'] = schema.required;
|
|
469
|
+
}
|
|
470
|
+
if (schema.items) {
|
|
471
|
+
result['items'] = this.convertSchemaToJsonSchema(schema.items);
|
|
472
|
+
}
|
|
473
|
+
if (schema.nullable !== undefined) {
|
|
474
|
+
result['nullable'] = schema.nullable;
|
|
475
|
+
}
|
|
476
|
+
if (schema.format) {
|
|
477
|
+
result['format'] = schema.format;
|
|
478
|
+
}
|
|
479
|
+
return result;
|
|
480
|
+
}
|
|
481
|
+
convertContentsToResponsesInput(contents) {
|
|
482
|
+
const items = [];
|
|
483
|
+
const callIdStack = {};
|
|
484
|
+
for (const content of contents) {
|
|
485
|
+
const parts = content.parts ?? [];
|
|
486
|
+
// Check for function responses first (tool outputs)
|
|
487
|
+
if (parts.some((p) => p.functionResponse)) {
|
|
488
|
+
for (const part of parts) {
|
|
489
|
+
if (part.functionResponse) {
|
|
490
|
+
const name = part.functionResponse.name || '';
|
|
491
|
+
const ids = callIdStack[name];
|
|
492
|
+
// ID linkage: consume the ID we generated for the call, or fallback
|
|
493
|
+
const callId = ids?.shift() || `call_unknown_${Date.now()}`;
|
|
494
|
+
items.push({
|
|
495
|
+
type: 'function_call_output',
|
|
496
|
+
call_id: callId,
|
|
497
|
+
output: JSON.stringify(part.functionResponse.response ?? {}),
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
continue;
|
|
502
|
+
}
|
|
503
|
+
// Check for function calls (assistant requests)
|
|
504
|
+
if (parts.some((p) => p.functionCall)) {
|
|
505
|
+
for (const part of parts) {
|
|
506
|
+
if (part.functionCall) {
|
|
507
|
+
const name = part.functionCall.name || '';
|
|
508
|
+
// Generate stable ID if provided, otherwise robust fallback
|
|
509
|
+
const callId = part.functionCall.id ||
|
|
510
|
+
`call_${name.replace(/[^a-zA-Z0-9_]/g, '')}_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`;
|
|
511
|
+
if (!callIdStack[name])
|
|
512
|
+
callIdStack[name] = [];
|
|
513
|
+
callIdStack[name].push(callId);
|
|
514
|
+
items.push({
|
|
515
|
+
type: 'function_call',
|
|
516
|
+
call_id: callId,
|
|
517
|
+
name: this.sanitizeToolName(name),
|
|
518
|
+
arguments: JSON.stringify(part.functionCall.args ?? {}),
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
if (part.text) {
|
|
522
|
+
// Assistant text accompanying tool call
|
|
523
|
+
items.push({
|
|
524
|
+
role: content.role === 'model' ? 'assistant' : 'user',
|
|
525
|
+
content: part.text,
|
|
526
|
+
});
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
continue;
|
|
530
|
+
}
|
|
531
|
+
// Standard text message
|
|
532
|
+
const textContent = parts
|
|
533
|
+
.filter((p) => p.text)
|
|
534
|
+
.map((p) => p.text)
|
|
535
|
+
.join('');
|
|
536
|
+
// Filter out system messages here? Or allow them?
|
|
537
|
+
// OpenAI Responses API generally expects user/assistant here, system via instructions.
|
|
538
|
+
// But if we encounter system here, map to 'system' just in case or skip if duplicates instructions.
|
|
539
|
+
// For now, mapping 'model' -> 'assistant', others -> 'user' (safe default)
|
|
540
|
+
// except explicit 'system' -> 'system'.
|
|
541
|
+
if (textContent) {
|
|
542
|
+
items.push({
|
|
543
|
+
role: content.role === 'model'
|
|
544
|
+
? 'assistant'
|
|
545
|
+
: content.role === 'system'
|
|
546
|
+
? 'system'
|
|
547
|
+
: 'user',
|
|
548
|
+
content: textContent,
|
|
549
|
+
});
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
return items;
|
|
553
|
+
}
|
|
554
|
+
extractTextAndToolCallsFromResponse(response) {
|
|
555
|
+
const toolCalls = [];
|
|
556
|
+
let text = '';
|
|
557
|
+
const usage = response.usage;
|
|
558
|
+
const output = response.output;
|
|
559
|
+
if (!Array.isArray(output)) {
|
|
560
|
+
return { text: '', toolCalls: [] };
|
|
561
|
+
}
|
|
562
|
+
for (const item of output) {
|
|
563
|
+
if (!this.isPlainObject(item))
|
|
564
|
+
continue;
|
|
565
|
+
const typed = item;
|
|
566
|
+
const type = typed.type;
|
|
567
|
+
if (type === 'message') {
|
|
568
|
+
const content = typed.content;
|
|
569
|
+
if (Array.isArray(content)) {
|
|
570
|
+
for (const c of content) {
|
|
571
|
+
if (!this.isPlainObject(c))
|
|
572
|
+
continue;
|
|
573
|
+
if (c['type'] === 'output_text' && typeof c['text'] === 'string') {
|
|
574
|
+
text += c['text'];
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
else if (type === 'function_call') {
|
|
580
|
+
const name = typeof typed.name === 'string' ? typed.name : '';
|
|
581
|
+
const args = typeof typed.arguments === 'string' ? typed.arguments : '{}';
|
|
582
|
+
const id = typeof typed.call_id === 'string' ? typed.call_id : undefined;
|
|
583
|
+
if (name) {
|
|
584
|
+
toolCalls.push({ id, name, arguments: args });
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
return { text, toolCalls, usage };
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
function normalizeBaseUrl(raw) {
|
|
592
|
+
const trimmed = raw.trim().replace(/\/+$/, '');
|
|
593
|
+
if (!/^https?:\/\//i.test(trimmed)) {
|
|
594
|
+
throw new Error(`ChatGPT Codex baseUrl must start with http:// or https:// (got "${raw}").`);
|
|
595
|
+
}
|
|
596
|
+
return trimmed;
|
|
597
|
+
}
|
|
598
|
+
async function ensureOk(response) {
|
|
599
|
+
if (!response.ok) {
|
|
600
|
+
const text = await response.text().catch(() => '');
|
|
601
|
+
throw new Error(`ChatGPT Codex backend error (${response.status}): ${text}`);
|
|
602
|
+
}
|
|
603
|
+
return response;
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=chatGptCodexContentGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatGptCodexContentGenerator.js","sourceRoot":"","sources":["../../../src/core/chatGptCodexContentGenerator.ts"],"names":[],"mappings":"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"}
|