opencode-openai-codex-multi-auth 4.4.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 (90) hide show
  1. package/LICENSE +37 -0
  2. package/README.md +89 -0
  3. package/assets/openai-codex-auth-config.schema.json +63 -0
  4. package/assets/opencode-logo-ornate-dark.svg +18 -0
  5. package/assets/readme-hero.svg +31 -0
  6. package/config/README.md +103 -0
  7. package/config/minimal-opencode.json +12 -0
  8. package/config/opencode-legacy.json +571 -0
  9. package/config/opencode-modern.json +239 -0
  10. package/dist/index.d.ts +42 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +564 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/accounts.d.ts +58 -0
  15. package/dist/lib/accounts.d.ts.map +1 -0
  16. package/dist/lib/accounts.js +405 -0
  17. package/dist/lib/accounts.js.map +1 -0
  18. package/dist/lib/auth/auth.d.ts +43 -0
  19. package/dist/lib/auth/auth.d.ts.map +1 -0
  20. package/dist/lib/auth/auth.js +163 -0
  21. package/dist/lib/auth/auth.js.map +1 -0
  22. package/dist/lib/auth/browser.d.ts +17 -0
  23. package/dist/lib/auth/browser.d.ts.map +1 -0
  24. package/dist/lib/auth/browser.js +76 -0
  25. package/dist/lib/auth/browser.js.map +1 -0
  26. package/dist/lib/auth/server.d.ts +10 -0
  27. package/dist/lib/auth/server.d.ts.map +1 -0
  28. package/dist/lib/auth/server.js +78 -0
  29. package/dist/lib/auth/server.js.map +1 -0
  30. package/dist/lib/cli.d.ts +8 -0
  31. package/dist/lib/cli.d.ts.map +1 -0
  32. package/dist/lib/cli.js +36 -0
  33. package/dist/lib/cli.js.map +1 -0
  34. package/dist/lib/config.d.ts +25 -0
  35. package/dist/lib/config.d.ts.map +1 -0
  36. package/dist/lib/config.js +112 -0
  37. package/dist/lib/config.js.map +1 -0
  38. package/dist/lib/constants.d.ts +67 -0
  39. package/dist/lib/constants.d.ts.map +1 -0
  40. package/dist/lib/constants.js +67 -0
  41. package/dist/lib/constants.js.map +1 -0
  42. package/dist/lib/logger.d.ts +21 -0
  43. package/dist/lib/logger.d.ts.map +1 -0
  44. package/dist/lib/logger.js +77 -0
  45. package/dist/lib/logger.js.map +1 -0
  46. package/dist/lib/oauth-success.html +712 -0
  47. package/dist/lib/prompts/codex-opencode-bridge.d.ts +19 -0
  48. package/dist/lib/prompts/codex-opencode-bridge.d.ts.map +1 -0
  49. package/dist/lib/prompts/codex-opencode-bridge.js +152 -0
  50. package/dist/lib/prompts/codex-opencode-bridge.js.map +1 -0
  51. package/dist/lib/prompts/codex.d.ts +28 -0
  52. package/dist/lib/prompts/codex.d.ts.map +1 -0
  53. package/dist/lib/prompts/codex.js +248 -0
  54. package/dist/lib/prompts/codex.js.map +1 -0
  55. package/dist/lib/prompts/opencode-codex.d.ts +21 -0
  56. package/dist/lib/prompts/opencode-codex.d.ts.map +1 -0
  57. package/dist/lib/prompts/opencode-codex.js +91 -0
  58. package/dist/lib/prompts/opencode-codex.js.map +1 -0
  59. package/dist/lib/request/fetch-helpers.d.ts +73 -0
  60. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  61. package/dist/lib/request/fetch-helpers.js +221 -0
  62. package/dist/lib/request/fetch-helpers.js.map +1 -0
  63. package/dist/lib/request/helpers/input-utils.d.ts +6 -0
  64. package/dist/lib/request/helpers/input-utils.d.ts.map +1 -0
  65. package/dist/lib/request/helpers/input-utils.js +174 -0
  66. package/dist/lib/request/helpers/input-utils.js.map +1 -0
  67. package/dist/lib/request/helpers/model-map.d.ts +28 -0
  68. package/dist/lib/request/helpers/model-map.d.ts.map +1 -0
  69. package/dist/lib/request/helpers/model-map.js +109 -0
  70. package/dist/lib/request/helpers/model-map.js.map +1 -0
  71. package/dist/lib/request/request-transformer.d.ts +93 -0
  72. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  73. package/dist/lib/request/request-transformer.js +403 -0
  74. package/dist/lib/request/request-transformer.js.map +1 -0
  75. package/dist/lib/request/response-handler.d.ts +14 -0
  76. package/dist/lib/request/response-handler.d.ts.map +1 -0
  77. package/dist/lib/request/response-handler.js +88 -0
  78. package/dist/lib/request/response-handler.js.map +1 -0
  79. package/dist/lib/storage.d.ts +5 -0
  80. package/dist/lib/storage.d.ts.map +1 -0
  81. package/dist/lib/storage.js +46 -0
  82. package/dist/lib/storage.js.map +1 -0
  83. package/dist/lib/types.d.ts +236 -0
  84. package/dist/lib/types.d.ts.map +1 -0
  85. package/dist/lib/types.js +2 -0
  86. package/dist/lib/types.js.map +1 -0
  87. package/package.json +77 -0
  88. package/scripts/install-opencode-codex-auth.js +450 -0
  89. package/scripts/test-all-models.sh +259 -0
  90. package/scripts/validate-model-map.sh +97 -0
