@iam-brain/opencode-codex-auth 1.2.5 → 1.3.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 (148) hide show
  1. package/README.md +41 -97
  2. package/dist/lib/accounts-tools.d.ts.map +1 -1
  3. package/dist/lib/accounts-tools.js +1 -3
  4. package/dist/lib/accounts-tools.js.map +1 -1
  5. package/dist/lib/codex-native/acquire-auth.d.ts.map +1 -1
  6. package/dist/lib/codex-native/acquire-auth.js +2 -1
  7. package/dist/lib/codex-native/acquire-auth.js.map +1 -1
  8. package/dist/lib/codex-native/chat-hooks.d.ts.map +1 -1
  9. package/dist/lib/codex-native/chat-hooks.js.map +1 -1
  10. package/dist/lib/codex-native/oauth-auth-methods.d.ts.map +1 -1
  11. package/dist/lib/codex-native/oauth-auth-methods.js +5 -2
  12. package/dist/lib/codex-native/oauth-auth-methods.js.map +1 -1
  13. package/dist/lib/codex-native/oauth-server-debug.d.ts +10 -0
  14. package/dist/lib/codex-native/oauth-server-debug.d.ts.map +1 -0
  15. package/dist/lib/codex-native/oauth-server-debug.js +92 -0
  16. package/dist/lib/codex-native/oauth-server-debug.js.map +1 -0
  17. package/dist/lib/codex-native/oauth-server-network.d.ts +5 -0
  18. package/dist/lib/codex-native/oauth-server-network.d.ts.map +1 -0
  19. package/dist/lib/codex-native/oauth-server-network.js +39 -0
  20. package/dist/lib/codex-native/oauth-server-network.js.map +1 -0
  21. package/dist/lib/codex-native/oauth-server-types.d.ts +24 -0
  22. package/dist/lib/codex-native/oauth-server-types.d.ts.map +1 -0
  23. package/dist/lib/codex-native/oauth-server-types.js +2 -0
  24. package/dist/lib/codex-native/oauth-server-types.js.map +1 -0
  25. package/dist/lib/codex-native/oauth-server.d.ts +2 -17
  26. package/dist/lib/codex-native/oauth-server.d.ts.map +1 -1
  27. package/dist/lib/codex-native/oauth-server.js +11 -130
  28. package/dist/lib/codex-native/oauth-server.js.map +1 -1
  29. package/dist/lib/codex-native/openai-loader-fetch-quota.d.ts +18 -0
  30. package/dist/lib/codex-native/openai-loader-fetch-quota.d.ts.map +1 -0
  31. package/dist/lib/codex-native/openai-loader-fetch-quota.js +71 -0
  32. package/dist/lib/codex-native/openai-loader-fetch-quota.js.map +1 -0
  33. package/dist/lib/codex-native/openai-loader-fetch-state.d.ts +27 -0
  34. package/dist/lib/codex-native/openai-loader-fetch-state.d.ts.map +1 -0
  35. package/dist/lib/codex-native/openai-loader-fetch-state.js +91 -0
  36. package/dist/lib/codex-native/openai-loader-fetch-state.js.map +1 -0
  37. package/dist/lib/codex-native/openai-loader-fetch.d.ts.map +1 -1
  38. package/dist/lib/codex-native/openai-loader-fetch.js +21 -162
  39. package/dist/lib/codex-native/openai-loader-fetch.js.map +1 -1
  40. package/dist/lib/codex-native/request-transform-instructions.d.ts +16 -0
  41. package/dist/lib/codex-native/request-transform-instructions.d.ts.map +1 -0
  42. package/dist/lib/codex-native/request-transform-instructions.js +114 -0
  43. package/dist/lib/codex-native/request-transform-instructions.js.map +1 -0
  44. package/dist/lib/codex-native/request-transform-model.d.ts +39 -0
  45. package/dist/lib/codex-native/request-transform-model.d.ts.map +1 -0
  46. package/dist/lib/codex-native/request-transform-model.js +270 -0
  47. package/dist/lib/codex-native/request-transform-model.js.map +1 -0
  48. package/dist/lib/codex-native/request-transform-payload-helpers.d.ts +26 -0
  49. package/dist/lib/codex-native/request-transform-payload-helpers.d.ts.map +1 -0
  50. package/dist/lib/codex-native/request-transform-payload-helpers.js +232 -0
  51. package/dist/lib/codex-native/request-transform-payload-helpers.js.map +1 -0
  52. package/dist/lib/codex-native/request-transform-payload.d.ts +53 -0
  53. package/dist/lib/codex-native/request-transform-payload.d.ts.map +1 -0
  54. package/dist/lib/codex-native/request-transform-payload.js +214 -0
  55. package/dist/lib/codex-native/request-transform-payload.js.map +1 -0
  56. package/dist/lib/codex-native/request-transform-shared.d.ts +8 -0
  57. package/dist/lib/codex-native/request-transform-shared.d.ts.map +1 -0
  58. package/dist/lib/codex-native/request-transform-shared.js +49 -0
  59. package/dist/lib/codex-native/request-transform-shared.js.map +1 -0
  60. package/dist/lib/codex-native/request-transform.d.ts +3 -122
  61. package/dist/lib/codex-native/request-transform.d.ts.map +1 -1
  62. package/dist/lib/codex-native/request-transform.js +3 -862
  63. package/dist/lib/codex-native/request-transform.js.map +1 -1
  64. package/dist/lib/codex-native/session-affinity-state.d.ts +13 -0
  65. package/dist/lib/codex-native/session-affinity-state.d.ts.map +1 -1
  66. package/dist/lib/codex-native/session-affinity-state.js +20 -8
  67. package/dist/lib/codex-native/session-affinity-state.js.map +1 -1
  68. package/dist/lib/codex-prompts-cache.d.ts.map +1 -1
  69. package/dist/lib/codex-prompts-cache.js.map +1 -1
  70. package/dist/lib/codex-quota-fetch.js +1 -1
  71. package/dist/lib/codex-quota-fetch.js.map +1 -1
  72. package/dist/lib/config/io.d.ts +16 -0
  73. package/dist/lib/config/io.d.ts.map +1 -0
  74. package/dist/lib/config/io.js +64 -0
  75. package/dist/lib/config/io.js.map +1 -0
  76. package/dist/lib/config/parse.d.ts +21 -0
  77. package/dist/lib/config/parse.d.ts.map +1 -0
  78. package/dist/lib/config/parse.js +347 -0
  79. package/dist/lib/config/parse.js.map +1 -0
  80. package/dist/lib/config/resolve.d.ts +27 -0
  81. package/dist/lib/config/resolve.d.ts.map +1 -0
  82. package/dist/lib/config/resolve.js +152 -0
  83. package/dist/lib/config/resolve.js.map +1 -0
  84. package/dist/lib/config/types.d.ts +72 -0
  85. package/dist/lib/config/types.d.ts.map +1 -0
  86. package/dist/lib/config/types.js +151 -0
  87. package/dist/lib/config/types.js.map +1 -0
  88. package/dist/lib/config/validation.d.ts +6 -0
  89. package/dist/lib/config/validation.d.ts.map +1 -0
  90. package/dist/lib/config/validation.js +160 -0
  91. package/dist/lib/config/validation.js.map +1 -0
  92. package/dist/lib/config.d.ts +5 -114
  93. package/dist/lib/config.d.ts.map +1 -1
  94. package/dist/lib/config.js +5 -855
  95. package/dist/lib/config.js.map +1 -1
  96. package/dist/lib/fetch-orchestrator-helpers.d.ts +13 -0
  97. package/dist/lib/fetch-orchestrator-helpers.d.ts.map +1 -0
  98. package/dist/lib/fetch-orchestrator-helpers.js +63 -0
  99. package/dist/lib/fetch-orchestrator-helpers.js.map +1 -0
  100. package/dist/lib/fetch-orchestrator-types.d.ts +71 -0
  101. package/dist/lib/fetch-orchestrator-types.d.ts.map +1 -0
  102. package/dist/lib/fetch-orchestrator-types.js +11 -0
  103. package/dist/lib/fetch-orchestrator-types.js.map +1 -0
  104. package/dist/lib/fetch-orchestrator.d.ts +2 -69
  105. package/dist/lib/fetch-orchestrator.d.ts.map +1 -1
  106. package/dist/lib/fetch-orchestrator.js +30 -79
  107. package/dist/lib/fetch-orchestrator.js.map +1 -1
  108. package/dist/lib/model-catalog/cache-helpers.d.ts +23 -0
  109. package/dist/lib/model-catalog/cache-helpers.d.ts.map +1 -0
  110. package/dist/lib/model-catalog/cache-helpers.js +210 -0
  111. package/dist/lib/model-catalog/cache-helpers.js.map +1 -0
  112. package/dist/lib/model-catalog/catalog-fetch.d.ts +3 -0
  113. package/dist/lib/model-catalog/catalog-fetch.d.ts.map +1 -0
  114. package/dist/lib/model-catalog/catalog-fetch.js +159 -0
  115. package/dist/lib/model-catalog/catalog-fetch.js.map +1 -0
  116. package/dist/lib/model-catalog/provider.d.ts +6 -0
  117. package/dist/lib/model-catalog/provider.d.ts.map +1 -0
  118. package/dist/lib/model-catalog/provider.js +254 -0
  119. package/dist/lib/model-catalog/provider.js.map +1 -0
  120. package/dist/lib/model-catalog/shared.d.ts +95 -0
  121. package/dist/lib/model-catalog/shared.d.ts.map +1 -0
  122. package/dist/lib/model-catalog/shared.js +154 -0
  123. package/dist/lib/model-catalog/shared.js.map +1 -0
  124. package/dist/lib/model-catalog.d.ts +3 -68
  125. package/dist/lib/model-catalog.d.ts.map +1 -1
  126. package/dist/lib/model-catalog.js +3 -767
  127. package/dist/lib/model-catalog.js.map +1 -1
  128. package/dist/lib/proactive-refresh.d.ts.map +1 -1
  129. package/dist/lib/proactive-refresh.js +2 -4
  130. package/dist/lib/proactive-refresh.js.map +1 -1
  131. package/dist/lib/quarantine.js.map +1 -1
  132. package/dist/lib/quota-threshold-alerts.d.ts.map +1 -1
  133. package/dist/lib/quota-threshold-alerts.js +3 -1
  134. package/dist/lib/quota-threshold-alerts.js.map +1 -1
  135. package/dist/lib/rotation.js.map +1 -1
  136. package/dist/lib/storage/domain-state.d.ts +23 -0
  137. package/dist/lib/storage/domain-state.d.ts.map +1 -0
  138. package/dist/lib/storage/domain-state.js +275 -0
  139. package/dist/lib/storage/domain-state.js.map +1 -0
  140. package/dist/lib/storage/migration.d.ts +13 -0
  141. package/dist/lib/storage/migration.d.ts.map +1 -0
  142. package/dist/lib/storage/migration.js +225 -0
  143. package/dist/lib/storage/migration.js.map +1 -0
  144. package/dist/lib/storage.d.ts +2 -9
  145. package/dist/lib/storage.d.ts.map +1 -1
  146. package/dist/lib/storage.js +12 -503
  147. package/dist/lib/storage.js.map +1 -1
  148. package/package.json +10 -9
