@iam-brain/opencode-codex-auth 0.3.1 → 0.3.2

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/dist/index.js +2 -2
  2. package/dist/index.js.map +1 -1
  3. package/dist/lib/codex-native/accounts.d.ts +21 -0
  4. package/dist/lib/codex-native/accounts.d.ts.map +1 -0
  5. package/dist/lib/codex-native/accounts.js +203 -0
  6. package/dist/lib/codex-native/accounts.js.map +1 -0
  7. package/dist/lib/codex-native/acquire-auth.d.ts +22 -0
  8. package/dist/lib/codex-native/acquire-auth.d.ts.map +1 -0
  9. package/dist/lib/codex-native/acquire-auth.js +338 -0
  10. package/dist/lib/codex-native/acquire-auth.js.map +1 -0
  11. package/dist/lib/codex-native/auth-menu-flow.d.ts +9 -0
  12. package/dist/lib/codex-native/auth-menu-flow.d.ts.map +1 -0
  13. package/dist/lib/codex-native/auth-menu-flow.js +192 -0
  14. package/dist/lib/codex-native/auth-menu-flow.js.map +1 -0
  15. package/dist/lib/codex-native/auth-menu-quotas.d.ts +9 -0
  16. package/dist/lib/codex-native/auth-menu-quotas.d.ts.map +1 -0
  17. package/dist/lib/codex-native/auth-menu-quotas.js +111 -0
  18. package/dist/lib/codex-native/auth-menu-quotas.js.map +1 -0
  19. package/dist/lib/codex-native/catalog-sync.d.ts +28 -0
  20. package/dist/lib/codex-native/catalog-sync.d.ts.map +1 -0
  21. package/dist/lib/codex-native/catalog-sync.js +36 -0
  22. package/dist/lib/codex-native/catalog-sync.js.map +1 -0
  23. package/dist/lib/codex-native/chat-hooks.d.ts +76 -0
  24. package/dist/lib/codex-native/chat-hooks.d.ts.map +1 -0
  25. package/dist/lib/codex-native/chat-hooks.js +136 -0
  26. package/dist/lib/codex-native/chat-hooks.js.map +1 -0
  27. package/dist/lib/codex-native/oauth-auth-methods.d.ts +45 -0
  28. package/dist/lib/codex-native/oauth-auth-methods.d.ts.map +1 -0
  29. package/dist/lib/codex-native/oauth-auth-methods.js +171 -0
  30. package/dist/lib/codex-native/oauth-auth-methods.js.map +1 -0
  31. package/dist/lib/codex-native/oauth-persistence.d.ts +4 -0
  32. package/dist/lib/codex-native/oauth-persistence.d.ts.map +1 -0
  33. package/dist/lib/codex-native/oauth-persistence.js +28 -0
  34. package/dist/lib/codex-native/oauth-persistence.js.map +1 -0
  35. package/dist/lib/codex-native/oauth-server.d.ts.map +1 -1
  36. package/dist/lib/codex-native/oauth-server.js +31 -1
  37. package/dist/lib/codex-native/oauth-server.js.map +1 -1
  38. package/dist/lib/codex-native/oauth-utils.d.ts +51 -0
  39. package/dist/lib/codex-native/oauth-utils.d.ts.map +1 -0
  40. package/dist/lib/codex-native/oauth-utils.js +268 -0
  41. package/dist/lib/codex-native/oauth-utils.js.map +1 -0
  42. package/dist/lib/codex-native/openai-loader-fetch.d.ts +36 -0
  43. package/dist/lib/codex-native/openai-loader-fetch.d.ts.map +1 -0
  44. package/dist/lib/codex-native/openai-loader-fetch.js +191 -0
  45. package/dist/lib/codex-native/openai-loader-fetch.js.map +1 -0
  46. package/dist/lib/codex-native/rate-limit-snapshots.d.ts +2 -0
  47. package/dist/lib/codex-native/rate-limit-snapshots.d.ts.map +1 -0
  48. package/dist/lib/codex-native/rate-limit-snapshots.js +24 -0
  49. package/dist/lib/codex-native/rate-limit-snapshots.js.map +1 -0
  50. package/dist/lib/codex-native/request-routing.d.ts +3 -0
  51. package/dist/lib/codex-native/request-routing.d.ts.map +1 -0
  52. package/dist/lib/codex-native/request-routing.js +41 -0
  53. package/dist/lib/codex-native/request-routing.js.map +1 -0
  54. package/dist/lib/codex-native/request-transform-pipeline.d.ts +19 -0
  55. package/dist/lib/codex-native/request-transform-pipeline.d.ts.map +1 -0
  56. package/dist/lib/codex-native/request-transform-pipeline.js +24 -0
  57. package/dist/lib/codex-native/request-transform-pipeline.js.map +1 -0
  58. package/dist/lib/codex-native/request-transform.d.ts +8 -4
  59. package/dist/lib/codex-native/request-transform.d.ts.map +1 -1
  60. package/dist/lib/codex-native/request-transform.js +103 -33
  61. package/dist/lib/codex-native/request-transform.js.map +1 -1
  62. package/dist/lib/codex-native/session-affinity-state.d.ts +15 -0
  63. package/dist/lib/codex-native/session-affinity-state.d.ts.map +1 -0
  64. package/dist/lib/codex-native/session-affinity-state.js +49 -0
  65. package/dist/lib/codex-native/session-affinity-state.js.map +1 -0
  66. package/dist/lib/codex-native/session-messages.d.ts +8 -0
  67. package/dist/lib/codex-native/session-messages.d.ts.map +1 -0
  68. package/dist/lib/codex-native/session-messages.js +55 -0
  69. package/dist/lib/codex-native/session-messages.js.map +1 -0
  70. package/dist/lib/codex-native.d.ts +6 -30
  71. package/dist/lib/codex-native.d.ts.map +1 -1
  72. package/dist/lib/codex-native.js +113 -1641
  73. package/dist/lib/codex-native.js.map +1 -1
  74. package/dist/lib/config.d.ts +11 -11
  75. package/dist/lib/config.d.ts.map +1 -1
  76. package/dist/lib/config.js +109 -152
  77. package/dist/lib/config.js.map +1 -1
  78. package/dist/lib/model-catalog.d.ts +1 -0
  79. package/dist/lib/model-catalog.d.ts.map +1 -1
  80. package/dist/lib/model-catalog.js +166 -8
  81. package/dist/lib/model-catalog.js.map +1 -1
  82. package/dist/lib/request-snapshots.d.ts +2 -0
  83. package/dist/lib/request-snapshots.d.ts.map +1 -1
  84. package/dist/lib/request-snapshots.js +48 -1
  85. package/dist/lib/request-snapshots.js.map +1 -1
  86. package/dist/lib/rotation.d.ts.map +1 -1
  87. package/dist/lib/rotation.js +3 -0
  88. package/dist/lib/rotation.js.map +1 -1
  89. package/package.json +3 -2
  90. package/schemas/codex-config.schema.json +12 -43
