oc-chatgpt-multi-auth 4.9.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.
Files changed (134) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +507 -0
  3. package/assets/opencode-logo-ornate-dark.svg +18 -0
  4. package/assets/readme-hero.svg +31 -0
  5. package/config/README.md +110 -0
  6. package/config/minimal-opencode.json +13 -0
  7. package/config/opencode-legacy.json +572 -0
  8. package/config/opencode-modern.json +240 -0
  9. package/dist/index.d.ts +45 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +971 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/lib/accounts.d.ts +120 -0
  14. package/dist/lib/accounts.d.ts.map +1 -0
  15. package/dist/lib/accounts.js +579 -0
  16. package/dist/lib/accounts.js.map +1 -0
  17. package/dist/lib/auth/auth.d.ts +51 -0
  18. package/dist/lib/auth/auth.d.ts.map +1 -0
  19. package/dist/lib/auth/auth.js +180 -0
  20. package/dist/lib/auth/auth.js.map +1 -0
  21. package/dist/lib/auth/browser.d.ts +17 -0
  22. package/dist/lib/auth/browser.d.ts.map +1 -0
  23. package/dist/lib/auth/browser.js +83 -0
  24. package/dist/lib/auth/browser.js.map +1 -0
  25. package/dist/lib/auth/server.d.ts +10 -0
  26. package/dist/lib/auth/server.d.ts.map +1 -0
  27. package/dist/lib/auth/server.js +85 -0
  28. package/dist/lib/auth/server.js.map +1 -0
  29. package/dist/lib/auto-update-checker.d.ts +10 -0
  30. package/dist/lib/auto-update-checker.d.ts.map +1 -0
  31. package/dist/lib/auto-update-checker.js +129 -0
  32. package/dist/lib/auto-update-checker.js.map +1 -0
  33. package/dist/lib/cli.d.ts +9 -0
  34. package/dist/lib/cli.d.ts.map +1 -0
  35. package/dist/lib/cli.js +50 -0
  36. package/dist/lib/cli.js.map +1 -0
  37. package/dist/lib/config.d.ts +17 -0
  38. package/dist/lib/config.d.ts.map +1 -0
  39. package/dist/lib/config.js +102 -0
  40. package/dist/lib/config.js.map +1 -0
  41. package/dist/lib/constants.d.ts +74 -0
  42. package/dist/lib/constants.d.ts.map +1 -0
  43. package/dist/lib/constants.js +74 -0
  44. package/dist/lib/constants.js.map +1 -0
  45. package/dist/lib/context-overflow.d.ts +27 -0
  46. package/dist/lib/context-overflow.d.ts.map +1 -0
  47. package/dist/lib/context-overflow.js +124 -0
  48. package/dist/lib/context-overflow.js.map +1 -0
  49. package/dist/lib/index.d.ts +13 -0
  50. package/dist/lib/index.d.ts.map +1 -0
  51. package/dist/lib/index.js +13 -0
  52. package/dist/lib/index.js.map +1 -0
  53. package/dist/lib/logger.d.ts +22 -0
  54. package/dist/lib/logger.d.ts.map +1 -0
  55. package/dist/lib/logger.js +175 -0
  56. package/dist/lib/logger.js.map +1 -0
  57. package/dist/lib/oauth-success.html +712 -0
  58. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  59. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  60. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  61. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  62. package/dist/lib/prompts/codex.d.ts +32 -0
  63. package/dist/lib/prompts/codex.d.ts.map +1 -0
  64. package/dist/lib/prompts/codex.js +262 -0
  65. package/dist/lib/prompts/codex.js.map +1 -0
  66. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  67. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  68. package/dist/lib/prompts/opencode-codex.js +91 -0
  69. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  70. package/dist/lib/recovery/constants.d.ts +12 -0
  71. package/dist/lib/recovery/constants.d.ts.map +1 -0
  72. package/dist/lib/recovery/constants.js +25 -0
  73. package/dist/lib/recovery/constants.js.map +1 -0
  74. package/dist/lib/recovery/index.d.ts +12 -0
  75. package/dist/lib/recovery/index.d.ts.map +1 -0
  76. package/dist/lib/recovery/index.js +12 -0
  77. package/dist/lib/recovery/index.js.map +1 -0
  78. package/dist/lib/recovery/storage.d.ts +24 -0
  79. package/dist/lib/recovery/storage.d.ts.map +1 -0
  80. package/dist/lib/recovery/storage.js +354 -0
  81. package/dist/lib/recovery/storage.js.map +1 -0
  82. package/dist/lib/recovery/types.d.ts +116 -0
  83. package/dist/lib/recovery/types.d.ts.map +1 -0
  84. package/dist/lib/recovery/types.js +7 -0
  85. package/dist/lib/recovery/types.js.map +1 -0
  86. package/dist/lib/recovery.d.ts +31 -0
  87. package/dist/lib/recovery.d.ts.map +1 -0
  88. package/dist/lib/recovery.js +308 -0
  89. package/dist/lib/recovery.js.map +1 -0
  90. package/dist/lib/refresh-queue.d.ts +100 -0
  91. package/dist/lib/refresh-queue.d.ts.map +1 -0
  92. package/dist/lib/refresh-queue.js +196 -0
  93. package/dist/lib/refresh-queue.js.map +1 -0
  94. package/dist/lib/request/fetch-helpers.d.ts +81 -0
  95. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  96. package/dist/lib/request/fetch-helpers.js +325 -0
  97. package/dist/lib/request/fetch-helpers.js.map +1 -0
  98. package/dist/lib/request/helpers/input-utils.d.ts +7 -0
  99. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  100. package/dist/lib/request/helpers/input-utils.js +213 -0
  101. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  102. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  103. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  104. package/dist/lib/request/helpers/model-map.js +109 -0
  105. package/dist/lib/request/helpers/model-map.js.map +1 -0
  106. package/dist/lib/request/rate-limit-backoff.d.ts +17 -0
  107. package/dist/lib/request/rate-limit-backoff.d.ts.map +1 -0
  108. package/dist/lib/request/rate-limit-backoff.js +74 -0
  109. package/dist/lib/request/rate-limit-backoff.js.map +1 -0
  110. package/dist/lib/request/request-transformer.d.ts +93 -0
  111. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  112. package/dist/lib/request/request-transformer.js +405 -0
  113. package/dist/lib/request/request-transformer.js.map +1 -0
  114. package/dist/lib/request/response-handler.d.ts +14 -0
  115. package/dist/lib/request/response-handler.d.ts.map +1 -0
  116. package/dist/lib/request/response-handler.js +90 -0
  117. package/dist/lib/request/response-handler.js.map +1 -0
  118. package/dist/lib/rotation.d.ts +121 -0
  119. package/dist/lib/rotation.d.ts.map +1 -0
  120. package/dist/lib/rotation.js +248 -0
  121. package/dist/lib/rotation.js.map +1 -0
  122. package/dist/lib/storage.d.ts +91 -0
  123. package/dist/lib/storage.d.ts.map +1 -0
  124. package/dist/lib/storage.js +323 -0
  125. package/dist/lib/storage.js.map +1 -0
  126. package/dist/lib/types.d.ts +185 -0
  127. package/dist/lib/types.d.ts.map +1 -0
  128. package/dist/lib/types.js +2 -0
  129. package/dist/lib/types.js.map +1 -0
  130. package/package.json +86 -0
  131. package/scripts/copy-oauth-success.js +37 -0
  132. package/scripts/install-opencode-codex-auth.js +193 -0
  133. package/scripts/test-all-models.sh +260 -0
  134. package/scripts/validate-model-map.sh +97 -0
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Helper functions for the custom fetch implementation
3
+ * These functions break down the complex fetch logic into manageable, testable units
4
+ */
5
+ import type { Auth, OpencodeClient } from "@opencode-ai/sdk";
6
+ import type { UserConfig, RequestBody } from "../types.js";
7
+ export interface RateLimitInfo {
8
+ retryAfterMs: number;
9
+ code?: string;
10
+ }
11
+ export interface ErrorHandlingResult {
12
+ response: Response;
13
+ rateLimit?: RateLimitInfo;
14
+ errorBody?: unknown;
15
+ }
16
+ /**
17
+ * Determines if the current auth token needs to be refreshed
18
+ * @param auth - Current authentication state
19
+ * @returns True if token is expired or invalid
20
+ */
21
+ export declare function shouldRefreshToken(auth: Auth, skewMs?: number): boolean;
22
+ /**
23
+ * Refreshes the OAuth token and updates stored credentials
24
+ * @param currentAuth - Current auth state
25
+ * @param client - Opencode client for updating stored credentials
26
+ * @returns Updated auth (throws on failure)
27
+ */
28
+ export declare function refreshAndUpdateToken(currentAuth: Auth, client: OpencodeClient): Promise<Auth>;
29
+ /**
30
+ * Extracts URL string from various request input types
31
+ * @param input - Request input (string, URL, or Request object)
32
+ * @returns URL string
33
+ */
34
+ export declare function extractRequestUrl(input: Request | string | URL): string;
35
+ /**
36
+ * Rewrites OpenAI API URLs to Codex backend URLs
37
+ * @param url - Original URL
38
+ * @returns Rewritten URL for Codex backend
39
+ */
40
+ export declare function rewriteUrlForCodex(url: string): string;
41
+ /**
42
+ * Transforms request body and logs the transformation
43
+ * Fetches model-specific Codex instructions based on the request model
44
+ *
45
+ * @param init - Request init options
46
+ * @param url - Request URL
47
+ * @param userConfig - User configuration
48
+ * @param codexMode - Enable CODEX_MODE (bridge prompt instead of tool remap)
49
+ * @returns Transformed body and updated init, or undefined if no body
50
+ */
51
+ export declare function transformRequestForCodex(init: RequestInit | undefined, url: string, userConfig: UserConfig, codexMode?: boolean): Promise<{
52
+ body: RequestBody;
53
+ updatedInit: RequestInit;
54
+ } | undefined>;
55
+ /**
56
+ * Creates headers for Codex API requests
57
+ * @param init - Request init options
58
+ * @param accountId - ChatGPT account ID
59
+ * @param accessToken - OAuth access token
60
+ * @returns Headers object with all required Codex headers
61
+ */
62
+ export declare function createCodexHeaders(init: RequestInit | undefined, accountId: string, accessToken: string, opts?: {
63
+ model?: string;
64
+ promptCacheKey?: string;
65
+ }): Headers;
66
+ /**
67
+ * Handles error responses from the Codex API
68
+ * @param response - Error response from API
69
+ * @returns Original response or mapped retryable response
70
+ */
71
+ export declare function handleErrorResponse(response: Response): Promise<ErrorHandlingResult>;
72
+ /**
73
+ * Handles successful responses from the Codex API
74
+ * Converts SSE to JSON for non-streaming requests (generateText)
75
+ * Passes through SSE for streaming requests (streamText)
76
+ * @param response - Success response from API
77
+ * @param isStreaming - Whether this is a streaming request (stream=true in body)
78
+ * @returns Processed response (SSE→JSON for non-streaming, stream for streaming)
79
+ */
80
+ export declare function handleSuccessResponse(response: Response, isStreaming: boolean): Promise<Response>;
81
+ //# sourceMappingURL=fetch-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-helpers.d.ts","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAM7D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW3D,MAAM,WAAW,aAAa;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAC5B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,SAAI,GAAG,OAAO,CAMlE;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAC1C,WAAW,EAAE,IAAI,EACjB,MAAM,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,GAAG,GAAG,MAAM,CAIvE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC7C,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,UAAU,EACtB,SAAS,UAAO,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAAG,SAAS,CAAC,CA0DtE;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,WAAW,GAAG,SAAS,EAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD,OAAO,CAkBT;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,GACvB,OAAO,CAAC,mBAAmB,CAAC,CAmB9B;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,OAAO,GACrB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Helper functions for the custom fetch implementation
3
+ * These functions break down the complex fetch logic into manageable, testable units
4
+ */
5
+ import { queuedRefresh } from "../refresh-queue.js";
6
+ import { logRequest } from "../logger.js";
7
+ import { getCodexInstructions, getModelFamily } from "../prompts/codex.js";
8
+ import { transformRequestBody, normalizeModel } from "./request-transformer.js";
9
+ import { convertSseToJson, ensureContentType } from "./response-handler.js";
10
+ import { PLUGIN_NAME, HTTP_STATUS, OPENAI_HEADERS, OPENAI_HEADER_VALUES, URL_PATHS, ERROR_MESSAGES, LOG_STAGES, } from "../constants.js";
11
+ /**
12
+ * Determines if the current auth token needs to be refreshed
13
+ * @param auth - Current authentication state
14
+ * @returns True if token is expired or invalid
15
+ */
16
+ export function shouldRefreshToken(auth, skewMs = 0) {
17
+ if (auth.type !== "oauth")
18
+ return true;
19
+ if (!auth.access)
20
+ return true;
21
+ const safeSkewMs = Math.max(0, Math.floor(skewMs));
22
+ return auth.expires <= Date.now() + safeSkewMs;
23
+ }
24
+ /**
25
+ * Refreshes the OAuth token and updates stored credentials
26
+ * @param currentAuth - Current auth state
27
+ * @param client - Opencode client for updating stored credentials
28
+ * @returns Updated auth (throws on failure)
29
+ */
30
+ export async function refreshAndUpdateToken(currentAuth, client) {
31
+ const refreshToken = currentAuth.type === "oauth" ? currentAuth.refresh : "";
32
+ const refreshResult = await queuedRefresh(refreshToken);
33
+ if (refreshResult.type === "failed") {
34
+ throw new Error(ERROR_MESSAGES.TOKEN_REFRESH_FAILED);
35
+ }
36
+ await client.auth.set({
37
+ path: { id: "openai" },
38
+ body: {
39
+ type: "oauth",
40
+ access: refreshResult.access,
41
+ refresh: refreshResult.refresh,
42
+ expires: refreshResult.expires,
43
+ multiAccount: true,
44
+ },
45
+ });
46
+ // Update current auth reference if it's OAuth type
47
+ if (currentAuth.type === "oauth") {
48
+ currentAuth.access = refreshResult.access;
49
+ currentAuth.refresh = refreshResult.refresh;
50
+ currentAuth.expires = refreshResult.expires;
51
+ }
52
+ return currentAuth;
53
+ }
54
+ /**
55
+ * Extracts URL string from various request input types
56
+ * @param input - Request input (string, URL, or Request object)
57
+ * @returns URL string
58
+ */
59
+ export function extractRequestUrl(input) {
60
+ if (typeof input === "string")
61
+ return input;
62
+ if (input instanceof URL)
63
+ return input.toString();
64
+ return input.url;
65
+ }
66
+ /**
67
+ * Rewrites OpenAI API URLs to Codex backend URLs
68
+ * @param url - Original URL
69
+ * @returns Rewritten URL for Codex backend
70
+ */
71
+ export function rewriteUrlForCodex(url) {
72
+ return url.replace(URL_PATHS.RESPONSES, URL_PATHS.CODEX_RESPONSES);
73
+ }
74
+ /**
75
+ * Transforms request body and logs the transformation
76
+ * Fetches model-specific Codex instructions based on the request model
77
+ *
78
+ * @param init - Request init options
79
+ * @param url - Request URL
80
+ * @param userConfig - User configuration
81
+ * @param codexMode - Enable CODEX_MODE (bridge prompt instead of tool remap)
82
+ * @returns Transformed body and updated init, or undefined if no body
83
+ */
84
+ export async function transformRequestForCodex(init, url, userConfig, codexMode = true) {
85
+ if (!init?.body)
86
+ return undefined;
87
+ try {
88
+ const body = JSON.parse(init.body);
89
+ const originalModel = body.model;
90
+ // Normalize model first to determine which instructions to fetch
91
+ // This ensures we get the correct model-specific prompt
92
+ const normalizedModel = normalizeModel(originalModel);
93
+ const modelFamily = getModelFamily(normalizedModel);
94
+ // Log original request
95
+ logRequest(LOG_STAGES.BEFORE_TRANSFORM, {
96
+ url,
97
+ originalModel,
98
+ model: body.model,
99
+ hasTools: !!body.tools,
100
+ hasInput: !!body.input,
101
+ inputLength: body.input?.length,
102
+ codexMode,
103
+ body: body,
104
+ });
105
+ // Fetch model-specific Codex instructions (cached per model family)
106
+ const codexInstructions = await getCodexInstructions(normalizedModel);
107
+ // Transform request body
108
+ const transformedBody = await transformRequestBody(body, codexInstructions, userConfig, codexMode);
109
+ // Log transformed request
110
+ logRequest(LOG_STAGES.AFTER_TRANSFORM, {
111
+ url,
112
+ originalModel,
113
+ normalizedModel: transformedBody.model,
114
+ modelFamily,
115
+ hasTools: !!transformedBody.tools,
116
+ hasInput: !!transformedBody.input,
117
+ inputLength: transformedBody.input?.length,
118
+ reasoning: transformedBody.reasoning,
119
+ textVerbosity: transformedBody.text?.verbosity,
120
+ include: transformedBody.include,
121
+ body: transformedBody,
122
+ });
123
+ return {
124
+ body: transformedBody,
125
+ updatedInit: { ...init, body: JSON.stringify(transformedBody) },
126
+ };
127
+ }
128
+ catch (e) {
129
+ console.error(`[${PLUGIN_NAME}] ${ERROR_MESSAGES.REQUEST_PARSE_ERROR}:`, e);
130
+ return undefined;
131
+ }
132
+ }
133
+ /**
134
+ * Creates headers for Codex API requests
135
+ * @param init - Request init options
136
+ * @param accountId - ChatGPT account ID
137
+ * @param accessToken - OAuth access token
138
+ * @returns Headers object with all required Codex headers
139
+ */
140
+ export function createCodexHeaders(init, accountId, accessToken, opts) {
141
+ const headers = new Headers(init?.headers ?? {});
142
+ headers.delete("x-api-key"); // Remove any existing API key
143
+ headers.set("Authorization", `Bearer ${accessToken}`);
144
+ headers.set(OPENAI_HEADERS.ACCOUNT_ID, accountId);
145
+ headers.set(OPENAI_HEADERS.BETA, OPENAI_HEADER_VALUES.BETA_RESPONSES);
146
+ headers.set(OPENAI_HEADERS.ORIGINATOR, OPENAI_HEADER_VALUES.ORIGINATOR_CODEX);
147
+ const cacheKey = opts?.promptCacheKey;
148
+ if (cacheKey) {
149
+ headers.set(OPENAI_HEADERS.CONVERSATION_ID, cacheKey);
150
+ headers.set(OPENAI_HEADERS.SESSION_ID, cacheKey);
151
+ }
152
+ else {
153
+ headers.delete(OPENAI_HEADERS.CONVERSATION_ID);
154
+ headers.delete(OPENAI_HEADERS.SESSION_ID);
155
+ }
156
+ headers.set("accept", "text/event-stream");
157
+ return headers;
158
+ }
159
+ /**
160
+ * Handles error responses from the Codex API
161
+ * @param response - Error response from API
162
+ * @returns Original response or mapped retryable response
163
+ */
164
+ export async function handleErrorResponse(response) {
165
+ const bodyText = await safeReadBody(response);
166
+ const mapped = mapUsageLimit404WithBody(response, bodyText);
167
+ const finalResponse = mapped ?? response;
168
+ const rateLimit = extractRateLimitInfoFromBody(finalResponse, bodyText);
169
+ let errorBody;
170
+ try {
171
+ errorBody = bodyText ? JSON.parse(bodyText) : undefined;
172
+ }
173
+ catch {
174
+ errorBody = { message: bodyText };
175
+ }
176
+ logRequest(LOG_STAGES.ERROR_RESPONSE, {
177
+ status: finalResponse.status,
178
+ statusText: finalResponse.statusText,
179
+ });
180
+ return { response: finalResponse, rateLimit, errorBody };
181
+ }
182
+ /**
183
+ * Handles successful responses from the Codex API
184
+ * Converts SSE to JSON for non-streaming requests (generateText)
185
+ * Passes through SSE for streaming requests (streamText)
186
+ * @param response - Success response from API
187
+ * @param isStreaming - Whether this is a streaming request (stream=true in body)
188
+ * @returns Processed response (SSE→JSON for non-streaming, stream for streaming)
189
+ */
190
+ export async function handleSuccessResponse(response, isStreaming) {
191
+ const responseHeaders = ensureContentType(response.headers);
192
+ // For non-streaming requests (generateText), convert SSE to JSON
193
+ if (!isStreaming) {
194
+ return await convertSseToJson(response, responseHeaders);
195
+ }
196
+ // For streaming requests (streamText), return stream as-is
197
+ return new Response(response.body, {
198
+ status: response.status,
199
+ statusText: response.statusText,
200
+ headers: responseHeaders,
201
+ });
202
+ }
203
+ async function safeReadBody(response) {
204
+ try {
205
+ return await response.clone().text();
206
+ }
207
+ catch {
208
+ return "";
209
+ }
210
+ }
211
+ function mapUsageLimit404WithBody(response, bodyText) {
212
+ if (response.status !== HTTP_STATUS.NOT_FOUND)
213
+ return null;
214
+ if (!bodyText)
215
+ return null;
216
+ let code = "";
217
+ try {
218
+ const parsed = JSON.parse(bodyText);
219
+ code = (parsed?.error?.code ?? parsed?.error?.type ?? "").toString();
220
+ }
221
+ catch {
222
+ code = "";
223
+ }
224
+ const haystack = `${code} ${bodyText}`.toLowerCase();
225
+ if (!/usage_limit_reached|usage_not_included|rate_limit_exceeded|usage limit/i.test(haystack)) {
226
+ return null;
227
+ }
228
+ const headers = new Headers(response.headers);
229
+ return new Response(bodyText, {
230
+ status: HTTP_STATUS.TOO_MANY_REQUESTS,
231
+ statusText: "Too Many Requests",
232
+ headers,
233
+ });
234
+ }
235
+ function extractRateLimitInfoFromBody(response, bodyText) {
236
+ const isStatusRateLimit = response.status === HTTP_STATUS.TOO_MANY_REQUESTS;
237
+ const parsed = parseRateLimitBody(bodyText);
238
+ const haystack = `${parsed?.code ?? ""} ${bodyText}`.toLowerCase();
239
+ const isRateLimit = isStatusRateLimit ||
240
+ /usage_limit_reached|usage_not_included|rate_limit_exceeded|rate_limit/i.test(haystack);
241
+ if (!isRateLimit)
242
+ return undefined;
243
+ const retryAfterMs = parseRetryAfterMs(response, parsed) ?? 60000;
244
+ return { retryAfterMs, code: parsed?.code };
245
+ }
246
+ function parseRateLimitBody(body) {
247
+ if (!body)
248
+ return undefined;
249
+ try {
250
+ const parsed = JSON.parse(body);
251
+ const error = parsed?.error ?? {};
252
+ const code = (error.code ?? error.type ?? "").toString();
253
+ const resetsAt = toNumber(error.resets_at ?? error.reset_at);
254
+ const retryAfterMs = toNumber(error.retry_after_ms ?? error.retry_after);
255
+ return { code, resetsAt, retryAfterMs };
256
+ }
257
+ catch {
258
+ return undefined;
259
+ }
260
+ }
261
+ function parseRetryAfterMs(response, parsedBody) {
262
+ if (parsedBody?.retryAfterMs !== undefined) {
263
+ return normalizeRetryAfter(parsedBody.retryAfterMs);
264
+ }
265
+ const retryAfterMsHeader = response.headers.get("retry-after-ms");
266
+ if (retryAfterMsHeader) {
267
+ const parsed = Number.parseInt(retryAfterMsHeader, 10);
268
+ if (!Number.isNaN(parsed) && parsed > 0) {
269
+ return parsed;
270
+ }
271
+ }
272
+ const retryAfterHeader = response.headers.get("retry-after");
273
+ if (retryAfterHeader) {
274
+ const parsed = Number.parseInt(retryAfterHeader, 10);
275
+ if (!Number.isNaN(parsed) && parsed > 0) {
276
+ return parsed * 1000;
277
+ }
278
+ }
279
+ const resetAtHeaders = [
280
+ "x-codex-primary-reset-at",
281
+ "x-codex-secondary-reset-at",
282
+ "x-ratelimit-reset",
283
+ ];
284
+ const now = Date.now();
285
+ const resetCandidates = [];
286
+ for (const header of resetAtHeaders) {
287
+ const value = response.headers.get(header);
288
+ if (!value)
289
+ continue;
290
+ const parsed = Number.parseInt(value, 10);
291
+ if (!Number.isNaN(parsed) && parsed > 0) {
292
+ const timestamp = parsed < 10_000_000_000 ? parsed * 1000 : parsed;
293
+ const delta = timestamp - now;
294
+ if (delta > 0)
295
+ resetCandidates.push(delta);
296
+ }
297
+ }
298
+ if (parsedBody?.resetsAt) {
299
+ const timestamp = parsedBody.resetsAt < 10_000_000_000
300
+ ? parsedBody.resetsAt * 1000
301
+ : parsedBody.resetsAt;
302
+ const delta = timestamp - now;
303
+ if (delta > 0)
304
+ resetCandidates.push(delta);
305
+ }
306
+ if (resetCandidates.length > 0) {
307
+ return Math.min(...resetCandidates);
308
+ }
309
+ return null;
310
+ }
311
+ function normalizeRetryAfter(value) {
312
+ if (!Number.isFinite(value))
313
+ return 60000;
314
+ if (value > 0 && value < 1000) {
315
+ return Math.floor(value * 1000);
316
+ }
317
+ return Math.floor(value);
318
+ }
319
+ function toNumber(value) {
320
+ if (value === null || value === undefined)
321
+ return undefined;
322
+ const parsed = Number(value);
323
+ return Number.isFinite(parsed) ? parsed : undefined;
324
+ }
325
+ //# sourceMappingURL=fetch-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-helpers.js","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { InputItem } from "../../types.js";
2
+ export declare const getContentText: (item: InputItem) => string;
3
+ export declare function isOpenCodeSystemPrompt(item: InputItem, cachedPrompt: string | null): boolean;
4
+ export declare function filterOpenCodeSystemPromptsWithCachedPrompt(input: InputItem[] | undefined, cachedPrompt: string | null): InputItem[] | undefined;
5
+ export declare const normalizeOrphanedToolOutputs: (input: InputItem[]) => InputItem[];
6
+ export declare const injectMissingToolOutputs: (input: InputItem[]) => InputItem[];
7
+ //# sourceMappingURL=input-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-utils.d.ts","sourceRoot":"","sources":["../../../../lib/request/helpers/input-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAiBhD,eAAO,MAAM,cAAc,GAAI,MAAM,SAAS,KAAG,MAWhD,CAAC;AA8BF,wBAAgB,sBAAsB,CACrC,IAAI,EAAE,SAAS,EACf,YAAY,EAAE,MAAM,GAAG,IAAI,GACzB,OAAO,CA6BT;AAED,wBAAgB,2CAA2C,CAC1D,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,GACzB,SAAS,EAAE,GAAG,SAAS,CAkBzB;AA6DD,eAAO,MAAM,4BAA4B,GACxC,OAAO,SAAS,EAAE,KAChB,SAAS,EAiCX,CAAC;AAmBF,eAAO,MAAM,wBAAwB,GAAI,OAAO,SAAS,EAAE,KAAG,SAAS,EA+BtE,CAAC"}
@@ -0,0 +1,213 @@
1
+ const OPENCODE_PROMPT_SIGNATURES = [
2
+ "you are a coding agent running in the opencode",
3
+ "you are opencode, an agent",
4
+ "you are opencode, an interactive cli agent",
5
+ "you are opencode, an interactive cli tool",
6
+ "you are opencode, the best coding agent on the planet",
7
+ ].map((signature) => signature.toLowerCase());
8
+ const OPENCODE_CONTEXT_MARKERS = [
9
+ "here is some useful information about the environment you are running in:",
10
+ "<env>",
11
+ "instructions from:",
12
+ "<instructions>",
13
+ ].map((marker) => marker.toLowerCase());
14
+ export const getContentText = (item) => {
15
+ if (typeof item.content === "string") {
16
+ return item.content;
17
+ }
18
+ if (Array.isArray(item.content)) {
19
+ return item.content
20
+ .filter((c) => c.type === "input_text" && c.text)
21
+ .map((c) => c.text)
22
+ .join("\n");
23
+ }
24
+ return "";
25
+ };
26
+ const replaceContentText = (item, contentText) => {
27
+ if (typeof item.content === "string") {
28
+ return { ...item, content: contentText };
29
+ }
30
+ if (Array.isArray(item.content)) {
31
+ return {
32
+ ...item,
33
+ content: [{ type: "input_text", text: contentText }],
34
+ };
35
+ }
36
+ return { ...item, content: contentText };
37
+ };
38
+ const extractOpenCodeContext = (contentText) => {
39
+ const lower = contentText.toLowerCase();
40
+ let earliestIndex = -1;
41
+ for (const marker of OPENCODE_CONTEXT_MARKERS) {
42
+ const index = lower.indexOf(marker);
43
+ if (index >= 0 && (earliestIndex === -1 || index < earliestIndex)) {
44
+ earliestIndex = index;
45
+ }
46
+ }
47
+ if (earliestIndex === -1)
48
+ return null;
49
+ return contentText.slice(earliestIndex).trimStart();
50
+ };
51
+ export function isOpenCodeSystemPrompt(item, cachedPrompt) {
52
+ const isSystemRole = item.role === "developer" || item.role === "system";
53
+ if (!isSystemRole)
54
+ return false;
55
+ const contentText = getContentText(item);
56
+ if (!contentText)
57
+ return false;
58
+ if (cachedPrompt) {
59
+ const contentTrimmed = contentText.trim();
60
+ const cachedTrimmed = cachedPrompt.trim();
61
+ if (contentTrimmed === cachedTrimmed) {
62
+ return true;
63
+ }
64
+ if (contentTrimmed.startsWith(cachedTrimmed)) {
65
+ return true;
66
+ }
67
+ const contentPrefix = contentTrimmed.substring(0, 200);
68
+ const cachedPrefix = cachedTrimmed.substring(0, 200);
69
+ if (contentPrefix === cachedPrefix) {
70
+ return true;
71
+ }
72
+ }
73
+ const normalized = contentText.trimStart().toLowerCase();
74
+ return OPENCODE_PROMPT_SIGNATURES.some((signature) => normalized.startsWith(signature));
75
+ }
76
+ export function filterOpenCodeSystemPromptsWithCachedPrompt(input, cachedPrompt) {
77
+ if (!Array.isArray(input))
78
+ return input;
79
+ return input.flatMap((item) => {
80
+ if (item.role === "user")
81
+ return [item];
82
+ if (!isOpenCodeSystemPrompt(item, cachedPrompt)) {
83
+ return [item];
84
+ }
85
+ const contentText = getContentText(item);
86
+ const preservedContext = extractOpenCodeContext(contentText);
87
+ if (preservedContext) {
88
+ return [replaceContentText(item, preservedContext)];
89
+ }
90
+ return [];
91
+ });
92
+ }
93
+ const getCallId = (item) => {
94
+ const rawCallId = item.call_id;
95
+ if (typeof rawCallId !== "string")
96
+ return null;
97
+ const trimmed = rawCallId.trim();
98
+ return trimmed.length > 0 ? trimmed : null;
99
+ };
100
+ const convertOrphanedOutputToMessage = (item, callId) => {
101
+ const toolName = typeof item.name === "string"
102
+ ? item.name
103
+ : "tool";
104
+ const labelCallId = callId ?? "unknown";
105
+ let text;
106
+ try {
107
+ const out = item.output;
108
+ text = typeof out === "string" ? out : JSON.stringify(out);
109
+ }
110
+ catch {
111
+ text = String(item.output ?? "");
112
+ }
113
+ if (text.length > 16000) {
114
+ text = text.slice(0, 16000) + "\n...[truncated]";
115
+ }
116
+ return {
117
+ type: "message",
118
+ role: "assistant",
119
+ content: `[Previous ${toolName} result; call_id=${labelCallId}]: ${text}`,
120
+ };
121
+ };
122
+ const collectCallIds = (input) => {
123
+ const functionCallIds = new Set();
124
+ const localShellCallIds = new Set();
125
+ const customToolCallIds = new Set();
126
+ for (const item of input) {
127
+ const callId = getCallId(item);
128
+ if (!callId)
129
+ continue;
130
+ switch (item.type) {
131
+ case "function_call":
132
+ functionCallIds.add(callId);
133
+ break;
134
+ case "local_shell_call":
135
+ localShellCallIds.add(callId);
136
+ break;
137
+ case "custom_tool_call":
138
+ customToolCallIds.add(callId);
139
+ break;
140
+ default:
141
+ break;
142
+ }
143
+ }
144
+ return { functionCallIds, localShellCallIds, customToolCallIds };
145
+ };
146
+ export const normalizeOrphanedToolOutputs = (input) => {
147
+ const { functionCallIds, localShellCallIds, customToolCallIds } = collectCallIds(input);
148
+ return input.map((item) => {
149
+ if (item.type === "function_call_output") {
150
+ const callId = getCallId(item);
151
+ const hasMatch = !!callId &&
152
+ (functionCallIds.has(callId) || localShellCallIds.has(callId));
153
+ if (!hasMatch) {
154
+ return convertOrphanedOutputToMessage(item, callId);
155
+ }
156
+ }
157
+ if (item.type === "custom_tool_call_output") {
158
+ const callId = getCallId(item);
159
+ const hasMatch = !!callId && customToolCallIds.has(callId);
160
+ if (!hasMatch) {
161
+ return convertOrphanedOutputToMessage(item, callId);
162
+ }
163
+ }
164
+ if (item.type === "local_shell_call_output") {
165
+ const callId = getCallId(item);
166
+ const hasMatch = !!callId && localShellCallIds.has(callId);
167
+ if (!hasMatch) {
168
+ return convertOrphanedOutputToMessage(item, callId);
169
+ }
170
+ }
171
+ return item;
172
+ });
173
+ };
174
+ const CANCELLED_TOOL_OUTPUT = "Operation cancelled by user";
175
+ const collectOutputCallIds = (input) => {
176
+ const outputCallIds = new Set();
177
+ for (const item of input) {
178
+ if (item.type === "function_call_output" ||
179
+ item.type === "local_shell_call_output" ||
180
+ item.type === "custom_tool_call_output") {
181
+ const callId = getCallId(item);
182
+ if (callId)
183
+ outputCallIds.add(callId);
184
+ }
185
+ }
186
+ return outputCallIds;
187
+ };
188
+ export const injectMissingToolOutputs = (input) => {
189
+ const outputCallIds = collectOutputCallIds(input);
190
+ const result = [];
191
+ for (const item of input) {
192
+ result.push(item);
193
+ if (item.type === "function_call" ||
194
+ item.type === "local_shell_call" ||
195
+ item.type === "custom_tool_call") {
196
+ const callId = getCallId(item);
197
+ if (callId && !outputCallIds.has(callId)) {
198
+ const outputType = item.type === "function_call"
199
+ ? "function_call_output"
200
+ : item.type === "local_shell_call"
201
+ ? "local_shell_call_output"
202
+ : "custom_tool_call_output";
203
+ result.push({
204
+ type: outputType,
205
+ call_id: callId,
206
+ output: CANCELLED_TOOL_OUTPUT,
207
+ });
208
+ }
209
+ }
210
+ }
211
+ return result;
212
+ };
213
+ //# sourceMappingURL=input-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-utils.js","sourceRoot":"","sources":["../../../../lib/request/helpers/input-utils.ts"],"names":[],"mappings":"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"}