@@ -1,863 +1,4 @@
1
- import { resolveInstructionsForModel } from "../model-catalog.js";
2
- import { sanitizeRequestPayloadForCompat } from "../compat-sanitizer.js";
3
- import { isRecord } from "../util.js";
4
- import { isOrchestratorInstructions, replaceCodexToolCallsForOpenCode } from "./collaboration.js";
5
- function asString(value) {
6
- if (typeof value !== "string")
7
- return undefined;
8
- const trimmed = value.trim();
9
- return trimmed ? trimmed : undefined;
10
- }
11
- function asStringArray(value) {
12
- if (!Array.isArray(value))
13
- return undefined;
14
- return value.filter((item) => typeof item === "string" && item.trim().length > 0);
15
- }
16
- function normalizeReasoningSummaryOption(value) {
17
- const normalized = asString(value)?.toLowerCase();
18
- if (!normalized || normalized === "none")
19
- return undefined;
20
- if (normalized === "auto" || normalized === "concise" || normalized === "detailed")
21
- return normalized;
22
- return undefined;
23
- }
24
- function normalizeTextVerbosity(value) {
25
- const normalized = asString(value)?.toLowerCase();
26
- if (!normalized)
27
- return undefined;
28
- if (normalized === "low" || normalized === "medium" || normalized === "high")
29
- return normalized;
30
- return undefined;
31
- }
32
- function normalizeVerbositySetting(value) {
33
- const normalized = asString(value)?.toLowerCase();
34
- if (!normalized)
35
- return undefined;
36
- if (normalized === "default" || normalized === "low" || normalized === "medium" || normalized === "high") {
37
- return normalized;
38
- }
39
- return undefined;
40
- }
41
- function readModelRuntimeDefaults(options) {
42
- const raw = options.codexRuntimeDefaults;
43
- if (!isRecord(raw))
44
- return {};
45
- return {
46
- applyPatchToolType: asString(raw.applyPatchToolType),
47
- defaultReasoningEffort: asString(raw.defaultReasoningEffort),
48
- supportsReasoningSummaries: typeof raw.supportsReasoningSummaries === "boolean" ? raw.supportsReasoningSummaries : undefined,
49
- reasoningSummaryFormat: asString(raw.reasoningSummaryFormat),
50
- defaultVerbosity: raw.defaultVerbosity === "low" || raw.defaultVerbosity === "medium" || raw.defaultVerbosity === "high"
51
- ? raw.defaultVerbosity
52
- : undefined,
53
- supportsVerbosity: typeof raw.supportsVerbosity === "boolean" ? raw.supportsVerbosity : undefined
54
- };
55
- }
56
- function mergeUnique(values) {
57
- const out = [];
58
- const seen = new Set();
59
- for (const value of values) {
60
- if (seen.has(value))
61
- continue;
62
- seen.add(value);
63
- out.push(value);
64
- }
65
- return out;
66
- }
67
- function normalizePersonalityKey(value) {
68
- const normalized = asString(value)?.toLowerCase();
69
- if (!normalized)
70
- return undefined;
71
- if (normalized.includes("/") || normalized.includes("\\") || normalized.includes("..")) {
72
- return undefined;
73
- }
74
- return normalized;
75
- }
76
- export function getModelLookupCandidates(model) {
77
- const out = [];
78
- const seen = new Set();
79
- const add = (value) => {
80
- const trimmed = value?.trim();
81
- if (!trimmed)
82
- return;
83
- if (seen.has(trimmed))
84
- return;
85
- seen.add(trimmed);
86
- out.push(trimmed);
87
- };
88
- add(model.id);
89
- add(model.api?.id);
90
- add(model.id?.split("/").pop());
91
- add(model.api?.id?.split("/").pop());
92
- return out;
93
- }
94
- export function getVariantLookupCandidates(input) {
95
- const out = [];
96
- const seen = new Set();
97
- const add = (value) => {
98
- const trimmed = value?.trim();
99
- if (!trimmed)
100
- return;
101
- if (seen.has(trimmed))
102
- return;
103
- seen.add(trimmed);
104
- out.push(trimmed);
105
- };
106
- if (isRecord(input.message)) {
107
- add(asString(input.message.variant));
108
- }
109
- for (const candidate of input.modelCandidates) {
110
- const slash = candidate.lastIndexOf("/");
111
- if (slash <= 0 || slash >= candidate.length - 1)
112
- continue;
113
- add(candidate.slice(slash + 1));
114
- }
115
- return out;
116
- }
117
- const EFFORT_SUFFIX_REGEX = /-(none|minimal|low|medium|high|xhigh)$/i;
118
- function stripEffortSuffix(value) {
119
- return value.replace(EFFORT_SUFFIX_REGEX, "");
120
- }
121
- export function findCatalogModelForCandidates(catalogModels, modelCandidates) {
122
- if (!catalogModels || catalogModels.length === 0)
123
- return undefined;
124
- const wanted = new Set();
125
- for (const candidate of modelCandidates) {
126
- const normalized = candidate.trim().toLowerCase();
127
- if (!normalized)
128
- continue;
129
- wanted.add(normalized);
130
- wanted.add(stripEffortSuffix(normalized));
131
- }
132
- return catalogModels.find((model) => {
133
- const slug = model.slug.trim().toLowerCase();
134
- if (!slug)
135
- return false;
136
- return wanted.has(slug) || wanted.has(stripEffortSuffix(slug));
137
- });
138
- }
139
- function resolveCaseInsensitiveEntry(entries, candidate) {
140
- if (!entries)
141
- return undefined;
142
- const direct = entries[candidate];
143
- if (direct !== undefined)
144
- return direct;
145
- const lowered = entries[candidate.toLowerCase()];
146
- if (lowered !== undefined)
147
- return lowered;
148
- const loweredCandidate = candidate.toLowerCase();
149
- for (const [name, entry] of Object.entries(entries)) {
150
- if (name.trim().toLowerCase() === loweredCandidate) {
151
- return entry;
152
- }
153
- }
154
- return undefined;
155
- }
156
- function getModelPersonalityOverride(behaviorSettings, modelCandidates, variantCandidates) {
157
- const models = behaviorSettings?.perModel;
158
- if (!models)
159
- return undefined;
160
- for (const candidate of modelCandidates) {
161
- const entry = resolveCaseInsensitiveEntry(models, candidate);
162
- if (!entry)
163
- continue;
164
- for (const variantCandidate of variantCandidates) {
165
- const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
166
- const variantPersonality = normalizePersonalityKey(variantEntry?.personality);
167
- if (variantPersonality)
168
- return variantPersonality;
169
- }
170
- const modelPersonality = normalizePersonalityKey(entry.personality);
171
- if (modelPersonality)
172
- return modelPersonality;
173
- }
174
- return undefined;
175
- }
176
- export function getModelThinkingSummariesOverride(behaviorSettings, modelCandidates, variantCandidates) {
177
- const models = behaviorSettings?.perModel;
178
- if (!models)
179
- return undefined;
180
- for (const candidate of modelCandidates) {
181
- const entry = resolveCaseInsensitiveEntry(models, candidate);
182
- if (!entry)
183
- continue;
184
- for (const variantCandidate of variantCandidates) {
185
- const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
186
- if (typeof variantEntry?.thinkingSummaries === "boolean") {
187
- return variantEntry.thinkingSummaries;
188
- }
189
- }
190
- if (typeof entry.thinkingSummaries === "boolean") {
191
- return entry.thinkingSummaries;
192
- }
193
- }
194
- return undefined;
195
- }
196
- export function getModelVerbosityEnabledOverride(behaviorSettings, modelCandidates, variantCandidates) {
197
- const models = behaviorSettings?.perModel;
198
- if (!models)
199
- return undefined;
200
- for (const candidate of modelCandidates) {
201
- const entry = resolveCaseInsensitiveEntry(models, candidate);
202
- if (!entry)
203
- continue;
204
- for (const variantCandidate of variantCandidates) {
205
- const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
206
- if (typeof variantEntry?.verbosityEnabled === "boolean") {
207
- return variantEntry.verbosityEnabled;
208
- }
209
- }
210
- if (typeof entry.verbosityEnabled === "boolean") {
211
- return entry.verbosityEnabled;
212
- }
213
- }
214
- return undefined;
215
- }
216
- export function getModelVerbosityOverride(behaviorSettings, modelCandidates, variantCandidates) {
217
- const models = behaviorSettings?.perModel;
218
- if (!models)
219
- return undefined;
220
- for (const candidate of modelCandidates) {
221
- const entry = resolveCaseInsensitiveEntry(models, candidate);
222
- if (!entry)
223
- continue;
224
- for (const variantCandidate of variantCandidates) {
225
- const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
226
- const variantVerbosity = normalizeVerbositySetting(variantEntry?.verbosity);
227
- if (variantVerbosity)
228
- return variantVerbosity;
229
- }
230
- const modelVerbosity = normalizeVerbositySetting(entry.verbosity);
231
- if (modelVerbosity)
232
- return modelVerbosity;
233
- }
234
- return undefined;
235
- }
236
- export function resolvePersonalityForModel(input) {
237
- const modelOverride = getModelPersonalityOverride(input.behaviorSettings, input.modelCandidates, input.variantCandidates);
238
- if (modelOverride)
239
- return modelOverride;
240
- const globalOverride = normalizePersonalityKey(input.behaviorSettings?.global?.personality);
241
- if (globalOverride)
242
- return globalOverride;
243
- return normalizePersonalityKey(input.fallback);
244
- }
245
- export function applyCodexRuntimeDefaultsToParams(input) {
246
- const options = input.output.options;
247
- const modelOptions = input.modelOptions;
248
- const defaults = readModelRuntimeDefaults(modelOptions);
249
- const codexInstructions = asString(modelOptions.codexInstructions);
250
- if (codexInstructions && (input.preferCodexInstructions || asString(options.instructions) === undefined)) {
251
- options.instructions = codexInstructions;
252
- }
253
- if (asString(options.reasoningEffort) === undefined && defaults.defaultReasoningEffort) {
254
- options.reasoningEffort = defaults.defaultReasoningEffort;
255
- }
256
- const reasoningEffort = asString(options.reasoningEffort);
257
- const hasReasoning = reasoningEffort !== undefined && reasoningEffort !== "none";
258
- const rawReasoningSummary = asString(options.reasoningSummary);
259
- const hadExplicitReasoningSummary = rawReasoningSummary !== undefined;
260
- const currentReasoningSummary = normalizeReasoningSummaryOption(rawReasoningSummary);
261
- if (rawReasoningSummary !== undefined) {
262
- if (currentReasoningSummary) {
263
- options.reasoningSummary = currentReasoningSummary;
264
- }
265
- else {
266
- delete options.reasoningSummary;
267
- }
268
- }
269
- if (!hadExplicitReasoningSummary && currentReasoningSummary === undefined) {
270
- if (hasReasoning && (defaults.supportsReasoningSummaries === true || input.thinkingSummariesOverride === true)) {
271
- if (input.thinkingSummariesOverride === false) {
272
- delete options.reasoningSummary;
273
- }
274
- else {
275
- if (defaults.reasoningSummaryFormat?.toLowerCase() === "none") {
276
- delete options.reasoningSummary;
277
- }
278
- else {
279
- options.reasoningSummary = defaults.reasoningSummaryFormat ?? "auto";
280
- }
281
- }
282
- }
283
- }
284
- const rawTextVerbosity = asString(options.textVerbosity);
285
- const explicitTextVerbosity = normalizeTextVerbosity(rawTextVerbosity);
286
- if (rawTextVerbosity !== undefined && !explicitTextVerbosity) {
287
- delete options.textVerbosity;
288
- }
289
- const verbosityEnabled = input.verbosityEnabledOverride ?? true;
290
- const verbositySetting = input.verbosityOverride ?? "default";
291
- const supportsVerbosity = defaults.supportsVerbosity !== false;
292
- if (!supportsVerbosity || !verbosityEnabled) {
293
- delete options.textVerbosity;
294
- }
295
- else if (normalizeTextVerbosity(options.textVerbosity) === undefined) {
296
- if (verbositySetting === "default") {
297
- if (defaults.defaultVerbosity) {
298
- options.textVerbosity = defaults.defaultVerbosity;
299
- }
300
- }
301
- else {
302
- options.textVerbosity = verbositySetting;
303
- }
304
- }
305
- if (asString(options.applyPatchToolType) === undefined && defaults.applyPatchToolType) {
306
- options.applyPatchToolType = defaults.applyPatchToolType;
307
- }
308
- if (typeof options.parallelToolCalls !== "boolean" && input.modelToolCallCapable !== undefined) {
309
- options.parallelToolCalls = input.modelToolCallCapable;
310
- }
311
- const shouldIncludeReasoning = hasReasoning &&
312
- ((asString(options.reasoningSummary) !== undefined &&
313
- asString(options.reasoningSummary)?.toLowerCase() !== "none") ||
314
- defaults.supportsReasoningSummaries === true);
315
- if (shouldIncludeReasoning) {
316
- const include = asStringArray(options.include) ?? [];
317
- options.include = mergeUnique([...include, "reasoning.encrypted_content"]);
318
- }
319
- }
320
- export async function sanitizeOutboundRequestIfNeeded(request, enabled) {
321
- const transformed = await transformOutboundRequestPayload({
322
- request,
323
- stripReasoningReplayEnabled: false,
324
- remapDeveloperMessagesToUserEnabled: false,
325
- compatInputSanitizerEnabled: enabled,
326
- promptCacheKeyOverrideEnabled: false
327
- });
328
- return {
329
- request: transformed.request,
330
- changed: transformed.compatSanitizer.changed
331
- };
332
- }
333
- function stripReasoningReplayFromPayload(payload) {
334
- if (!Array.isArray(payload.input)) {
335
- return {
336
- changed: false,
337
- reason: "missing_input_array",
338
- removedPartCount: 0,
339
- removedFieldCount: 0
340
- };
341
- }
342
- let changed = false;
343
- let removedPartCount = 0;
344
- let removedFieldCount = 0;
345
- const nextInput = [];
346
- for (const item of payload.input) {
347
- if (isReasoningReplayPart(item)) {
348
- changed = true;
349
- removedPartCount += 1;
350
- continue;
351
- }
352
- if (!isRecord(item)) {
353
- nextInput.push(item);
354
- continue;
355
- }
356
- const nextItem = { ...item };
357
- const role = asString(nextItem.role)?.toLowerCase();
358
- if (role === "assistant" && Array.isArray(nextItem.content)) {
359
- const contentOut = [];
360
- for (const entry of nextItem.content) {
361
- if (isReasoningReplayPart(entry)) {
362
- changed = true;
363
- removedPartCount += 1;
364
- continue;
365
- }
366
- const strippedEntry = stripReasoningReplayFields(entry);
367
- if (strippedEntry.removed > 0) {
368
- changed = true;
369
- removedFieldCount += strippedEntry.removed;
370
- }
371
- contentOut.push(strippedEntry.value);
372
- }
373
- nextItem.content = contentOut;
374
- }
375
- const strippedItem = stripReasoningReplayFields(nextItem);
376
- if (strippedItem.removed > 0) {
377
- changed = true;
378
- removedFieldCount += strippedItem.removed;
379
- }
380
- nextInput.push(strippedItem.value);
381
- }
382
- if (!changed) {
383
- return {
384
- changed: false,
385
- reason: "no_reasoning_replay",
386
- removedPartCount,
387
- removedFieldCount
388
- };
389
- }
390
- payload.input = nextInput;
391
- return {
392
- changed: true,
393
- reason: "updated",
394
- removedPartCount,
395
- removedFieldCount
396
- };
397
- }
398
- function remapDeveloperMessagesToUserOnPayload(payload) {
399
- if (!Array.isArray(payload.input)) {
400
- return {
401
- changed: false,
402
- reason: "missing_input_array",
403
- remappedCount: 0,
404
- preservedCount: 0
405
- };
406
- }
407
- let nextInput;
408
- let remappedCount = 0;
409
- let preservedCount = 0;
410
- let developerCount = 0;
411
- for (let index = 0; index < payload.input.length; index += 1) {
412
- const item = payload.input[index];
413
- if (!isRecord(item))
414
- continue;
415
- if (item.role !== "developer")
416
- continue;
417
- developerCount += 1;
418
- if (shouldPreserveDeveloperRole(item)) {
419
- preservedCount += 1;
420
- continue;
421
- }
422
- if (!nextInput)
423
- nextInput = payload.input.slice();
424
- nextInput[index] = {
425
- ...item,
426
- role: "user"
427
- };
428
- remappedCount += 1;
429
- }
430
- if (!nextInput) {
431
- return {
432
- changed: false,
433
- reason: developerCount === 0 ? "no_developer_messages" : "permissions_only",
434
- remappedCount,
435
- preservedCount
436
- };
437
- }
438
- payload.input = nextInput;
439
- return {
440
- changed: true,
441
- reason: "updated",
442
- remappedCount,
443
- preservedCount
444
- };
445
- }
446
- function applyPromptCacheKeyOverrideToPayload(payload, promptCacheKey) {
447
- if (!promptCacheKey) {
448
- return { changed: false, reason: "missing_key" };
449
- }
450
- const current = asString(payload.prompt_cache_key);
451
- if (current === promptCacheKey) {
452
- return { changed: false, reason: "already_matches" };
453
- }
454
- payload.prompt_cache_key = promptCacheKey;
455
- return {
456
- changed: true,
457
- reason: current ? "replaced" : "set"
458
- };
459
- }
460
- export async function transformOutboundRequestPayload(input) {
461
- const disabledReplay = {
462
- changed: false,
463
- reason: "disabled",
464
- removedPartCount: 0,
465
- removedFieldCount: 0
466
- };
467
- const disabledRoleRemap = {
468
- changed: false,
469
- reason: "disabled",
470
- remappedCount: 0,
471
- preservedCount: 0
472
- };
473
- const disabledPromptCacheKey = {
474
- changed: false,
475
- reason: "disabled"
476
- };
477
- const disabledCompatSanitizer = {
478
- changed: false,
479
- reason: "disabled"
480
- };
481
- const method = input.request.method.toUpperCase();
482
- if (method !== "POST") {
483
- return {
484
- request: input.request,
485
- changed: false,
486
- replay: input.stripReasoningReplayEnabled ? { ...disabledReplay, reason: "non_post" } : disabledReplay,
487
- developerRoleRemap: input.remapDeveloperMessagesToUserEnabled
488
- ? { ...disabledRoleRemap, reason: "non_post" }
489
- : disabledRoleRemap,
490
- promptCacheKey: input.promptCacheKeyOverrideEnabled
491
- ? { ...disabledPromptCacheKey, reason: "non_post" }
492
- : disabledPromptCacheKey,
493
- compatSanitizer: input.compatInputSanitizerEnabled
494
- ? { ...disabledCompatSanitizer, reason: "non_post" }
495
- : disabledCompatSanitizer
496
- };
497
- }
498
- let raw;
499
- try {
500
- raw = await input.request.clone().text();
501
- }
502
- catch {
503
- return {
504
- request: input.request,
505
- changed: false,
506
- replay: input.stripReasoningReplayEnabled ? { ...disabledReplay, reason: "invalid_json" } : disabledReplay,
507
- developerRoleRemap: input.remapDeveloperMessagesToUserEnabled
508
- ? { ...disabledRoleRemap, reason: "invalid_json" }
509
- : disabledRoleRemap,
510
- promptCacheKey: input.promptCacheKeyOverrideEnabled
511
- ? { ...disabledPromptCacheKey, reason: "invalid_json" }
512
- : disabledPromptCacheKey,
513
- compatSanitizer: input.compatInputSanitizerEnabled
514
- ? { ...disabledCompatSanitizer, reason: "invalid_json" }
515
- : disabledCompatSanitizer
516
- };
517
- }
518
- if (!raw) {
519
- return {
520
- request: input.request,
521
- changed: false,
522
- replay: input.stripReasoningReplayEnabled ? { ...disabledReplay, reason: "empty_body" } : disabledReplay,
523
- developerRoleRemap: input.remapDeveloperMessagesToUserEnabled
524
- ? { ...disabledRoleRemap, reason: "empty_body" }
525
- : disabledRoleRemap,
526
- promptCacheKey: input.promptCacheKeyOverrideEnabled
527
- ? { ...disabledPromptCacheKey, reason: "empty_body" }
528
- : disabledPromptCacheKey,
529
- compatSanitizer: input.compatInputSanitizerEnabled
530
- ? { ...disabledCompatSanitizer, reason: "empty_body" }
531
- : disabledCompatSanitizer
532
- };
533
- }
534
- let payload;
535
- try {
536
- payload = JSON.parse(raw);
537
- }
538
- catch {
539
- return {
540
- request: input.request,
541
- changed: false,
542
- replay: input.stripReasoningReplayEnabled ? { ...disabledReplay, reason: "invalid_json" } : disabledReplay,
543
- developerRoleRemap: input.remapDeveloperMessagesToUserEnabled
544
- ? { ...disabledRoleRemap, reason: "invalid_json" }
545
- : disabledRoleRemap,
546
- promptCacheKey: input.promptCacheKeyOverrideEnabled
547
- ? { ...disabledPromptCacheKey, reason: "invalid_json" }
548
- : disabledPromptCacheKey,
549
- compatSanitizer: input.compatInputSanitizerEnabled
550
- ? { ...disabledCompatSanitizer, reason: "invalid_json" }
551
- : disabledCompatSanitizer
552
- };
553
- }
554
- if (!isRecord(payload)) {
555
- return {
556
- request: input.request,
557
- changed: false,
558
- replay: input.stripReasoningReplayEnabled ? { ...disabledReplay, reason: "non_object_body" } : disabledReplay,
559
- developerRoleRemap: input.remapDeveloperMessagesToUserEnabled
560
- ? { ...disabledRoleRemap, reason: "non_object_body" }
561
- : disabledRoleRemap,
562
- promptCacheKey: input.promptCacheKeyOverrideEnabled
563
- ? { ...disabledPromptCacheKey, reason: "non_object_body" }
564
- : disabledPromptCacheKey,
565
- compatSanitizer: input.compatInputSanitizerEnabled
566
- ? { ...disabledCompatSanitizer, reason: "non_object_body" }
567
- : disabledCompatSanitizer
568
- };
569
- }
570
- let changed = false;
571
- const replay = input.stripReasoningReplayEnabled ? stripReasoningReplayFromPayload(payload) : disabledReplay;
572
- changed = changed || replay.changed;
573
- const developerRoleRemap = input.remapDeveloperMessagesToUserEnabled
574
- ? remapDeveloperMessagesToUserOnPayload(payload)
575
- : disabledRoleRemap;
576
- changed = changed || developerRoleRemap.changed;
577
- const promptCacheKey = input.promptCacheKeyOverrideEnabled
578
- ? applyPromptCacheKeyOverrideToPayload(payload, asString(input.promptCacheKeyOverride))
579
- : disabledPromptCacheKey;
580
- changed = changed || promptCacheKey.changed;
581
- const compatSanitizedPayload = input.compatInputSanitizerEnabled ? sanitizeRequestPayloadForCompat(payload) : null;
582
- const compatSanitizer = input.compatInputSanitizerEnabled
583
- ? {
584
- changed: compatSanitizedPayload?.changed === true,
585
- reason: compatSanitizedPayload?.changed === true ? "updated" : "already_matches"
586
- }
587
- : disabledCompatSanitizer;
588
- const finalPayload = compatSanitizedPayload?.payload ?? payload;
589
- changed = changed || compatSanitizer.changed;
590
- if (!changed) {
591
- return {
592
- request: input.request,
593
- changed: false,
594
- replay,
595
- developerRoleRemap,
596
- promptCacheKey,
597
- compatSanitizer
598
- };
599
- }
600
- return {
601
- request: rebuildRequestWithJsonBody(input.request, finalPayload),
602
- changed: true,
603
- replay,
604
- developerRoleRemap,
605
- promptCacheKey,
606
- compatSanitizer
607
- };
608
- }
609
- export async function applyPromptCacheKeyOverrideToRequest(input) {
610
- const transformed = await transformOutboundRequestPayload({
611
- request: input.request,
612
- stripReasoningReplayEnabled: false,
613
- remapDeveloperMessagesToUserEnabled: false,
614
- compatInputSanitizerEnabled: false,
615
- promptCacheKeyOverrideEnabled: input.enabled,
616
- promptCacheKeyOverride: input.promptCacheKey
617
- });
618
- return {
619
- request: transformed.request,
620
- changed: transformed.promptCacheKey.changed,
621
- reason: transformed.promptCacheKey.reason
622
- };
623
- }
624
- function rebuildRequestWithJsonBody(request, body) {
625
- const headers = new Headers(request.headers);
626
- headers.set("content-type", "application/json");
627
- headers.delete("content-length");
628
- return new Request(request.url, {
629
- method: request.method,
630
- headers,
631
- body: JSON.stringify(body),
632
- redirect: request.redirect,
633
- signal: request.signal,
634
- credentials: request.credentials,
635
- mode: request.mode,
636
- referrer: request.referrer,
637
- referrerPolicy: request.referrerPolicy,
638
- integrity: request.integrity,
639
- keepalive: request.keepalive
640
- });
641
- }
642
- function messageContentToText(value) {
643
- if (typeof value === "string")
644
- return value;
645
- if (!Array.isArray(value))
646
- return "";
647
- const parts = [];
648
- for (const entry of value) {
649
- if (!isRecord(entry))
650
- continue;
651
- if (typeof entry.text === "string" && entry.text.trim().length > 0) {
652
- parts.push(entry.text);
653
- }
654
- }
655
- return parts.join("\n");
656
- }
657
- const STRUCTURED_INSTRUCTION_MARKERS = [
658
- "<permissions instructions>",
659
- "<environment_context>",
660
- "<app-context>",
661
- "<collaboration_mode>",
662
- "<personality_spec>",
663
- "<instructions>"
664
- ];
665
- const RUNTIME_POLICY_SIGNALS = [
666
- "approval policy",
667
- "filesystem sandboxing",
668
- "sandbox_mode",
669
- "agents.md",
670
- "environment context",
671
- "collaboration mode"
672
- ];
673
- const DIRECTIVE_LANGUAGE_SIGNALS = ["must", "never", "do not", "always", "required", "only"];
674
- const POLICY_DOMAIN_SIGNALS = ["permission", "policy", "sandbox", "filesystem", "security", "compliance"];
675
- function shouldPreserveDeveloperRole(item) {
676
- const text = messageContentToText(item.content).toLowerCase();
677
- if (!text)
678
- return false;
679
- if (text.includes("instructions") &&
680
- (text.includes("must") || text.includes("never") || text.includes("do not") || text.includes("required"))) {
681
- return true;
682
- }
683
- if (STRUCTURED_INSTRUCTION_MARKERS.some((marker) => text.includes(marker)))
684
- return true;
685
- const hasDirectiveLanguage = DIRECTIVE_LANGUAGE_SIGNALS.some((signal) => text.includes(signal));
686
- const hasPolicyDomainSignal = POLICY_DOMAIN_SIGNALS.some((signal) => text.includes(signal));
687
- if (hasDirectiveLanguage && hasPolicyDomainSignal)
688
- return true;
689
- const signalCount = RUNTIME_POLICY_SIGNALS.reduce((count, signal) => count + (text.includes(signal) ? 1 : 0), 0);
690
- return signalCount >= 2;
691
- }
692
- export async function remapDeveloperMessagesToUserOnRequest(input) {
693
- const transformed = await transformOutboundRequestPayload({
694
- request: input.request,
695
- stripReasoningReplayEnabled: false,
696
- remapDeveloperMessagesToUserEnabled: input.enabled,
697
- compatInputSanitizerEnabled: false,
698
- promptCacheKeyOverrideEnabled: false
699
- });
700
- return {
701
- request: transformed.request,
702
- changed: transformed.developerRoleRemap.changed,
703
- reason: transformed.developerRoleRemap.reason,
704
- remappedCount: transformed.developerRoleRemap.remappedCount,
705
- preservedCount: transformed.developerRoleRemap.preservedCount
706
- };
707
- }
708
- function stripReasoningReplayFields(value) {
709
- if (Array.isArray(value)) {
710
- let removed = 0;
711
- const next = value.map((entry) => {
712
- const result = stripReasoningReplayFields(entry);
713
- removed += result.removed;
714
- return result.value;
715
- });
716
- return { value: next, removed };
717
- }
718
- if (!isRecord(value)) {
719
- return { value, removed: 0 };
720
- }
721
- let removed = 0;
722
- const out = {};
723
- for (const [key, entry] of Object.entries(value)) {
724
- if (key.toLowerCase() === "reasoning_content") {
725
- removed += 1;
726
- continue;
727
- }
728
- const result = stripReasoningReplayFields(entry);
729
- removed += result.removed;
730
- out[key] = result.value;
731
- }
732
- return { value: out, removed };
733
- }
734
- function isReasoningReplayPart(entry) {
735
- if (!isRecord(entry))
736
- return false;
737
- const type = asString(entry.type)?.toLowerCase();
738
- if (!type)
739
- return false;
740
- return type.startsWith("reasoning");
741
- }
742
- export async function stripReasoningReplayFromRequest(input) {
743
- const transformed = await transformOutboundRequestPayload({
744
- request: input.request,
745
- stripReasoningReplayEnabled: input.enabled,
746
- remapDeveloperMessagesToUserEnabled: false,
747
- compatInputSanitizerEnabled: false,
748
- promptCacheKeyOverrideEnabled: false
749
- });
750
- return {
751
- request: transformed.request,
752
- changed: transformed.replay.changed,
753
- reason: transformed.replay.reason,
754
- removedPartCount: transformed.replay.removedPartCount,
755
- removedFieldCount: transformed.replay.removedFieldCount
756
- };
757
- }
758
- function getVariantCandidatesFromBody(input) {
759
- const out = [];
760
- const seen = new Set();
761
- const add = (value) => {
762
- const trimmed = value?.trim().toLowerCase();
763
- if (!trimmed)
764
- return;
765
- if (seen.has(trimmed))
766
- return;
767
- seen.add(trimmed);
768
- out.push(trimmed);
769
- };
770
- const reasoning = isRecord(input.body.reasoning) ? input.body.reasoning : undefined;
771
- add(asString(reasoning?.effort));
772
- const normalizedSlug = input.modelSlug.trim().toLowerCase();
773
- const suffix = normalizedSlug.match(EFFORT_SUFFIX_REGEX)?.[1];
774
- add(suffix);
775
- return out;
776
- }
777
- const COLLABORATION_INSTRUCTION_MARKERS = [
778
- "# Plan Mode",
779
- "# Plan Mode (Conversational)",
780
- "# Sub-agents",
781
- "# Tooling Compatibility ("
782
- ];
783
- function extractCollaborationInstructionTail(instructions) {
784
- const normalized = instructions.trim();
785
- if (!normalized)
786
- return undefined;
787
- let markerIndex;
788
- for (const marker of COLLABORATION_INSTRUCTION_MARKERS) {
789
- const index = normalized.indexOf(marker);
790
- if (index < 0)
791
- continue;
792
- if (markerIndex === undefined || index < markerIndex)
793
- markerIndex = index;
794
- }
795
- if (markerIndex === undefined)
796
- return undefined;
797
- const tail = normalized.slice(markerIndex).trim();
798
- return tail.length > 0 ? tail : undefined;
799
- }
800
- export async function applyCatalogInstructionOverrideToRequest(input) {
801
- if (!input.enabled)
802
- return { request: input.request, changed: false, reason: "disabled" };
803
- const method = input.request.method.toUpperCase();
804
- if (method !== "POST")
805
- return { request: input.request, changed: false, reason: "non_post" };
806
- let payload;
807
- try {
808
- const raw = await input.request.clone().text();
809
- if (!raw)
810
- return { request: input.request, changed: false, reason: "empty_body" };
811
- payload = JSON.parse(raw);
812
- }
813
- catch (error) {
814
- if (!(error instanceof SyntaxError)) {
815
- // request body could not be parsed as JSON
816
- }
817
- return { request: input.request, changed: false, reason: "invalid_json" };
818
- }
819
- if (!isRecord(payload))
820
- return { request: input.request, changed: false, reason: "non_object_body" };
821
- const modelSlugRaw = asString(payload.model);
822
- if (!modelSlugRaw)
823
- return { request: input.request, changed: false, reason: "missing_model" };
824
- const modelCandidates = getModelLookupCandidates({
825
- id: modelSlugRaw,
826
- api: { id: modelSlugRaw }
827
- });
828
- const variantCandidates = getVariantCandidatesFromBody({
829
- body: payload,
830
- modelSlug: modelSlugRaw
831
- });
832
- const effectivePersonality = resolvePersonalityForModel({
833
- behaviorSettings: input.behaviorSettings,
834
- modelCandidates,
835
- variantCandidates,
836
- fallback: input.fallbackPersonality
837
- });
838
- const catalogModel = findCatalogModelForCandidates(input.catalogModels, modelCandidates);
839
- if (!catalogModel)
840
- return { request: input.request, changed: false, reason: "catalog_model_not_found" };
841
- const rendered = resolveInstructionsForModel(catalogModel, effectivePersonality);
842
- if (!rendered)
843
- return { request: input.request, changed: false, reason: "rendered_empty_or_unsafe" };
844
- const renderedForRequest = input.replaceCodexToolCalls === true ? (replaceCodexToolCallsForOpenCode(rendered) ?? rendered) : rendered;
845
- const currentInstructions = asString(payload.instructions);
846
- const preserveOrchestratorInstructions = input.preserveOrchestratorInstructions !== false;
847
- if (preserveOrchestratorInstructions && isOrchestratorInstructions(currentInstructions)) {
848
- return { request: input.request, changed: false, reason: "orchestrator_instructions_preserved" };
849
- }
850
- if (currentInstructions === renderedForRequest) {
851
- return { request: input.request, changed: false, reason: "already_matches" };
852
- }
853
- const collaborationTail = currentInstructions ? extractCollaborationInstructionTail(currentInstructions) : undefined;
854
- const preservedInstructions = collaborationTail ?? currentInstructions?.trim();
855
- const nextInstructions = preservedInstructions ? `${renderedForRequest}\n\n${preservedInstructions}` : renderedForRequest;
856
- if (currentInstructions === nextInstructions) {
857
- return { request: input.request, changed: false, reason: "already_matches" };
858
- }
859
- payload.instructions = nextInstructions;
860
- const updatedRequest = rebuildRequestWithJsonBody(input.request, payload);
861
- return { request: updatedRequest, changed: true, reason: "updated" };
862
- }
1
+ export { applyCodexRuntimeDefaultsToParams, findCatalogModelForCandidates, getModelLookupCandidates, getModelThinkingSummariesOverride, getModelVerbosityEnabledOverride, getModelVerbosityOverride, getVariantLookupCandidates, resolvePersonalityForModel } from "./request-transform-model.js";
2
+ export { applyPromptCacheKeyOverrideToRequest, remapDeveloperMessagesToUserOnRequest, sanitizeOutboundRequestIfNeeded, stripReasoningReplayFromRequest, transformOutboundRequestPayload } from "./request-transform-payload.js";
3
+ export { applyCatalogInstructionOverrideToRequest } from "./request-transform-instructions.js";
863
4
  //# sourceMappingURL=request-transform.js.map