@@ -0,0 +1,191 @@
1
+ import { FetchOrchestrator } from "../fetch-orchestrator";
2
+ import { PluginFatalError, isPluginFatalError, toSyntheticErrorResponse } from "../fatal-errors";
3
+ import { acquireOpenAIAuth } from "./acquire-auth";
4
+ import { resolveRequestUserAgent } from "./client-identity";
5
+ import { resolveCodexOriginator } from "./originator";
6
+ import { persistRateLimitSnapshotFromResponse } from "./rate-limit-snapshots";
7
+ import { assertAllowedOutboundUrl, rewriteUrl } from "./request-routing";
8
+ import { applyRequestTransformPipeline } from "./request-transform-pipeline";
9
+ import { sanitizeOutboundRequestIfNeeded } from "./request-transform";
10
+ export function createOpenAIFetchHandler(input) {
11
+ return async (requestInput, init) => {
12
+ const baseRequest = new Request(requestInput, init);
13
+ if (input.headerTransformDebug) {
14
+ await input.requestSnapshots.captureRequest("before-header-transform", baseRequest, {
15
+ spoofMode: input.spoofMode
16
+ });
17
+ }
18
+ let outbound = new Request(rewriteUrl(baseRequest), baseRequest);
19
+ const inboundOriginator = outbound.headers.get("originator")?.trim();
20
+ const outboundOriginator = inboundOriginator === "opencode" || inboundOriginator === "codex_exec" || inboundOriginator === "codex_cli_rs"
21
+ ? inboundOriginator
22
+ : resolveCodexOriginator(input.spoofMode);
23
+ outbound.headers.set("originator", outboundOriginator);
24
+ const inboundUserAgent = outbound.headers.get("user-agent")?.trim();
25
+ if (input.spoofMode === "native" && inboundUserAgent) {
26
+ outbound.headers.set("user-agent", inboundUserAgent);
27
+ }
28
+ else {
29
+ outbound.headers.set("user-agent", resolveRequestUserAgent(input.spoofMode, outboundOriginator));
30
+ }
31
+ if (outbound.headers.has(input.internalCollaborationModeHeader)) {
32
+ outbound.headers.delete(input.internalCollaborationModeHeader);
33
+ }
34
+ const transformed = await applyRequestTransformPipeline({
35
+ request: outbound,
36
+ spoofMode: input.spoofMode,
37
+ remapDeveloperMessagesToUserEnabled: input.remapDeveloperMessagesToUserEnabled,
38
+ catalogModels: input.getCatalogModels(),
39
+ behaviorSettings: input.behaviorSettings,
40
+ fallbackPersonality: input.personality
41
+ });
42
+ outbound = transformed.request;
43
+ const isSubagentRequest = transformed.isSubagentRequest;
44
+ if (input.headerTransformDebug) {
45
+ await input.requestSnapshots.captureRequest("after-header-transform", outbound, {
46
+ spoofMode: input.spoofMode,
47
+ instructionsOverridden: transformed.instructionOverride.changed,
48
+ instructionOverrideReason: transformed.instructionOverride.reason,
49
+ developerMessagesRemapped: transformed.developerRoleRemap.changed,
50
+ developerMessageRemapReason: transformed.developerRoleRemap.reason,
51
+ developerMessageRemapCount: transformed.developerRoleRemap.remappedCount,
52
+ developerMessagePreservedCount: transformed.developerRoleRemap.preservedCount,
53
+ ...(isSubagentRequest ? { subagent: transformed.subagentHeader } : {})
54
+ });
55
+ }
56
+ let selectedIdentityKey;
57
+ await input.requestSnapshots.captureRequest("before-auth", outbound, { spoofMode: input.spoofMode });
58
+ const { orchestratorState, stickySessionState, hybridSessionState, persistSessionAffinityState } = input.sessionAffinityState;
59
+ const orchestrator = new FetchOrchestrator({
60
+ acquireAuth: async (context) => {
61
+ const auth = await acquireOpenAIAuth({
62
+ authMode: input.authMode,
63
+ context,
64
+ isSubagentRequest,
65
+ stickySessionState,
66
+ hybridSessionState,
67
+ seenSessionKeys: orchestratorState.seenSessionKeys,
68
+ persistSessionAffinityState,
69
+ pidOffsetEnabled: input.pidOffsetEnabled,
70
+ configuredRotationStrategy: input.configuredRotationStrategy,
71
+ log: input.log
72
+ });
73
+ if (input.spoofMode === "codex") {
74
+ const catalogModels = input.getCatalogModels();
75
+ const shouldAwaitCatalog = !catalogModels || catalogModels.length === 0;
76
+ if (shouldAwaitCatalog) {
77
+ try {
78
+ await input.syncCatalogFromAuth({ accessToken: auth.access, accountId: auth.accountId });
79
+ }
80
+ catch {
81
+ // best-effort catalog load; request can still proceed
82
+ }
83
+ }
84
+ else {
85
+ void input.syncCatalogFromAuth({ accessToken: auth.access, accountId: auth.accountId }).catch(() => { });
86
+ }
87
+ }
88
+ else {
89
+ void input.syncCatalogFromAuth({ accessToken: auth.access, accountId: auth.accountId }).catch(() => { });
90
+ }
91
+ selectedIdentityKey = auth.identityKey;
92
+ return auth;
93
+ },
94
+ setCooldown: input.setCooldown,
95
+ quietMode: input.quietMode,
96
+ state: orchestratorState,
97
+ onSessionObserved: ({ event, sessionKey }) => {
98
+ if (isSubagentRequest) {
99
+ orchestratorState.seenSessionKeys.delete(sessionKey);
100
+ stickySessionState.bySessionKey.delete(sessionKey);
101
+ hybridSessionState.bySessionKey.delete(sessionKey);
102
+ return;
103
+ }
104
+ if (event === "new" || event === "resume" || event === "switch") {
105
+ persistSessionAffinityState();
106
+ }
107
+ },
108
+ showToast: input.showToast,
109
+ onAttemptRequest: async ({ attempt, maxAttempts, request, auth, sessionKey }) => {
110
+ const transformed = await applyRequestTransformPipeline({
111
+ request,
112
+ spoofMode: input.spoofMode,
113
+ remapDeveloperMessagesToUserEnabled: input.remapDeveloperMessagesToUserEnabled,
114
+ catalogModels: input.getCatalogModels(),
115
+ behaviorSettings: input.behaviorSettings,
116
+ fallbackPersonality: input.personality
117
+ });
118
+ await input.requestSnapshots.captureRequest("outbound-attempt", transformed.request, {
119
+ attempt: attempt + 1,
120
+ maxAttempts,
121
+ sessionKey,
122
+ identityKey: auth.identityKey,
123
+ accountLabel: auth.accountLabel,
124
+ instructionsOverridden: transformed.instructionOverride.changed,
125
+ instructionOverrideReason: transformed.instructionOverride.reason,
126
+ developerMessagesRemapped: transformed.developerRoleRemap.changed,
127
+ developerMessageRemapReason: transformed.developerRoleRemap.reason,
128
+ developerMessageRemapCount: transformed.developerRoleRemap.remappedCount,
129
+ developerMessagePreservedCount: transformed.developerRoleRemap.preservedCount
130
+ });
131
+ return transformed.request;
132
+ },
133
+ onAttemptResponse: async ({ attempt, maxAttempts, response, auth, sessionKey }) => {
134
+ await input.requestSnapshots.captureResponse("outbound-response", response, {
135
+ attempt: attempt + 1,
136
+ maxAttempts,
137
+ sessionKey,
138
+ identityKey: auth.identityKey,
139
+ accountLabel: auth.accountLabel
140
+ });
141
+ }
142
+ });
143
+ const sanitizedOutbound = await sanitizeOutboundRequestIfNeeded(outbound, input.compatInputSanitizerEnabled);
144
+ if (sanitizedOutbound.changed) {
145
+ input.log?.debug("compat input sanitizer applied", { mode: input.spoofMode });
146
+ }
147
+ await input.requestSnapshots.captureRequest("after-sanitize", sanitizedOutbound.request, {
148
+ spoofMode: input.spoofMode,
149
+ sanitized: sanitizedOutbound.changed
150
+ });
151
+ try {
152
+ assertAllowedOutboundUrl(new URL(sanitizedOutbound.request.url));
153
+ }
154
+ catch (error) {
155
+ if (isPluginFatalError(error)) {
156
+ return toSyntheticErrorResponse(error);
157
+ }
158
+ return toSyntheticErrorResponse(new PluginFatalError({
159
+ message: "Outbound request validation failed before sending to OpenAI backend.",
160
+ status: 400,
161
+ type: "disallowed_outbound_request",
162
+ param: "request"
163
+ }));
164
+ }
165
+ let response;
166
+ try {
167
+ response = await orchestrator.execute(sanitizedOutbound.request);
168
+ }
169
+ catch (error) {
170
+ if (isPluginFatalError(error)) {
171
+ input.log?.debug("fatal auth/error response", {
172
+ type: error.type,
173
+ status: error.status
174
+ });
175
+ return toSyntheticErrorResponse(error);
176
+ }
177
+ input.log?.debug("unexpected fetch failure", {
178
+ error: error instanceof Error ? error.message : String(error)
179
+ });
180
+ return toSyntheticErrorResponse(new PluginFatalError({
181
+ message: "OpenAI request failed unexpectedly. Retry once, and if it persists run `opencode auth login`.",
182
+ status: 502,
183
+ type: "plugin_fetch_failed",
184
+ param: "request"
185
+ }));
186
+ }
187
+ persistRateLimitSnapshotFromResponse(response, selectedIdentityKey);
188
+ return response;
189
+ };
190
+ }
191
+ //# sourceMappingURL=openai-loader-fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-loader-fetch.js","sourceRoot":"","sources":["../../../lib/codex-native/openai-loader-fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function persistRateLimitSnapshotFromResponse(response: Response, identityKey: string | undefined): void;
2
+ //# sourceMappingURL=rate-limit-snapshots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-snapshots.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/rate-limit-snapshots.ts"],"names":[],"mappings":"AAIA,wBAAgB,oCAAoC,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAqB9G"}
@@ -0,0 +1,24 @@
1
+ import { CodexStatus } from "../codex-status";
2
+ import { saveSnapshots } from "../codex-status-storage";
3
+ import { defaultSnapshotsPath } from "../paths";
4
+ export function persistRateLimitSnapshotFromResponse(response, identityKey) {
5
+ if (!identityKey)
6
+ return;
7
+ const headers = {};
8
+ response.headers.forEach((value, key) => {
9
+ headers[key.toLowerCase()] = value;
10
+ });
11
+ const status = new CodexStatus();
12
+ const snapshot = status.parseFromHeaders({
13
+ now: Date.now(),
14
+ modelFamily: "codex",
15
+ headers
16
+ });
17
+ if (snapshot.limits.length === 0)
18
+ return;
19
+ void saveSnapshots(defaultSnapshotsPath(), (current) => ({
20
+ ...current,
21
+ [identityKey]: snapshot
22
+ })).catch(() => { });
23
+ }
24
+ //# sourceMappingURL=rate-limit-snapshots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit-snapshots.js","sourceRoot":"","sources":["../../../lib/codex-native/rate-limit-snapshots.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,iBAAiB,CAAA;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAE/C,MAAM,UAAU,oCAAoC,CAAC,QAAkB,EAAE,WAA+B;IACtG,IAAI,CAAC,WAAW;QAAE,OAAM;IAExB,MAAM,OAAO,GAAc,EAAE,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAA;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACvC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACf,WAAW,EAAE,OAAO;QACpB,OAAO;KACR,CAAC,CAAA;IAEF,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAExC,KAAK,aAAa,CAAC,oBAAoB,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG,OAAO;QACV,CAAC,WAAW,CAAC,EAAE,QAAQ;KACxB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function rewriteUrl(requestInput: string | URL | Request): URL;
2
+ export declare function assertAllowedOutboundUrl(url: URL): void;
3
+ //# sourceMappingURL=request-routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-routing.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/request-routing.ts"],"names":[],"mappings":"AAKA,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,GAAG,GAAG,CAWpE;AASD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAsBvD"}
@@ -0,0 +1,41 @@
1
+ import { PluginFatalError } from "../fatal-errors";
2
+ const CODEX_API_ENDPOINT = "https://chatgpt.com/backend-api/codex/responses";
3
+ const OPENAI_OUTBOUND_HOST_ALLOWLIST = new Set(["api.openai.com", "auth.openai.com", "chat.openai.com", "chatgpt.com"]);
4
+ export function rewriteUrl(requestInput) {
5
+ const parsed = requestInput instanceof URL
6
+ ? requestInput
7
+ : new URL(typeof requestInput === "string" ? requestInput : requestInput.url);
8
+ if (parsed.pathname.includes("/v1/responses") || parsed.pathname.includes("/chat/completions")) {
9
+ return new URL(CODEX_API_ENDPOINT);
10
+ }
11
+ return parsed;
12
+ }
13
+ function isAllowedOpenAIOutboundHost(hostname) {
14
+ const normalized = hostname.trim().toLowerCase();
15
+ if (!normalized)
16
+ return false;
17
+ if (OPENAI_OUTBOUND_HOST_ALLOWLIST.has(normalized))
18
+ return true;
19
+ return normalized.endsWith(".openai.com") || normalized.endsWith(".chatgpt.com");
20
+ }
21
+ export function assertAllowedOutboundUrl(url) {
22
+ const protocol = url.protocol.trim().toLowerCase();
23
+ if (protocol !== "https:") {
24
+ throw new PluginFatalError({
25
+ message: `Blocked outbound request with unsupported protocol "${protocol || "unknown"}". ` +
26
+ "This plugin only proxies HTTPS requests to OpenAI/ChatGPT backends.",
27
+ status: 400,
28
+ type: "disallowed_outbound_protocol",
29
+ param: "request"
30
+ });
31
+ }
32
+ if (isAllowedOpenAIOutboundHost(url.hostname))
33
+ return;
34
+ throw new PluginFatalError({
35
+ message: `Blocked outbound request to "${url.hostname}". ` + "This plugin only proxies OpenAI/ChatGPT backend traffic.",
36
+ status: 400,
37
+ type: "disallowed_outbound_host",
38
+ param: "request"
39
+ });
40
+ }
41
+ //# sourceMappingURL=request-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-routing.js","sourceRoot":"","sources":["../../../lib/codex-native/request-routing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,kBAAkB,GAAG,iDAAiD,CAAA;AAC5E,MAAM,8BAA8B,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC,CAAA;AAEvH,MAAM,UAAU,UAAU,CAAC,YAAoC;IAC7D,MAAM,MAAM,GACV,YAAY,YAAY,GAAG;QACzB,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAI,GAAG,CAAC,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;IAEjF,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;QAC/F,OAAO,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,2BAA2B,CAAC,QAAgB;IACnD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAChD,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAA;IAC7B,IAAI,8BAA8B,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IAC/D,OAAO,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAQ;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAClD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,gBAAgB,CAAC;YACzB,OAAO,EACL,uDAAuD,QAAQ,IAAI,SAAS,KAAK;gBACjF,qEAAqE;YACvE,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,8BAA8B;YACpC,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,2BAA2B,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAM;IAErD,MAAM,IAAI,gBAAgB,CAAC;QACzB,OAAO,EACL,gCAAgC,GAAG,CAAC,QAAQ,KAAK,GAAG,0DAA0D;QAChH,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { BehaviorSettings, CodexSpoofMode, PersonalityOption } from "../config";
2
+ import type { CodexModelInfo } from "../model-catalog";
3
+ import { applyCatalogInstructionOverrideToRequest, remapDeveloperMessagesToUserOnRequest } from "./request-transform";
4
+ export type RequestTransformPipelineResult = {
5
+ request: Request;
6
+ instructionOverride: Awaited<ReturnType<typeof applyCatalogInstructionOverrideToRequest>>;
7
+ developerRoleRemap: Awaited<ReturnType<typeof remapDeveloperMessagesToUserOnRequest>>;
8
+ subagentHeader?: string;
9
+ isSubagentRequest: boolean;
10
+ };
11
+ export declare function applyRequestTransformPipeline(input: {
12
+ request: Request;
13
+ spoofMode: CodexSpoofMode;
14
+ remapDeveloperMessagesToUserEnabled: boolean;
15
+ catalogModels: CodexModelInfo[] | undefined;
16
+ behaviorSettings?: BehaviorSettings;
17
+ fallbackPersonality?: PersonalityOption;
18
+ }): Promise<RequestTransformPipelineResult>;
19
+ //# sourceMappingURL=request-transform-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-transform-pipeline.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/request-transform-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,wCAAwC,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAA;AAErH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,OAAO,EAAE,OAAO,CAAA;IAChB,mBAAmB,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,wCAAwC,CAAC,CAAC,CAAA;IACzF,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,qCAAqC,CAAC,CAAC,CAAA;IACrF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iBAAiB,EAAE,OAAO,CAAA;CAC3B,CAAA;AAED,wBAAsB,6BAA6B,CAAC,KAAK,EAAE;IACzD,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,cAAc,CAAA;IACzB,mCAAmC,EAAE,OAAO,CAAA;IAC5C,aAAa,EAAE,cAAc,EAAE,GAAG,SAAS,CAAA;IAC3C,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,mBAAmB,CAAC,EAAE,iBAAiB,CAAA;CACxC,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAsB1C"}
@@ -0,0 +1,24 @@
1
+ import { applyCatalogInstructionOverrideToRequest, remapDeveloperMessagesToUserOnRequest } from "./request-transform";
2
+ export async function applyRequestTransformPipeline(input) {
3
+ const instructionOverride = await applyCatalogInstructionOverrideToRequest({
4
+ request: input.request,
5
+ enabled: input.spoofMode === "codex",
6
+ catalogModels: input.catalogModels,
7
+ behaviorSettings: input.behaviorSettings,
8
+ fallbackPersonality: input.fallbackPersonality
9
+ });
10
+ const developerRoleRemap = await remapDeveloperMessagesToUserOnRequest({
11
+ request: instructionOverride.request,
12
+ enabled: input.remapDeveloperMessagesToUserEnabled
13
+ });
14
+ const request = developerRoleRemap.request;
15
+ const subagentHeader = request.headers.get("x-openai-subagent")?.trim();
16
+ return {
17
+ request,
18
+ instructionOverride,
19
+ developerRoleRemap,
20
+ subagentHeader: subagentHeader || undefined,
21
+ isSubagentRequest: Boolean(subagentHeader)
22
+ };
23
+ }
24
+ //# sourceMappingURL=request-transform-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-transform-pipeline.js","sourceRoot":"","sources":["../../../lib/codex-native/request-transform-pipeline.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wCAAwC,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAA;AAUrH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CAAC,KAOnD;IACC,MAAM,mBAAmB,GAAG,MAAM,wCAAwC,CAAC;QACzE,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO,EAAE,KAAK,CAAC,SAAS,KAAK,OAAO;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,mBAAmB,EAAE,KAAK,CAAC,mBAAmB;KAC/C,CAAC,CAAA;IACF,MAAM,kBAAkB,GAAG,MAAM,qCAAqC,CAAC;QACrE,OAAO,EAAE,mBAAmB,CAAC,OAAO;QACpC,OAAO,EAAE,KAAK,CAAC,mCAAmC;KACnD,CAAC,CAAA;IACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAA;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAA;IAEvE,OAAO;QACL,OAAO;QACP,mBAAmB;QACnB,kBAAkB;QAClB,cAAc,EAAE,cAAc,IAAI,SAAS;QAC3C,iBAAiB,EAAE,OAAO,CAAC,cAAc,CAAC;KAC3C,CAAA;AACH,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { CustomSettings, PersonalityOption } from "../config";
1
+ import type { BehaviorSettings, PersonalityOption } from "../config";
2
2
  import type { CodexModelInfo } from "../model-catalog";
