@iam-brain/opencode-codex-auth 1.2.4 → 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.
- package/README.md +42 -83
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -18
- package/dist/index.js.map +1 -1
- package/dist/lib/accounts-tools.d.ts.map +1 -1
- package/dist/lib/accounts-tools.js +112 -29
- package/dist/lib/accounts-tools.js.map +1 -1
- package/dist/lib/cache-io.d.ts.map +1 -1
- package/dist/lib/cache-io.js +6 -1
- package/dist/lib/cache-io.js.map +1 -1
- package/dist/lib/codex-native/accounts.d.ts.map +1 -1
- package/dist/lib/codex-native/accounts.js +18 -12
- package/dist/lib/codex-native/accounts.js.map +1 -1
- package/dist/lib/codex-native/acquire-auth.d.ts +1 -1
- package/dist/lib/codex-native/acquire-auth.d.ts.map +1 -1
- package/dist/lib/codex-native/acquire-auth.js +318 -204
- package/dist/lib/codex-native/acquire-auth.js.map +1 -1
- package/dist/lib/codex-native/auth-menu-flow.d.ts.map +1 -1
- package/dist/lib/codex-native/auth-menu-flow.js +27 -12
- package/dist/lib/codex-native/auth-menu-flow.js.map +1 -1
- package/dist/lib/codex-native/auth-menu-quotas.d.ts.map +1 -1
- package/dist/lib/codex-native/auth-menu-quotas.js +11 -4
- package/dist/lib/codex-native/auth-menu-quotas.js.map +1 -1
- package/dist/lib/codex-native/catalog-auth.d.ts.map +1 -1
- package/dist/lib/codex-native/catalog-auth.js +4 -2
- package/dist/lib/codex-native/catalog-auth.js.map +1 -1
- package/dist/lib/codex-native/chat-hooks.d.ts.map +1 -1
- package/dist/lib/codex-native/chat-hooks.js +0 -8
- package/dist/lib/codex-native/chat-hooks.js.map +1 -1
- package/dist/lib/codex-native/client-identity.d.ts.map +1 -1
- package/dist/lib/codex-native/client-identity.js +11 -4
- package/dist/lib/codex-native/client-identity.js.map +1 -1
- package/dist/lib/codex-native/collaboration.d.ts +1 -1
- package/dist/lib/codex-native/collaboration.d.ts.map +1 -1
- package/dist/lib/codex-native/collaboration.js +9 -116
- package/dist/lib/codex-native/collaboration.js.map +1 -1
- package/dist/lib/codex-native/oauth-auth-methods.d.ts.map +1 -1
- package/dist/lib/codex-native/oauth-auth-methods.js +25 -6
- package/dist/lib/codex-native/oauth-auth-methods.js.map +1 -1
- package/dist/lib/codex-native/oauth-server-debug.d.ts +10 -0
- package/dist/lib/codex-native/oauth-server-debug.d.ts.map +1 -0
- package/dist/lib/codex-native/oauth-server-debug.js +92 -0
- package/dist/lib/codex-native/oauth-server-debug.js.map +1 -0
- package/dist/lib/codex-native/oauth-server-network.d.ts +5 -0
- package/dist/lib/codex-native/oauth-server-network.d.ts.map +1 -0
- package/dist/lib/codex-native/oauth-server-network.js +39 -0
- package/dist/lib/codex-native/oauth-server-network.js.map +1 -0
- package/dist/lib/codex-native/oauth-server-types.d.ts +24 -0
- package/dist/lib/codex-native/oauth-server-types.d.ts.map +1 -0
- package/dist/lib/codex-native/oauth-server-types.js +2 -0
- package/dist/lib/codex-native/oauth-server-types.js.map +1 -0
- package/dist/lib/codex-native/oauth-server.d.ts +2 -16
- package/dist/lib/codex-native/oauth-server.d.ts.map +1 -1
- package/dist/lib/codex-native/oauth-server.js +63 -118
- package/dist/lib/codex-native/oauth-server.js.map +1 -1
- package/dist/lib/codex-native/openai-loader-fetch-quota.d.ts +18 -0
- package/dist/lib/codex-native/openai-loader-fetch-quota.d.ts.map +1 -0
- package/dist/lib/codex-native/openai-loader-fetch-quota.js +71 -0
- package/dist/lib/codex-native/openai-loader-fetch-quota.js.map +1 -0
- package/dist/lib/codex-native/openai-loader-fetch-state.d.ts +27 -0
- package/dist/lib/codex-native/openai-loader-fetch-state.d.ts.map +1 -0
- package/dist/lib/codex-native/openai-loader-fetch-state.js +91 -0
- package/dist/lib/codex-native/openai-loader-fetch-state.js.map +1 -0
- package/dist/lib/codex-native/openai-loader-fetch.d.ts.map +1 -1
- package/dist/lib/codex-native/openai-loader-fetch.js +49 -131
- package/dist/lib/codex-native/openai-loader-fetch.js.map +1 -1
- package/dist/lib/codex-native/originator.d.ts.map +1 -1
- package/dist/lib/codex-native/originator.js +18 -1
- package/dist/lib/codex-native/originator.js.map +1 -1
- package/dist/lib/codex-native/request-transform-instructions.d.ts +16 -0
- package/dist/lib/codex-native/request-transform-instructions.d.ts.map +1 -0
- package/dist/lib/codex-native/request-transform-instructions.js +114 -0
- package/dist/lib/codex-native/request-transform-instructions.js.map +1 -0
- package/dist/lib/codex-native/request-transform-model.d.ts +39 -0
- package/dist/lib/codex-native/request-transform-model.d.ts.map +1 -0
- package/dist/lib/codex-native/request-transform-model.js +270 -0
- package/dist/lib/codex-native/request-transform-model.js.map +1 -0
- package/dist/lib/codex-native/request-transform-payload-helpers.d.ts +26 -0
- package/dist/lib/codex-native/request-transform-payload-helpers.d.ts.map +1 -0
- package/dist/lib/codex-native/request-transform-payload-helpers.js +232 -0
- package/dist/lib/codex-native/request-transform-payload-helpers.js.map +1 -0
- package/dist/lib/codex-native/request-transform-payload.d.ts +53 -0
- package/dist/lib/codex-native/request-transform-payload.d.ts.map +1 -0
- package/dist/lib/codex-native/request-transform-payload.js +214 -0
- package/dist/lib/codex-native/request-transform-payload.js.map +1 -0
- package/dist/lib/codex-native/request-transform-shared.d.ts +8 -0
- package/dist/lib/codex-native/request-transform-shared.d.ts.map +1 -0
- package/dist/lib/codex-native/request-transform-shared.js +49 -0
- package/dist/lib/codex-native/request-transform-shared.js.map +1 -0
- package/dist/lib/codex-native/request-transform.d.ts +3 -122
- package/dist/lib/codex-native/request-transform.d.ts.map +1 -1
- package/dist/lib/codex-native/request-transform.js +3 -831
- package/dist/lib/codex-native/request-transform.js.map +1 -1
- package/dist/lib/codex-native/session-affinity-state.d.ts +14 -1
- package/dist/lib/codex-native/session-affinity-state.d.ts.map +1 -1
- package/dist/lib/codex-native/session-affinity-state.js +21 -8
- package/dist/lib/codex-native/session-affinity-state.js.map +1 -1
- package/dist/lib/codex-native.js.map +1 -1
- package/dist/lib/codex-prompts-cache.d.ts.map +1 -1
- package/dist/lib/codex-prompts-cache.js.map +1 -1
- package/dist/lib/codex-quota-fetch.d.ts.map +1 -1
- package/dist/lib/codex-quota-fetch.js +13 -10
- package/dist/lib/codex-quota-fetch.js.map +1 -1
- package/dist/lib/codex-status-storage.d.ts.map +1 -1
- package/dist/lib/codex-status-storage.js.map +1 -1
- package/dist/lib/codex-status.d.ts.map +1 -1
- package/dist/lib/codex-status.js +28 -3
- package/dist/lib/codex-status.js.map +1 -1
- package/dist/lib/config/io.d.ts +16 -0
- package/dist/lib/config/io.d.ts.map +1 -0
- package/dist/lib/config/io.js +64 -0
- package/dist/lib/config/io.js.map +1 -0
- package/dist/lib/config/parse.d.ts +21 -0
- package/dist/lib/config/parse.d.ts.map +1 -0
- package/dist/lib/config/parse.js +347 -0
- package/dist/lib/config/parse.js.map +1 -0
- package/dist/lib/config/resolve.d.ts +27 -0
- package/dist/lib/config/resolve.d.ts.map +1 -0
- package/dist/lib/config/resolve.js +152 -0
- package/dist/lib/config/resolve.js.map +1 -0
- package/dist/lib/config/types.d.ts +72 -0
- package/dist/lib/config/types.d.ts.map +1 -0
- package/dist/lib/config/types.js +151 -0
- package/dist/lib/config/types.js.map +1 -0
- package/dist/lib/config/validation.d.ts +6 -0
- package/dist/lib/config/validation.d.ts.map +1 -0
- package/dist/lib/config/validation.js +160 -0
- package/dist/lib/config/validation.js.map +1 -0
- package/dist/lib/config.d.ts +5 -111
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +5 -835
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/fetch-orchestrator-helpers.d.ts +13 -0
- package/dist/lib/fetch-orchestrator-helpers.d.ts.map +1 -0
- package/dist/lib/fetch-orchestrator-helpers.js +63 -0
- package/dist/lib/fetch-orchestrator-helpers.js.map +1 -0
- package/dist/lib/fetch-orchestrator-types.d.ts +71 -0
- package/dist/lib/fetch-orchestrator-types.d.ts.map +1 -0
- package/dist/lib/fetch-orchestrator-types.js +11 -0
- package/dist/lib/fetch-orchestrator-types.js.map +1 -0
- package/dist/lib/fetch-orchestrator.d.ts +3 -69
- package/dist/lib/fetch-orchestrator.d.ts.map +1 -1
- package/dist/lib/fetch-orchestrator.js +78 -57
- package/dist/lib/fetch-orchestrator.js.map +1 -1
- package/dist/lib/identity.d.ts +6 -0
- package/dist/lib/identity.d.ts.map +1 -1
- package/dist/lib/identity.js +25 -4
- package/dist/lib/identity.js.map +1 -1
- package/dist/lib/model-catalog/cache-helpers.d.ts +23 -0
- package/dist/lib/model-catalog/cache-helpers.d.ts.map +1 -0
- package/dist/lib/model-catalog/cache-helpers.js +210 -0
- package/dist/lib/model-catalog/cache-helpers.js.map +1 -0
- package/dist/lib/model-catalog/catalog-fetch.d.ts +3 -0
- package/dist/lib/model-catalog/catalog-fetch.d.ts.map +1 -0
- package/dist/lib/model-catalog/catalog-fetch.js +159 -0
- package/dist/lib/model-catalog/catalog-fetch.js.map +1 -0
- package/dist/lib/model-catalog/provider.d.ts +6 -0
- package/dist/lib/model-catalog/provider.d.ts.map +1 -0
- package/dist/lib/model-catalog/provider.js +254 -0
- package/dist/lib/model-catalog/provider.js.map +1 -0
- package/dist/lib/model-catalog/shared.d.ts +95 -0
- package/dist/lib/model-catalog/shared.d.ts.map +1 -0
- package/dist/lib/model-catalog/shared.js +154 -0
- package/dist/lib/model-catalog/shared.js.map +1 -0
- package/dist/lib/model-catalog.d.ts +3 -68
- package/dist/lib/model-catalog.d.ts.map +1 -1
- package/dist/lib/model-catalog.js +3 -767
- package/dist/lib/model-catalog.js.map +1 -1
- package/dist/lib/opencode-install.d.ts.map +1 -1
- package/dist/lib/opencode-install.js +5 -6
- package/dist/lib/opencode-install.js.map +1 -1
- package/dist/lib/orchestrator-agent.d.ts.map +1 -1
- package/dist/lib/orchestrator-agent.js +2 -1
- package/dist/lib/orchestrator-agent.js.map +1 -1
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +8 -2
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/proactive-refresh.d.ts.map +1 -1
- package/dist/lib/proactive-refresh.js +48 -13
- package/dist/lib/proactive-refresh.js.map +1 -1
- package/dist/lib/quarantine.js.map +1 -1
- package/dist/lib/quota-threshold-alerts.d.ts.map +1 -1
- package/dist/lib/quota-threshold-alerts.js +3 -1
- package/dist/lib/quota-threshold-alerts.js.map +1 -1
- package/dist/lib/refresh-queue.d.ts.map +1 -1
- package/dist/lib/refresh-queue.js +1 -0
- package/dist/lib/refresh-queue.js.map +1 -1
- package/dist/lib/request-snapshots.d.ts.map +1 -1
- package/dist/lib/request-snapshots.js +46 -10
- package/dist/lib/request-snapshots.js.map +1 -1
- package/dist/lib/rotation.d.ts.map +1 -1
- package/dist/lib/rotation.js +3 -2
- package/dist/lib/rotation.js.map +1 -1
- package/dist/lib/session-affinity.d.ts.map +1 -1
- package/dist/lib/session-affinity.js +35 -20
- package/dist/lib/session-affinity.js.map +1 -1
- package/dist/lib/storage/domain-state.d.ts +23 -0
- package/dist/lib/storage/domain-state.d.ts.map +1 -0
- package/dist/lib/storage/domain-state.js +275 -0
- package/dist/lib/storage/domain-state.js.map +1 -0
- package/dist/lib/storage/migration.d.ts +13 -0
- package/dist/lib/storage/migration.d.ts.map +1 -0
- package/dist/lib/storage/migration.js +225 -0
- package/dist/lib/storage/migration.js.map +1 -0
- package/dist/lib/storage.d.ts +2 -9
- package/dist/lib/storage.d.ts.map +1 -1
- package/dist/lib/storage.js +44 -470
- package/dist/lib/storage.js.map +1 -1
- package/dist/lib/ui/auth-menu.d.ts +3 -2
- package/dist/lib/ui/auth-menu.d.ts.map +1 -1
- package/dist/lib/ui/auth-menu.js +1 -1
- package/dist/lib/ui/auth-menu.js.map +1 -1
- package/package.json +28 -15
|
@@ -1,832 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
return new Request(request.url, {
|
|
628
|
-
method: request.method,
|
|
629
|
-
headers,
|
|
630
|
-
body: JSON.stringify(body),
|
|
631
|
-
redirect: request.redirect,
|
|
632
|
-
signal: request.signal,
|
|
633
|
-
credentials: request.credentials,
|
|
634
|
-
mode: request.mode,
|
|
635
|
-
referrer: request.referrer,
|
|
636
|
-
referrerPolicy: request.referrerPolicy,
|
|
637
|
-
integrity: request.integrity,
|
|
638
|
-
keepalive: request.keepalive
|
|
639
|
-
});
|
|
640
|
-
}
|
|
641
|
-
function messageContentToText(value) {
|
|
642
|
-
if (typeof value === "string")
|
|
643
|
-
return value;
|
|
644
|
-
if (!Array.isArray(value))
|
|
645
|
-
return "";
|
|
646
|
-
const parts = [];
|
|
647
|
-
for (const entry of value) {
|
|
648
|
-
if (!isRecord(entry))
|
|
649
|
-
continue;
|
|
650
|
-
if (typeof entry.text === "string" && entry.text.trim().length > 0) {
|
|
651
|
-
parts.push(entry.text);
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
return parts.join("\n");
|
|
655
|
-
}
|
|
656
|
-
function shouldPreserveDeveloperRole(item) {
|
|
657
|
-
const text = messageContentToText(item.content).toLowerCase();
|
|
658
|
-
if (!text)
|
|
659
|
-
return false;
|
|
660
|
-
return (text.includes("<permissions instructions>") ||
|
|
661
|
-
text.includes("filesystem sandboxing defines which files can be read or written"));
|
|
662
|
-
}
|
|
663
|
-
export async function remapDeveloperMessagesToUserOnRequest(input) {
|
|
664
|
-
const transformed = await transformOutboundRequestPayload({
|
|
665
|
-
request: input.request,
|
|
666
|
-
stripReasoningReplayEnabled: false,
|
|
667
|
-
remapDeveloperMessagesToUserEnabled: input.enabled,
|
|
668
|
-
compatInputSanitizerEnabled: false,
|
|
669
|
-
promptCacheKeyOverrideEnabled: false
|
|
670
|
-
});
|
|
671
|
-
return {
|
|
672
|
-
request: transformed.request,
|
|
673
|
-
changed: transformed.developerRoleRemap.changed,
|
|
674
|
-
reason: transformed.developerRoleRemap.reason,
|
|
675
|
-
remappedCount: transformed.developerRoleRemap.remappedCount,
|
|
676
|
-
preservedCount: transformed.developerRoleRemap.preservedCount
|
|
677
|
-
};
|
|
678
|
-
}
|
|
679
|
-
function stripReasoningReplayFields(value) {
|
|
680
|
-
if (Array.isArray(value)) {
|
|
681
|
-
let removed = 0;
|
|
682
|
-
const next = value.map((entry) => {
|
|
683
|
-
const result = stripReasoningReplayFields(entry);
|
|
684
|
-
removed += result.removed;
|
|
685
|
-
return result.value;
|
|
686
|
-
});
|
|
687
|
-
return { value: next, removed };
|
|
688
|
-
}
|
|
689
|
-
if (!isRecord(value)) {
|
|
690
|
-
return { value, removed: 0 };
|
|
691
|
-
}
|
|
692
|
-
let removed = 0;
|
|
693
|
-
const out = {};
|
|
694
|
-
for (const [key, entry] of Object.entries(value)) {
|
|
695
|
-
if (key.toLowerCase() === "reasoning_content") {
|
|
696
|
-
removed += 1;
|
|
697
|
-
continue;
|
|
698
|
-
}
|
|
699
|
-
const result = stripReasoningReplayFields(entry);
|
|
700
|
-
removed += result.removed;
|
|
701
|
-
out[key] = result.value;
|
|
702
|
-
}
|
|
703
|
-
return { value: out, removed };
|
|
704
|
-
}
|
|
705
|
-
function isReasoningReplayPart(entry) {
|
|
706
|
-
if (!isRecord(entry))
|
|
707
|
-
return false;
|
|
708
|
-
const type = asString(entry.type)?.toLowerCase();
|
|
709
|
-
if (!type)
|
|
710
|
-
return false;
|
|
711
|
-
return type.startsWith("reasoning");
|
|
712
|
-
}
|
|
713
|
-
export async function stripReasoningReplayFromRequest(input) {
|
|
714
|
-
const transformed = await transformOutboundRequestPayload({
|
|
715
|
-
request: input.request,
|
|
716
|
-
stripReasoningReplayEnabled: input.enabled,
|
|
717
|
-
remapDeveloperMessagesToUserEnabled: false,
|
|
718
|
-
compatInputSanitizerEnabled: false,
|
|
719
|
-
promptCacheKeyOverrideEnabled: false
|
|
720
|
-
});
|
|
721
|
-
return {
|
|
722
|
-
request: transformed.request,
|
|
723
|
-
changed: transformed.replay.changed,
|
|
724
|
-
reason: transformed.replay.reason,
|
|
725
|
-
removedPartCount: transformed.replay.removedPartCount,
|
|
726
|
-
removedFieldCount: transformed.replay.removedFieldCount
|
|
727
|
-
};
|
|
728
|
-
}
|
|
729
|
-
function getVariantCandidatesFromBody(input) {
|
|
730
|
-
const out = [];
|
|
731
|
-
const seen = new Set();
|
|
732
|
-
const add = (value) => {
|
|
733
|
-
const trimmed = value?.trim().toLowerCase();
|
|
734
|
-
if (!trimmed)
|
|
735
|
-
return;
|
|
736
|
-
if (seen.has(trimmed))
|
|
737
|
-
return;
|
|
738
|
-
seen.add(trimmed);
|
|
739
|
-
out.push(trimmed);
|
|
740
|
-
};
|
|
741
|
-
const reasoning = isRecord(input.body.reasoning) ? input.body.reasoning : undefined;
|
|
742
|
-
add(asString(reasoning?.effort));
|
|
743
|
-
const normalizedSlug = input.modelSlug.trim().toLowerCase();
|
|
744
|
-
const suffix = normalizedSlug.match(EFFORT_SUFFIX_REGEX)?.[1];
|
|
745
|
-
add(suffix);
|
|
746
|
-
return out;
|
|
747
|
-
}
|
|
748
|
-
const COLLABORATION_INSTRUCTION_MARKERS = ["# Plan Mode (Conversational)", "# Sub-agents", "# Tooling Compatibility ("];
|
|
749
|
-
function extractCollaborationInstructionTail(instructions) {
|
|
750
|
-
const normalized = instructions.trim();
|
|
751
|
-
if (!normalized)
|
|
752
|
-
return undefined;
|
|
753
|
-
let markerIndex;
|
|
754
|
-
for (const marker of COLLABORATION_INSTRUCTION_MARKERS) {
|
|
755
|
-
const index = normalized.indexOf(marker);
|
|
756
|
-
if (index < 0)
|
|
757
|
-
continue;
|
|
758
|
-
if (markerIndex === undefined || index < markerIndex)
|
|
759
|
-
markerIndex = index;
|
|
760
|
-
}
|
|
761
|
-
if (markerIndex === undefined)
|
|
762
|
-
return undefined;
|
|
763
|
-
const tail = normalized.slice(markerIndex).trim();
|
|
764
|
-
return tail.length > 0 ? tail : undefined;
|
|
765
|
-
}
|
|
766
|
-
export async function applyCatalogInstructionOverrideToRequest(input) {
|
|
767
|
-
if (!input.enabled)
|
|
768
|
-
return { request: input.request, changed: false, reason: "disabled" };
|
|
769
|
-
const method = input.request.method.toUpperCase();
|
|
770
|
-
if (method !== "POST")
|
|
771
|
-
return { request: input.request, changed: false, reason: "non_post" };
|
|
772
|
-
let payload;
|
|
773
|
-
try {
|
|
774
|
-
const raw = await input.request.clone().text();
|
|
775
|
-
if (!raw)
|
|
776
|
-
return { request: input.request, changed: false, reason: "empty_body" };
|
|
777
|
-
payload = JSON.parse(raw);
|
|
778
|
-
}
|
|
779
|
-
catch (error) {
|
|
780
|
-
if (!(error instanceof SyntaxError)) {
|
|
781
|
-
// request body could not be parsed as JSON
|
|
782
|
-
}
|
|
783
|
-
return { request: input.request, changed: false, reason: "invalid_json" };
|
|
784
|
-
}
|
|
785
|
-
if (!isRecord(payload))
|
|
786
|
-
return { request: input.request, changed: false, reason: "non_object_body" };
|
|
787
|
-
const modelSlugRaw = asString(payload.model);
|
|
788
|
-
if (!modelSlugRaw)
|
|
789
|
-
return { request: input.request, changed: false, reason: "missing_model" };
|
|
790
|
-
const modelCandidates = getModelLookupCandidates({
|
|
791
|
-
id: modelSlugRaw,
|
|
792
|
-
api: { id: modelSlugRaw }
|
|
793
|
-
});
|
|
794
|
-
const variantCandidates = getVariantCandidatesFromBody({
|
|
795
|
-
body: payload,
|
|
796
|
-
modelSlug: modelSlugRaw
|
|
797
|
-
});
|
|
798
|
-
const effectivePersonality = resolvePersonalityForModel({
|
|
799
|
-
behaviorSettings: input.behaviorSettings,
|
|
800
|
-
modelCandidates,
|
|
801
|
-
variantCandidates,
|
|
802
|
-
fallback: input.fallbackPersonality
|
|
803
|
-
});
|
|
804
|
-
const catalogModel = findCatalogModelForCandidates(input.catalogModels, modelCandidates);
|
|
805
|
-
if (!catalogModel)
|
|
806
|
-
return { request: input.request, changed: false, reason: "catalog_model_not_found" };
|
|
807
|
-
const rendered = resolveInstructionsForModel(catalogModel, effectivePersonality);
|
|
808
|
-
if (!rendered)
|
|
809
|
-
return { request: input.request, changed: false, reason: "rendered_empty_or_unsafe" };
|
|
810
|
-
const renderedForRequest = input.replaceCodexToolCalls === true ? (replaceCodexToolCallsForOpenCode(rendered) ?? rendered) : rendered;
|
|
811
|
-
const currentInstructions = asString(payload.instructions);
|
|
812
|
-
const preserveOrchestratorInstructions = input.preserveOrchestratorInstructions !== false;
|
|
813
|
-
if (preserveOrchestratorInstructions && isOrchestratorInstructions(currentInstructions)) {
|
|
814
|
-
return { request: input.request, changed: false, reason: "orchestrator_instructions_preserved" };
|
|
815
|
-
}
|
|
816
|
-
if (currentInstructions === renderedForRequest) {
|
|
817
|
-
return { request: input.request, changed: false, reason: "already_matches" };
|
|
818
|
-
}
|
|
819
|
-
if (currentInstructions && currentInstructions.includes(renderedForRequest)) {
|
|
820
|
-
return { request: input.request, changed: false, reason: "already_contains_rendered" };
|
|
821
|
-
}
|
|
822
|
-
const collaborationTail = currentInstructions ? extractCollaborationInstructionTail(currentInstructions) : undefined;
|
|
823
|
-
const nextInstructionsBase = collaborationTail ? `${renderedForRequest}\n\n${collaborationTail}` : renderedForRequest;
|
|
824
|
-
const nextInstructions = nextInstructionsBase;
|
|
825
|
-
if (currentInstructions === nextInstructions) {
|
|
826
|
-
return { request: input.request, changed: false, reason: "already_matches" };
|
|
827
|
-
}
|
|
828
|
-
payload.instructions = nextInstructions;
|
|
829
|
-
const updatedRequest = rebuildRequestWithJsonBody(input.request, payload);
|
|
830
|
-
return { request: updatedRequest, changed: true, reason: "updated" };
|
|
831
|
-
}
|
|
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";
|
|
832
4
|
//# sourceMappingURL=request-transform.js.map
|