@@ -0,0 +1,73 @@
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 } from "@opencode-ai/sdk";
6
+ import type { OpencodeClient } from "@opencode-ai/sdk";
7
+ import type { UserConfig, RequestBody } from "../types.js";
8
+ /**
9
+ * Determines if the current auth token needs to be refreshed
10
+ * @param auth - Current authentication state
11
+ * @returns True if token is expired or invalid
12
+ */
13
+ export declare function shouldRefreshToken(auth: Auth): boolean;
14
+ /**
15
+ * Refreshes the OAuth token and updates stored credentials
16
+ * @param currentAuth - Current auth state
17
+ * @param client - Opencode client for updating stored credentials
18
+ * @returns Updated auth (throws on failure)
19
+ */
20
+ export declare function refreshAndUpdateToken(currentAuth: Auth, client: OpencodeClient): Promise<Auth>;
21
+ /**
22
+ * Extracts URL string from various request input types
23
+ * @param input - Request input (string, URL, or Request object)
24
+ * @returns URL string
25
+ */
26
+ export declare function extractRequestUrl(input: Request | string | URL): string;
27
+ /**
28
+ * Rewrites OpenAI API URLs to Codex backend URLs
29
+ * @param url - Original URL
30
+ * @returns Rewritten URL for Codex backend
31
+ */
32
+ export declare function rewriteUrlForCodex(url: string): string;
33
+ /**
34
+ * Transforms request body and logs the transformation
35
+ * Fetches model-specific Codex instructions based on the request model
36
+ *
37
+ * @param init - Request init options
38
+ * @param url - Request URL
39
+ * @param userConfig - User configuration
40
+ * @param codexMode - Enable CODEX_MODE (bridge prompt instead of tool remap)
41
+ * @returns Transformed body and updated init, or undefined if no body
42
+ */
43
+ export declare function transformRequestForCodex(init: RequestInit | undefined, url: string, userConfig: UserConfig, codexMode?: boolean): Promise<{
44
+ body: RequestBody;
45
+ updatedInit: RequestInit;
46
+ } | undefined>;
47
+ /**
48
+ * Creates headers for Codex API requests
49
+ * @param init - Request init options
50
+ * @param accountId - ChatGPT account ID
51
+ * @param accessToken - OAuth access token
52
+ * @returns Headers object with all required Codex headers
53
+ */
54
+ export declare function createCodexHeaders(init: RequestInit | undefined, accountId: string, accessToken: string, opts?: {
55
+ model?: string;
56
+ promptCacheKey?: string;
57
+ }): Headers;
58
+ /**
59
+ * Handles error responses from the Codex API
60
+ * @param response - Error response from API
61
+ * @returns Original response or mapped retryable response
62
+ */
63
+ export declare function handleErrorResponse(response: Response): Promise<Response>;
64
+ /**
65
+ * Handles successful responses from the Codex API
66
+ * Converts SSE to JSON for non-streaming requests (generateText)
67
+ * Passes through SSE for streaming requests (streamText)
68
+ * @param response - Success response from API
69
+ * @param isStreaming - Whether this is a streaming request (stream=true in body)
70
+ * @returns Processed response (SSE→JSON for non-streaming, stream for streaming)
71
+ */
72
+ export declare function handleSuccessResponse(response: Response, isStreaming: boolean): Promise<Response>;
73
+ //# 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,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW3D;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAEtD;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,CACrC,QAAQ,EAAE,QAAQ,GACnB,OAAO,CAAC,QAAQ,CAAC,CAUnB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,OAAO,GACrB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
@@ -0,0 +1,221 @@
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 { refreshAccessToken } from "../auth/auth.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) {
17
+ return auth.type !== "oauth" || !auth.access || auth.expires < Date.now();
18
+ }
19
+ /**
20
+ * Refreshes the OAuth token and updates stored credentials
21
+ * @param currentAuth - Current auth state
22
+ * @param client - Opencode client for updating stored credentials
23
+ * @returns Updated auth (throws on failure)
24
+ */
25
+ export async function refreshAndUpdateToken(currentAuth, client) {
26
+ const refreshToken = currentAuth.type === "oauth" ? currentAuth.refresh : "";
27
+ const refreshResult = await refreshAccessToken(refreshToken);
28
+ if (refreshResult.type === "failed") {
29
+ throw new Error(ERROR_MESSAGES.TOKEN_REFRESH_FAILED);
30
+ }
31
+ // Update stored credentials
32
+ await client.auth.set({
33
+ path: { id: "openai" },
34
+ body: {
35
+ type: "oauth",
36
+ access: refreshResult.access,
37
+ refresh: refreshResult.refresh,
38
+ expires: refreshResult.expires,
39
+ },
40
+ });
41
+ // Update current auth reference if it's OAuth type
42
+ if (currentAuth.type === "oauth") {
43
+ currentAuth.access = refreshResult.access;
44
+ currentAuth.refresh = refreshResult.refresh;
45
+ currentAuth.expires = refreshResult.expires;
46
+ }
47
+ return currentAuth;
48
+ }
49
+ /**
50
+ * Extracts URL string from various request input types
51
+ * @param input - Request input (string, URL, or Request object)
52
+ * @returns URL string
53
+ */
54
+ export function extractRequestUrl(input) {
55
+ if (typeof input === "string")
56
+ return input;
57
+ if (input instanceof URL)
58
+ return input.toString();
59
+ return input.url;
60
+ }
61
+ /**
62
+ * Rewrites OpenAI API URLs to Codex backend URLs
63
+ * @param url - Original URL
64
+ * @returns Rewritten URL for Codex backend
65
+ */
66
+ export function rewriteUrlForCodex(url) {
67
+ return url.replace(URL_PATHS.RESPONSES, URL_PATHS.CODEX_RESPONSES);
68
+ }
69
+ /**
70
+ * Transforms request body and logs the transformation
71
+ * Fetches model-specific Codex instructions based on the request model
72
+ *
73
+ * @param init - Request init options
74
+ * @param url - Request URL
75
+ * @param userConfig - User configuration
76
+ * @param codexMode - Enable CODEX_MODE (bridge prompt instead of tool remap)
77
+ * @returns Transformed body and updated init, or undefined if no body
78
+ */
79
+ export async function transformRequestForCodex(init, url, userConfig, codexMode = true) {
80
+ if (!init?.body)
81
+ return undefined;
82
+ try {
83
+ const body = JSON.parse(init.body);
84
+ const originalModel = body.model;
85
+ // Normalize model first to determine which instructions to fetch
86
+ // This ensures we get the correct model-specific prompt
87
+ const normalizedModel = normalizeModel(originalModel);
88
+ const modelFamily = getModelFamily(normalizedModel);
89
+ // Log original request
90
+ logRequest(LOG_STAGES.BEFORE_TRANSFORM, {
91
+ url,
92
+ originalModel,
93
+ model: body.model,
94
+ hasTools: !!body.tools,
95
+ hasInput: !!body.input,
96
+ inputLength: body.input?.length,
97
+ codexMode,
98
+ body: body,
99
+ });
100
+ // Fetch model-specific Codex instructions (cached per model family)
101
+ const codexInstructions = await getCodexInstructions(normalizedModel);
102
+ // Transform request body
103
+ const transformedBody = await transformRequestBody(body, codexInstructions, userConfig, codexMode);
104
+ // Log transformed request
105
+ logRequest(LOG_STAGES.AFTER_TRANSFORM, {
106
+ url,
107
+ originalModel,
108
+ normalizedModel: transformedBody.model,
109
+ modelFamily,
110
+ hasTools: !!transformedBody.tools,
111
+ hasInput: !!transformedBody.input,
112
+ inputLength: transformedBody.input?.length,
113
+ reasoning: transformedBody.reasoning,
114
+ textVerbosity: transformedBody.text?.verbosity,
115
+ include: transformedBody.include,
116
+ body: transformedBody,
117
+ });
118
+ return {
119
+ body: transformedBody,
120
+ updatedInit: { ...init, body: JSON.stringify(transformedBody) },
121
+ };
122
+ }
123
+ catch (e) {
124
+ console.error(`[${PLUGIN_NAME}] ${ERROR_MESSAGES.REQUEST_PARSE_ERROR}:`, e);
125
+ return undefined;
126
+ }
127
+ }
128
+ /**
129
+ * Creates headers for Codex API requests
130
+ * @param init - Request init options
131
+ * @param accountId - ChatGPT account ID
132
+ * @param accessToken - OAuth access token
133
+ * @returns Headers object with all required Codex headers
134
+ */
135
+ export function createCodexHeaders(init, accountId, accessToken, opts) {
136
+ const headers = new Headers(init?.headers ?? {});
137
+ headers.delete("x-api-key"); // Remove any existing API key
138
+ headers.set("Authorization", `Bearer ${accessToken}`);
139
+ headers.set(OPENAI_HEADERS.ACCOUNT_ID, accountId);
140
+ headers.set(OPENAI_HEADERS.BETA, OPENAI_HEADER_VALUES.BETA_RESPONSES);
141
+ headers.set(OPENAI_HEADERS.ORIGINATOR, OPENAI_HEADER_VALUES.ORIGINATOR_CODEX);
142
+ const cacheKey = opts?.promptCacheKey;
143
+ if (cacheKey) {
144
+ headers.set(OPENAI_HEADERS.CONVERSATION_ID, cacheKey);
145
+ headers.set(OPENAI_HEADERS.SESSION_ID, cacheKey);
146
+ }
147
+ else {
148
+ headers.delete(OPENAI_HEADERS.CONVERSATION_ID);
149
+ headers.delete(OPENAI_HEADERS.SESSION_ID);
150
+ }
151
+ headers.set("accept", "text/event-stream");
152
+ return headers;
153
+ }
154
+ /**
155
+ * Handles error responses from the Codex API
156
+ * @param response - Error response from API
157
+ * @returns Original response or mapped retryable response
158
+ */
159
+ export async function handleErrorResponse(response) {
160
+ const mapped = await mapUsageLimit404(response);
161
+ const finalResponse = mapped ?? response;
162
+ logRequest(LOG_STAGES.ERROR_RESPONSE, {
163
+ status: finalResponse.status,
164
+ statusText: finalResponse.statusText,
165
+ });
166
+ return finalResponse;
167
+ }
168
+ /**
169
+ * Handles successful responses from the Codex API
170
+ * Converts SSE to JSON for non-streaming requests (generateText)
171
+ * Passes through SSE for streaming requests (streamText)
172
+ * @param response - Success response from API
173
+ * @param isStreaming - Whether this is a streaming request (stream=true in body)
174
+ * @returns Processed response (SSE→JSON for non-streaming, stream for streaming)
175
+ */
176
+ export async function handleSuccessResponse(response, isStreaming) {
177
+ const responseHeaders = ensureContentType(response.headers);
178
+ // For non-streaming requests (generateText), convert SSE to JSON
179
+ if (!isStreaming) {
180
+ return await convertSseToJson(response, responseHeaders);
181
+ }
182
+ // For streaming requests (streamText), return stream as-is
183
+ return new Response(response.body, {
184
+ status: response.status,
185
+ statusText: response.statusText,
186
+ headers: responseHeaders,
187
+ });
188
+ }
189
+ async function mapUsageLimit404(response) {
190
+ if (response.status !== HTTP_STATUS.NOT_FOUND)
191
+ return null;
192
+ const clone = response.clone();
193
+ let text = "";
194
+ try {
195
+ text = await clone.text();
196
+ }
197
+ catch {
198
+ text = "";
199
+ }
200
+ if (!text)
201
+ return null;
202
+ let code = "";
203
+ try {
204
+ const parsed = JSON.parse(text);
205
+ code = (parsed?.error?.code ?? parsed?.error?.type ?? "").toString();
206
+ }
207
+ catch {
208
+ code = "";
209
+ }
210
+ const haystack = `${code} ${text}`.toLowerCase();
211
+ if (!/usage_limit_reached|usage_not_included|rate_limit_exceeded|usage limit/i.test(haystack)) {
212
+ return null;
213
+ }
214
+ const headers = new Headers(response.headers);
215
+ return new Response(response.body, {
216
+ status: HTTP_STATUS.TOO_MANY_REQUESTS,
217
+ statusText: "Too Many Requests",
218
+ headers,
219
+ });
220
+ }
221
+ //# 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,6 @@
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
+ //# 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"}
@@ -0,0 +1,174 @@
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
+ //# 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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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Model Configuration Map
3
+ *
4
+ * Maps model config IDs to their normalized API model names.
5
+ * Only includes exact config IDs that OpenCode will pass to the plugin.
6
+ */
7
+ /**
8
+ * Map of config model IDs to normalized API model names
9
+ *
10
+ * Key: The model ID as specified in opencode.json config
11
+ * Value: The normalized model name to send to the API
12
+ */
13
+ export declare const MODEL_MAP: Record<string, string>;
14
+ /**
15
+ * Get normalized model name from config ID
16
+ *
17
+ * @param modelId - Model ID from config (e.g., "gpt-5.1-codex-low")
18
+ * @returns Normalized model name (e.g., "gpt-5.1-codex") or undefined if not found
19
+ */
20
+ export declare function getNormalizedModel(modelId: string): string | undefined;
21
+ /**
22
+ * Check if a model ID is in the model map
23
+ *
24
+ * @param modelId - Model ID to check
25
+ * @returns True if model is in the map
26
+ */
27
+ export declare function isKnownModel(modelId: string): boolean;
28
+ //# sourceMappingURL=model-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-map.d.ts","sourceRoot":"","sources":["../../../../lib/request/helpers/model-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyE5C,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiBtE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAErD"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Model Configuration Map
3
+ *
4
+ * Maps model config IDs to their normalized API model names.
5
+ * Only includes exact config IDs that OpenCode will pass to the plugin.
6
+ */
7
+ /**
8
+ * Map of config model IDs to normalized API model names
9
+ *
10
+ * Key: The model ID as specified in opencode.json config
11
+ * Value: The normalized model name to send to the API
12
+ */
13
+ export const MODEL_MAP = {
14
+ // ============================================================================
15
+ // GPT-5.1 Codex Models
16
+ // ============================================================================
17
+ "gpt-5.1-codex": "gpt-5.1-codex",
18
+ "gpt-5.1-codex-low": "gpt-5.1-codex",
19
+ "gpt-5.1-codex-medium": "gpt-5.1-codex",
20
+ "gpt-5.1-codex-high": "gpt-5.1-codex",
21
+ // ============================================================================
22
+ // GPT-5.1 Codex Max Models
23
+ // ============================================================================
24
+ "gpt-5.1-codex-max": "gpt-5.1-codex-max",
25
+ "gpt-5.1-codex-max-low": "gpt-5.1-codex-max",
26
+ "gpt-5.1-codex-max-medium": "gpt-5.1-codex-max",
27
+ "gpt-5.1-codex-max-high": "gpt-5.1-codex-max",
28
+ "gpt-5.1-codex-max-xhigh": "gpt-5.1-codex-max",
29
+ // ============================================================================
30
+ // GPT-5.2 Models (supports none/low/medium/high/xhigh per OpenAI API docs)
31
+ // ============================================================================
32
+ "gpt-5.2": "gpt-5.2",
33
+ "gpt-5.2-none": "gpt-5.2",
34
+ "gpt-5.2-low": "gpt-5.2",
35
+ "gpt-5.2-medium": "gpt-5.2",
36
+ "gpt-5.2-high": "gpt-5.2",
37
+ "gpt-5.2-xhigh": "gpt-5.2",
38
+ // ============================================================================
39
+ // GPT-5.2 Codex Models (low/medium/high/xhigh)
40
+ // ============================================================================
41
+ "gpt-5.2-codex": "gpt-5.2-codex",
42
+ "gpt-5.2-codex-low": "gpt-5.2-codex",
43
+ "gpt-5.2-codex-medium": "gpt-5.2-codex",
44
+ "gpt-5.2-codex-high": "gpt-5.2-codex",
45
+ "gpt-5.2-codex-xhigh": "gpt-5.2-codex",
46
+ // ============================================================================
47
+ // GPT-5.1 Codex Mini Models
48
+ // ============================================================================
49
+ "gpt-5.1-codex-mini": "gpt-5.1-codex-mini",
50
+ "gpt-5.1-codex-mini-medium": "gpt-5.1-codex-mini",
51
+ "gpt-5.1-codex-mini-high": "gpt-5.1-codex-mini",
52
+ // ============================================================================
53
+ // GPT-5.1 General Purpose Models (supports none/low/medium/high per OpenAI API docs)
54
+ // ============================================================================
55
+ "gpt-5.1": "gpt-5.1",
56
+ "gpt-5.1-none": "gpt-5.1",
57
+ "gpt-5.1-low": "gpt-5.1",
58
+ "gpt-5.1-medium": "gpt-5.1",
59
+ "gpt-5.1-high": "gpt-5.1",
60
+ "gpt-5.1-chat-latest": "gpt-5.1",
61
+ // ============================================================================
62
+ // GPT-5 Codex Models (LEGACY - maps to gpt-5.1-codex as gpt-5 is being phased out)
63
+ // ============================================================================
64
+ "gpt-5-codex": "gpt-5.1-codex",
65
+ // ============================================================================
66
+ // GPT-5 Codex Mini Models (LEGACY - maps to gpt-5.1-codex-mini)
67
+ // ============================================================================
68
+ "codex-mini-latest": "gpt-5.1-codex-mini",
69
+ "gpt-5-codex-mini": "gpt-5.1-codex-mini",
70
+ "gpt-5-codex-mini-medium": "gpt-5.1-codex-mini",
71
+ "gpt-5-codex-mini-high": "gpt-5.1-codex-mini",
72
+ // ============================================================================
73
+ // GPT-5 General Purpose Models (LEGACY - maps to gpt-5.1 as gpt-5 is being phased out)
74
+ // ============================================================================
75
+ "gpt-5": "gpt-5.1",
76
+ "gpt-5-mini": "gpt-5.1",
77
+ "gpt-5-nano": "gpt-5.1",
78
+ };
79
+ /**
80
+ * Get normalized model name from config ID
81
+ *
82
+ * @param modelId - Model ID from config (e.g., "gpt-5.1-codex-low")
83
+ * @returns Normalized model name (e.g., "gpt-5.1-codex") or undefined if not found
84
+ */
85
+ export function getNormalizedModel(modelId) {
86
+ try {
87
+ // Try direct lookup first
88
+ if (MODEL_MAP[modelId]) {
89
+ return MODEL_MAP[modelId];
90
+ }
91
+ // Try case-insensitive lookup
92
+ const lowerModelId = modelId.toLowerCase();
93
+ const match = Object.keys(MODEL_MAP).find((key) => key.toLowerCase() === lowerModelId);
94
+ return match ? MODEL_MAP[match] : undefined;
95
+ }
96
+ catch {
97
+ return undefined;
98
+ }
99
+ }
100
+ /**
101
+ * Check if a model ID is in the model map
102
+ *
103
+ * @param modelId - Model ID to check
104
+ * @returns True if model is in the map
105
+ */
106
+ export function isKnownModel(modelId) {
107
+ return getNormalizedModel(modelId) !== undefined;
108
+ }
109
+ //# sourceMappingURL=model-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-map.js","sourceRoot":"","sources":["../../../../lib/request/helpers/model-map.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAA2B;IACjD,+EAA+E;IAC/E,uBAAuB;IACvB,+EAA+E;IAC9E,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,eAAe;IACpC,sBAAsB,EAAE,eAAe;IACvC,oBAAoB,EAAE,eAAe;IAErC,+EAA+E;IAC/E,2BAA2B;IAC3B,+EAA+E;IAC/E,mBAAmB,EAAE,mBAAmB;IACxC,uBAAuB,EAAE,mBAAmB;IAC5C,0BAA0B,EAAE,mBAAmB;IAC/C,wBAAwB,EAAE,mBAAmB;IAC7C,yBAAyB,EAAE,mBAAmB;IAE9C,+EAA+E;IAC/E,2EAA2E;IAC3E,+EAA+E;IAC/E,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,eAAe,EAAE,SAAS;IAE1B,+EAA+E;IAC/E,+CAA+C;IAC/C,+EAA+E;IAC/E,eAAe,EAAE,eAAe;IAChC,mBAAmB,EAAE,eAAe;IACpC,sBAAsB,EAAE,eAAe;IACvC,oBAAoB,EAAE,eAAe;IACrC,qBAAqB,EAAE,eAAe;IAEtC,+EAA+E;IAC/E,4BAA4B;IAC5B,+EAA+E;IAC/E,oBAAoB,EAAE,oBAAoB;IAC1C,2BAA2B,EAAE,oBAAoB;IACjD,yBAAyB,EAAE,oBAAoB;IAE/C,+EAA+E;IAC/E,qFAAqF;IACrF,+EAA+E;IAC/E,SAAS,EAAE,SAAS;IACpB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAEhC,+EAA+E;IAC/E,mFAAmF;IACnF,+EAA+E;IAC/E,aAAa,EAAE,eAAe;IAE9B,+EAA+E;IAC/E,gEAAgE;IAChE,+EAA+E;IAC/E,mBAAmB,EAAE,oBAAoB;IACzC,kBAAkB,EAAE,oBAAoB;IACxC,yBAAyB,EAAE,oBAAoB;IAC/C,uBAAuB,EAAE,oBAAoB;IAE7C,+EAA+E;IAC/E,uFAAuF;IACvF,+EAA+E;IAC/E,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,SAAS;IACvB,YAAY,EAAE,SAAS;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IACjD,IAAI,CAAC;QACJ,0BAA0B;QAC1B,IAAI,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,OAAO,SAAS,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,8BAA8B;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CACxC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,YAAY,CAC3C,CAAC;QAEF,OAAO,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC3C,OAAO,kBAAkB,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;AAClD,CAAC"}