3
3
  type ChatParamsOutput = {
4
4
  temperature: number;
@@ -17,9 +17,11 @@ export declare function getVariantLookupCandidates(input: {
17
17
  modelCandidates: string[];
18
18
  }): string[];
19
19
  export declare function findCatalogModelForCandidates(catalogModels: CodexModelInfo[] | undefined, modelCandidates: string[]): CodexModelInfo | undefined;
20
- export declare function getModelThinkingSummariesOverride(customSettings: CustomSettings | undefined, modelCandidates: string[], variantCandidates: string[]): boolean | undefined;
20
+ export declare function getModelThinkingSummariesOverride(behaviorSettings: BehaviorSettings | undefined, modelCandidates: string[], variantCandidates: string[]): boolean | undefined;
21
+ export declare function getModelVerbosityEnabledOverride(behaviorSettings: BehaviorSettings | undefined, modelCandidates: string[], variantCandidates: string[]): boolean | undefined;
22
+ export declare function getModelVerbosityOverride(behaviorSettings: BehaviorSettings | undefined, modelCandidates: string[], variantCandidates: string[]): "default" | "low" | "medium" | "high" | undefined;
21
23
  export declare function resolvePersonalityForModel(input: {
22
- customSettings?: CustomSettings;
24
+ behaviorSettings?: BehaviorSettings;
23
25
  modelCandidates: string[];
24
26
  variantCandidates: string[];
25
27
  fallback?: PersonalityOption;
@@ -28,6 +30,8 @@ export declare function applyCodexRuntimeDefaultsToParams(input: {
28
30
  modelOptions: Record<string, unknown>;
29
31
  modelToolCallCapable: boolean | undefined;
30
32
  thinkingSummariesOverride: boolean | undefined;
33
+ verbosityEnabledOverride: boolean | undefined;
34
+ verbosityOverride: "default" | "low" | "medium" | "high" | undefined;
31
35
  preferCodexInstructions: boolean;
32
36
  output: ChatParamsOutput;
33
37
  }): void;
@@ -49,7 +53,7 @@ export declare function applyCatalogInstructionOverrideToRequest(input: {
49
53
  request: Request;
50
54
  enabled: boolean;
51
55
  catalogModels: CodexModelInfo[] | undefined;
52
- customSettings: CustomSettings | undefined;
56
+ behaviorSettings: BehaviorSettings | undefined;
53
57
  fallbackPersonality: PersonalityOption | undefined;
54
58
  }): Promise<{
55
59
  request: Request;
@@ -1 +1 @@
1
- {"version":3,"file":"request-transform.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/request-transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAItD,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC,CAAA;AAsED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG,MAAM,EAAE,CAiBhG;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,EAAE,CAsB5G;AAQD,wBAAgB,6BAA6B,CAC3C,aAAa,EAAE,cAAc,EAAE,GAAG,SAAS,EAC3C,eAAe,EAAE,MAAM,EAAE,GACxB,cAAc,GAAG,SAAS,CAgB5B;AA8CD,wBAAgB,iCAAiC,CAC/C,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,eAAe,EAAE,MAAM,EAAE,EACzB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,GAAG,SAAS,CAqBrB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CAC7B,GAAG,MAAM,GAAG,SAAS,CAYrB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAAA;IACzC,yBAAyB,EAAE,OAAO,GAAG,SAAS,CAAA;IAC9C,uBAAuB,EAAE,OAAO,CAAA;IAChC,MAAM,EAAE,gBAAgB,CAAA;CACzB,GAAG,IAAI,CAkEP;AAED,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8BjD;AAwBD,wBAAsB,qCAAqC,CAAC,KAAK,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;IAClH,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;CACvB,CAAC,CA+GD;AAuBD,wBAAsB,wCAAwC,CAAC,KAAK,EAAE;IACpE,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,cAAc,EAAE,GAAG,SAAS,CAAA;IAC3C,cAAc,EAAE,cAAc,GAAG,SAAS,CAAA;IAC1C,mBAAmB,EAAE,iBAAiB,GAAG,SAAS,CAAA;CACnD,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAqDlE"}
1
+ {"version":3,"file":"request-transform.d.ts","sourceRoot":"","sources":["../../../lib/codex-native/request-transform.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,23 @@ function normalizeReasoningSummaryOption(value) {
22
22
  return normalized;
23
23
  return undefined;
24
24
  }
25
+ function normalizeTextVerbosity(value) {
26
+ const normalized = asString(value)?.toLowerCase();
27
+ if (!normalized)
28
+ return undefined;
29
+ if (normalized === "low" || normalized === "medium" || normalized === "high")
30
+ return normalized;
31
+ return undefined;
32
+ }
33
+ function normalizeVerbositySetting(value) {
34
+ const normalized = asString(value)?.toLowerCase();
35
+ if (!normalized)
36
+ return undefined;
37
+ if (normalized === "default" || normalized === "low" || normalized === "medium" || normalized === "high") {
38
+ return normalized;
39
+ }
40
+ return undefined;
41
+ }
25
42
  function readModelRuntimeDefaults(options) {
26
43
  const raw = options.codexRuntimeDefaults;
27
44
  if (!isRecord(raw))
@@ -137,8 +154,8 @@ function resolveCaseInsensitiveEntry(entries, candidate) {
137
154
  }
138
155
  return undefined;
139
156
  }
140
- function getModelPersonalityOverride(customSettings, modelCandidates, variantCandidates) {
141
- const models = customSettings?.models;
157
+ function getModelPersonalityOverride(behaviorSettings, modelCandidates, variantCandidates) {
158
+ const models = behaviorSettings?.perModel;
142
159
  if (!models)
143
160
  return undefined;
144
161
  for (const candidate of modelCandidates) {
@@ -147,18 +164,18 @@ function getModelPersonalityOverride(customSettings, modelCandidates, variantCan
147
164
  continue;
148
165
  for (const variantCandidate of variantCandidates) {
149
166
  const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
150
- const variantPersonality = normalizePersonalityKey(variantEntry?.options?.personality);
167
+ const variantPersonality = normalizePersonalityKey(variantEntry?.personality);
151
168
  if (variantPersonality)
152
169
  return variantPersonality;
153
170
  }
154
- const modelPersonality = normalizePersonalityKey(entry.options?.personality);
171
+ const modelPersonality = normalizePersonalityKey(entry.personality);
155
172
  if (modelPersonality)
156
173
  return modelPersonality;
157
174
  }
158
175
  return undefined;
159
176
  }
160
- export function getModelThinkingSummariesOverride(customSettings, modelCandidates, variantCandidates) {
161
- const models = customSettings?.models;
177
+ export function getModelThinkingSummariesOverride(behaviorSettings, modelCandidates, variantCandidates) {
178
+ const models = behaviorSettings?.perModel;
162
179
  if (!models)
163
180
  return undefined;
164
181
  for (const candidate of modelCandidates) {
@@ -177,11 +194,51 @@ export function getModelThinkingSummariesOverride(customSettings, modelCandidate
177
194
  }
178
195
  return undefined;
179
196
  }
197
+ export function getModelVerbosityEnabledOverride(behaviorSettings, modelCandidates, variantCandidates) {
198
+ const models = behaviorSettings?.perModel;
199
+ if (!models)
200
+ return undefined;
201
+ for (const candidate of modelCandidates) {
202
+ const entry = resolveCaseInsensitiveEntry(models, candidate);
203
+ if (!entry)
204
+ continue;
205
+ for (const variantCandidate of variantCandidates) {
206
+ const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
207
+ if (typeof variantEntry?.verbosityEnabled === "boolean") {
208
+ return variantEntry.verbosityEnabled;
209
+ }
210
+ }
211
+ if (typeof entry.verbosityEnabled === "boolean") {
212
+ return entry.verbosityEnabled;
213
+ }
214
+ }
215
+ return undefined;
216
+ }
217
+ export function getModelVerbosityOverride(behaviorSettings, modelCandidates, variantCandidates) {
218
+ const models = behaviorSettings?.perModel;
219
+ if (!models)
220
+ return undefined;
221
+ for (const candidate of modelCandidates) {
222
+ const entry = resolveCaseInsensitiveEntry(models, candidate);
223
+ if (!entry)
224
+ continue;
225
+ for (const variantCandidate of variantCandidates) {
226
+ const variantEntry = resolveCaseInsensitiveEntry(entry.variants, variantCandidate);
227
+ const variantVerbosity = normalizeVerbositySetting(variantEntry?.verbosity);
228
+ if (variantVerbosity)
229
+ return variantVerbosity;
230
+ }
231
+ const modelVerbosity = normalizeVerbositySetting(entry.verbosity);
232
+ if (modelVerbosity)
233
+ return modelVerbosity;
234
+ }
235
+ return undefined;
236
+ }
180
237
  export function resolvePersonalityForModel(input) {
181
- const modelOverride = getModelPersonalityOverride(input.customSettings, input.modelCandidates, input.variantCandidates);
238
+ const modelOverride = getModelPersonalityOverride(input.behaviorSettings, input.modelCandidates, input.variantCandidates);
182
239
  if (modelOverride)
183
240
  return modelOverride;
184
- const globalOverride = normalizePersonalityKey(input.customSettings?.options?.personality);
241
+ const globalOverride = normalizePersonalityKey(input.behaviorSettings?.global?.personality);
185
242
  if (globalOverride)
186
243
  return globalOverride;
187
244
  return normalizePersonalityKey(input.fallback);
@@ -225,10 +282,26 @@ export function applyCodexRuntimeDefaultsToParams(input) {
225
282
  }
226
283
  }
227
284
  }
228
- if (asString(options.textVerbosity) === undefined &&
229
- defaults.defaultVerbosity &&
230
- (defaults.supportsVerbosity ?? true)) {
231
- options.textVerbosity = defaults.defaultVerbosity;
285
+ const rawTextVerbosity = asString(options.textVerbosity);
286
+ const explicitTextVerbosity = normalizeTextVerbosity(rawTextVerbosity);
287
+ if (rawTextVerbosity !== undefined && !explicitTextVerbosity) {
288
+ delete options.textVerbosity;
289
+ }
290
+ const verbosityEnabled = input.verbosityEnabledOverride ?? true;
291
+ const verbositySetting = input.verbosityOverride ?? "default";
292
+ const supportsVerbosity = defaults.supportsVerbosity !== false;
293
+ if (!supportsVerbosity || !verbosityEnabled) {
294
+ delete options.textVerbosity;
295
+ }
296
+ else if (normalizeTextVerbosity(options.textVerbosity) === undefined) {
297
+ if (verbositySetting === "default") {
298
+ if (defaults.defaultVerbosity) {
299
+ options.textVerbosity = defaults.defaultVerbosity;
300
+ }
301
+ }
302
+ else {
303
+ options.textVerbosity = verbositySetting;
304
+ }
232
305
  }
233
306
  if (asString(options.applyPatchToolType) === undefined && defaults.applyPatchToolType) {
234
307
  options.applyPatchToolType = defaults.applyPatchToolType;
@@ -266,15 +339,26 @@ export async function sanitizeOutboundRequestIfNeeded(request, enabled) {
266
339
  const sanitized = sanitizeRequestPayloadForCompat(payload);
267
340
  if (!sanitized.changed)
268
341
  return { request, changed: false };
342
+ const sanitizedRequest = rebuildRequestWithJsonBody(request, sanitized.payload);
343
+ return { request: sanitizedRequest, changed: true };
344
+ }
345
+ function rebuildRequestWithJsonBody(request, body) {
269
346
  const headers = new Headers(request.headers);
270
347
  headers.set("content-type", "application/json");
271
- const sanitizedRequest = new Request(request.url, {
348
+ return new Request(request.url, {
272
349
  method: request.method,
273
350
  headers,
274
- body: JSON.stringify(sanitized.payload),
275
- redirect: request.redirect
351
+ body: JSON.stringify(body),
352
+ redirect: request.redirect,
353
+ signal: request.signal,
354
+ credentials: request.credentials,
355
+ cache: request.cache,
356
+ mode: request.mode,
357
+ referrer: request.referrer,
358
+ referrerPolicy: request.referrerPolicy,
359
+ integrity: request.integrity,
360
+ keepalive: request.keepalive
276
361
  });
277
- return { request: sanitizedRequest, changed: true };
278
362
  }
279
363
  function messageContentToText(value) {
280
364
  if (typeof value === "string")
@@ -392,14 +476,7 @@ export async function remapDeveloperMessagesToUserOnRequest(input) {
392
476
  };
393
477
  }
394
478
  payload.input = nextInput;
395
- const headers = new Headers(input.request.headers);
396
- headers.set("content-type", "application/json");
397
- const updatedRequest = new Request(input.request.url, {
398
- method: input.request.method,
399
- headers,
400
- body: JSON.stringify(payload),
401
- redirect: input.request.redirect
402
- });
479
+ const updatedRequest = rebuildRequestWithJsonBody(input.request, payload);
403
480
  return {
404
481
  request: updatedRequest,
405
482
  changed: true,
@@ -457,7 +534,7 @@ export async function applyCatalogInstructionOverrideToRequest(input) {
457
534
  modelSlug: modelSlugRaw
458
535
  });
459
536
  const effectivePersonality = resolvePersonalityForModel({
460
- customSettings: input.customSettings,
537
+ behaviorSettings: input.behaviorSettings,
461
538
  modelCandidates,
462
539
  variantCandidates,
463
540
  fallback: input.fallbackPersonality
@@ -472,14 +549,7 @@ export async function applyCatalogInstructionOverrideToRequest(input) {
472
549
  return { request: input.request, changed: false, reason: "already_matches" };
473
550
  }
474
551
  payload.instructions = rendered;
475
- const headers = new Headers(input.request.headers);
476
- headers.set("content-type", "application/json");
477
- const updatedRequest = new Request(input.request.url, {
478
- method: input.request.method,
479
- headers,
480
- body: JSON.stringify(payload),
481
- redirect: input.request.redirect
482
- });
552
+ const updatedRequest = rebuildRequestWithJsonBody(input.request, payload);
483
553
  return { request: updatedRequest, changed: true, reason: "updated" };
484
554
  }
485
555
  //# sourceMappingURL=request-transform.js.map