@bitkyc08/opencodex 2.33.0 → 2.34.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 +3 -3
- package/gui/dist/assets/index-C4TMRloX.js +112 -0
- package/gui/dist/assets/index-DQ-Ie18T.css +1 -0
- package/gui/dist/index.html +2 -2
- package/package.json +1 -1
- package/src/adapters/anthropic.ts +79 -2
- package/src/adapters/command-code.ts +40 -3
- package/src/adapters/cursor/call-id.ts +44 -0
- package/src/adapters/cursor/checkpoint-store.ts +15 -10
- package/src/adapters/cursor/discovery.ts +60 -2
- package/src/adapters/cursor/effort-map.ts +79 -1
- package/src/adapters/cursor/envelope-echo.ts +162 -0
- package/src/adapters/cursor/live-models.ts +7 -2
- package/src/adapters/cursor/live-transport.ts +14 -0
- package/src/adapters/cursor/message-mapper.ts +4 -1
- package/src/adapters/cursor/native-exec-desktop.ts +23 -0
- package/src/adapters/cursor/native-exec-fs.ts +2 -2
- package/src/adapters/cursor/native-exec-network.ts +1 -1
- package/src/adapters/cursor/native-exec-shell.ts +5 -2
- package/src/adapters/cursor/native-exec.ts +20 -0
- package/src/adapters/cursor/protobuf-request.ts +68 -14
- package/src/adapters/cursor/request-builder.ts +29 -6
- package/src/adapters/cursor/tool-definitions.ts +11 -2
- package/src/adapters/cursor/tool-result-normalize.ts +32 -1
- package/src/adapters/cursor/types.ts +20 -0
- package/src/adapters/cursor.ts +189 -37
- package/src/adapters/google-antigravity-replay.ts +102 -23
- package/src/adapters/google-errors.ts +44 -12
- package/src/adapters/google.ts +115 -16
- package/src/adapters/image.ts +1 -1
- package/src/adapters/kiro-constants.ts +15 -0
- package/src/adapters/kiro-tools.ts +43 -15
- package/src/adapters/kiro.ts +54 -9
- package/src/adapters/openai-chat.ts +286 -242
- package/src/adapters/openai-responses.ts +334 -24
- package/src/adapters/tool-catalog-nudge.ts +2 -2
- package/src/adapters/xai-tool-schema.ts +436 -0
- package/src/bridge.ts +67 -24
- package/src/chat/inbound.ts +14 -1
- package/src/chat/outbound.ts +15 -7
- package/src/claude/agents-inject.ts +8 -1
- package/src/claude/outbound.ts +10 -8
- package/src/cli/account-api.ts +32 -4
- package/src/cli/account-extended.ts +1 -1
- package/src/cli/account.ts +29 -5
- package/src/cli/alias.ts +66 -0
- package/src/cli/claude.ts +26 -1
- package/src/cli/dispatch.ts +13 -1
- package/src/cli/help.ts +1 -0
- package/src/cli/init.ts +1 -0
- package/src/cli/models-runtime.ts +95 -0
- package/src/cli/models.ts +13 -7
- package/src/cli/provider-runtime.ts +16 -2
- package/src/cli/registry.ts +6 -1
- package/src/cli/v2.ts +34 -10
- package/src/codex/account-pause.ts +2 -1
- package/src/codex/account-priority.ts +3 -2
- package/src/codex/app-server-processes.ts +80 -6
- package/src/codex/auth-api.ts +46 -8
- package/src/codex/auth-context.ts +21 -18
- package/src/codex/catalog/aggregation.ts +6 -0
- package/src/codex/catalog/native-models.ts +5 -2
- package/src/codex/catalog/parsing.ts +16 -0
- package/src/codex/catalog/provider-fetch.ts +20 -3
- package/src/codex/catalog/sync.ts +127 -2
- package/src/codex/catalog.ts +1 -1
- package/src/codex/codex-write-lock.ts +3 -1
- package/src/codex/convergence-types.ts +1 -1
- package/src/codex/convergence.ts +22 -2
- package/src/codex/desired-state.ts +2 -2
- package/src/codex/desktop-app-restart.ts +18 -5
- package/src/codex/inject-coordination.ts +83 -0
- package/src/codex/inject.ts +14 -1
- package/src/codex/log-guard/inspect.ts +22 -4
- package/src/codex/model-entitlements.ts +9 -2
- package/src/codex/prompt-layers.ts +371 -25
- package/src/codex/prompt-text-probe.ts +238 -0
- package/src/codex/quota.ts +91 -10
- package/src/codex/routing.ts +9 -0
- package/src/codex/subagent-model-fallback.ts +104 -25
- package/src/codex/transition-state.ts +107 -8
- package/src/combos/types.ts +10 -0
- package/src/compatibility/openai-responses.ts +33 -1
- package/src/config/rebase-provenance.ts +68 -0
- package/src/config.ts +107 -9
- package/src/generated/compatibility-version.json +191 -139
- package/src/images/loop.ts +5 -4
- package/src/lab/conformance/fixtures/protocol-v1-cases.json +1 -1
- package/src/lab/fabric/producer-child.ts +1 -1
- package/src/lib/config-ownership.ts +20 -0
- package/src/lib/errors.ts +11 -2
- package/src/lib/package-tree-integrity.ts +101 -0
- package/src/oauth/generic-account-failover.ts +231 -0
- package/src/oauth/index.ts +57 -5
- package/src/oauth/key-providers.ts +10 -1
- package/src/oauth/kiro.ts +45 -0
- package/src/oauth/types.ts +15 -0
- package/src/providers/command-code-efforts.ts +38 -6
- package/src/providers/context-cap.ts +4 -3
- package/src/providers/default-aliases.ts +65 -0
- package/src/providers/derive.ts +28 -0
- package/src/providers/fastwire.ts +7 -1
- package/src/providers/model-presets.ts +119 -0
- package/src/providers/new-model-policy.ts +146 -0
- package/src/providers/provider-id-rewrite.ts +2 -1
- package/src/providers/quota.ts +65 -7
- package/src/providers/registry.ts +160 -68
- package/src/providers/slug-codec.ts +52 -0
- package/src/responses/code-mode-helper-compat.ts +50 -0
- package/src/responses/custom-tool-compat.ts +34 -10
- package/src/responses/parser.ts +4 -0
- package/src/responses/schema.ts +5 -1
- package/src/responses/thought-signature-replay.ts +17 -0
- package/src/router.ts +40 -2
- package/src/routing/analytics.ts +1 -0
- package/src/routing/quota.ts +10 -0
- package/src/server/auth-cors.ts +4 -0
- package/src/server/chat-completions.ts +24 -16
- package/src/server/chat-native-sse.ts +3 -3
- package/src/server/chat-native.ts +30 -11
- package/src/server/claude-messages.ts +1 -1
- package/src/server/index.ts +77 -11
- package/src/server/lifecycle.ts +52 -1
- package/src/server/management/agent-settings-routes.ts +31 -15
- package/src/server/management/codex-prompt-routes.ts +570 -0
- package/src/server/management/combo-routes.ts +2 -1
- package/src/server/management/config-routes.ts +27 -9
- package/src/server/management/context.ts +9 -0
- package/src/server/management/model-routes.ts +266 -0
- package/src/server/management/provider-routes.ts +6 -0
- package/src/server/management/routing-profile-routes.ts +2 -2
- package/src/server/management-api.ts +2 -0
- package/src/server/relay-eager.ts +147 -20
- package/src/server/relay.ts +251 -19
- package/src/server/request-log-conversation.ts +21 -0
- package/src/server/request-log.ts +41 -15
- package/src/server/responses/collaboration.ts +37 -3
- package/src/server/responses/combo-stream-preflight.ts +10 -3
- package/src/server/responses/core.ts +494 -114
- package/src/server/responses/empty-completion-guard.ts +35 -0
- package/src/server/responses/fetch-helpers.ts +2 -1
- package/src/server/responses/input-admission.ts +3 -1
- package/src/server/responses/passthrough-error.ts +33 -9
- package/src/server/responses/responses-field-backfill.ts +105 -13
- package/src/server/responses-custom-tool-repair.ts +52 -7
- package/src/server/responses-terminal-repair.ts +25 -4
- package/src/server/sse-frame-buffer.ts +31 -4
- package/src/server/ws-bridge.ts +14 -2
- package/src/types/config.ts +53 -0
- package/src/types/provider.ts +64 -0
- package/src/types/request.ts +11 -3
- package/src/types/tools.ts +7 -5
- package/src/types.ts +1 -0
- package/src/usage/expected-prices.ts +43 -24
- package/src/usage/log.ts +3 -0
- package/src/web-search/exa-executor.ts +40 -9
- package/src/web-search/loop.ts +5 -4
- package/gui/dist/assets/index-23-Lf7jR.js +0 -102
- package/gui/dist/assets/index-DxJMDyOr.css +0 -1
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
httpStatusFromTerminalError as httpStatusFromClassifiedTerminalError,
|
|
7
7
|
isClientClosedMessage,
|
|
8
8
|
isCyberPolicyCode,
|
|
9
|
+
isCyberPolicyMessage,
|
|
9
10
|
} from "../lib/errors";
|
|
10
11
|
import { CODEX_CONFIG_PATH, readRootTomlString } from "../codex/paths";
|
|
11
12
|
import { readCodexCatalogPath } from "../codex/catalog";
|
|
@@ -65,6 +66,8 @@ export interface RequestLogContext {
|
|
|
65
66
|
/** Stable non-PII Codex Pool account identity for durable usage attribution. */
|
|
66
67
|
accountLogLabel?: string;
|
|
67
68
|
requestedModel?: string;
|
|
69
|
+
/** User-facing alias selector when routing resolved one; native model remains `model`. */
|
|
70
|
+
requestedAlias?: string;
|
|
68
71
|
/** Original bare helper model when the opt-in shadow-call route rewrote this request. */
|
|
69
72
|
shadowCallRewrittenFrom?: string;
|
|
70
73
|
/** Internal structural combo identity; omitted from RequestLogEntry/JSONL. */
|
|
@@ -144,6 +147,7 @@ export interface RequestLogEntry {
|
|
|
144
147
|
/** Best-effort chat/session correlation for Logs grouping (#330). */
|
|
145
148
|
conversationId?: string;
|
|
146
149
|
requestedModel?: string;
|
|
150
|
+
requestedAlias?: string;
|
|
147
151
|
/** Original bare helper model when the opt-in shadow-call route rewrote this request. */
|
|
148
152
|
shadowCallRewrittenFrom?: string;
|
|
149
153
|
requestedEffort?: string;
|
|
@@ -259,6 +263,7 @@ export function requestLogEntryFromPersistedUsage(entry: PersistedUsageEntry): R
|
|
|
259
263
|
? { accountLogLabel: entry.accountLogLabel }
|
|
260
264
|
: {}),
|
|
261
265
|
...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}),
|
|
266
|
+
...(entry.requestedAlias ? { requestedAlias: entry.requestedAlias } : {}),
|
|
262
267
|
...(entry.shadowCallRewrittenFrom
|
|
263
268
|
? { shadowCallRewrittenFrom: entry.shadowCallRewrittenFrom }
|
|
264
269
|
: {}),
|
|
@@ -379,6 +384,7 @@ export function addRequestLog(entry: RequestLogEntry) {
|
|
|
379
384
|
...(entry.conversationId ? { conversationId: entry.conversationId } : {}),
|
|
380
385
|
...(entry.resolvedModel ? { resolvedModel: entry.resolvedModel } : {}),
|
|
381
386
|
...(entry.requestedModel ? { requestedModel: entry.requestedModel } : {}),
|
|
387
|
+
...(entry.requestedAlias ? { requestedAlias: entry.requestedAlias } : {}),
|
|
382
388
|
...(entry.shadowCallRewrittenFrom
|
|
383
389
|
? { shadowCallRewrittenFrom: entry.shadowCallRewrittenFrom }
|
|
384
390
|
: {}),
|
|
@@ -764,7 +770,7 @@ function captureUpstreamErrorParsed(
|
|
|
764
770
|
last_error?: { message?: unknown };
|
|
765
771
|
response?: {
|
|
766
772
|
error?: { type?: unknown; code?: unknown; message?: unknown };
|
|
767
|
-
incomplete_details?: { reason?: unknown };
|
|
773
|
+
incomplete_details?: { reason?: unknown; message?: unknown };
|
|
768
774
|
};
|
|
769
775
|
};
|
|
770
776
|
captureTerminalHttpStatus(logCtx, json);
|
|
@@ -778,7 +784,8 @@ function captureUpstreamErrorParsed(
|
|
|
778
784
|
if (logCtx.upstreamError) return;
|
|
779
785
|
const message = json?.error?.message
|
|
780
786
|
?? json?.last_error?.message
|
|
781
|
-
?? json?.response?.error?.message
|
|
787
|
+
?? json?.response?.error?.message
|
|
788
|
+
?? json?.response?.incomplete_details?.message;
|
|
782
789
|
if (typeof message === "string" && message.trim()) {
|
|
783
790
|
logCtx.upstreamError = redactSecretString(message).slice(0, 500);
|
|
784
791
|
return;
|
|
@@ -817,25 +824,43 @@ function captureTerminalHttpStatus(
|
|
|
817
824
|
logCtx: RequestLogContext,
|
|
818
825
|
json: {
|
|
819
826
|
type?: unknown;
|
|
820
|
-
|
|
827
|
+
code?: unknown;
|
|
828
|
+
message?: unknown;
|
|
829
|
+
error?: { type?: unknown; code?: unknown; message?: unknown };
|
|
830
|
+
last_error?: { type?: unknown; code?: unknown; message?: unknown };
|
|
831
|
+
response?: {
|
|
832
|
+
error?: { type?: unknown; code?: unknown; message?: unknown };
|
|
833
|
+
incomplete_details?: { code?: unknown; message?: unknown };
|
|
834
|
+
};
|
|
821
835
|
},
|
|
822
836
|
): void {
|
|
823
837
|
if (logCtx.terminalHttpStatus !== undefined) return;
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
const
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
838
|
+
const type = json.type;
|
|
839
|
+
if (type !== "response.failed" && type !== "response.incomplete" && type !== "error") return;
|
|
840
|
+
const responseError = json.response?.error;
|
|
841
|
+
const responseDetails = json.response?.incomplete_details;
|
|
842
|
+
const candidates = [json.error, json.last_error, responseError, responseDetails, json];
|
|
843
|
+
const policy = candidates.some(candidate => (
|
|
844
|
+
candidate?.code === null || typeof candidate?.code === "string"
|
|
845
|
+
) && isCyberPolicyCode(candidate.code as string | null | undefined))
|
|
846
|
+
|| candidates.some(candidate => (
|
|
847
|
+
typeof candidate?.message === "string"
|
|
848
|
+
&& candidate.message.trim().length > 0
|
|
849
|
+
&& isCyberPolicyMessage(candidate.message)
|
|
850
|
+
));
|
|
851
|
+
if (policy) {
|
|
831
852
|
logCtx.terminalErrorCode = CYBER_POLICY_ERROR_CODE;
|
|
832
|
-
|
|
833
|
-
|
|
853
|
+
logCtx.terminalHttpStatus = 400;
|
|
854
|
+
return;
|
|
834
855
|
}
|
|
856
|
+
if (type !== "response.failed" || !responseError || typeof responseError !== "object") return;
|
|
857
|
+
const responseCode = responseError.code === null || typeof responseError.code === "string"
|
|
858
|
+
? responseError.code
|
|
859
|
+
: undefined;
|
|
835
860
|
logCtx.terminalHttpStatus = httpStatusFromTerminalError({
|
|
836
|
-
type: typeof
|
|
837
|
-
code:
|
|
838
|
-
message: typeof
|
|
861
|
+
type: typeof responseError.type === "string" ? responseError.type : undefined,
|
|
862
|
+
code: responseCode,
|
|
863
|
+
message: typeof responseError.message === "string" ? responseError.message : undefined,
|
|
839
864
|
});
|
|
840
865
|
}
|
|
841
866
|
|
|
@@ -949,6 +974,7 @@ export function addFinalRequestLog(
|
|
|
949
974
|
: {}),
|
|
950
975
|
...(logCtx.conversationId ? { conversationId: logCtx.conversationId } : {}),
|
|
951
976
|
...(logCtx.requestedModel ? { requestedModel: logCtx.requestedModel } : {}),
|
|
977
|
+
...(logCtx.requestedAlias ? { requestedAlias: logCtx.requestedAlias } : {}),
|
|
952
978
|
...(shadowCallRewrittenFrom ? { shadowCallRewrittenFrom } : {}),
|
|
953
979
|
...(logCtx.requestedEffort ? { requestedEffort: logCtx.requestedEffort } : {}),
|
|
954
980
|
...(logCtx.effectiveEffort ? { effectiveEffort: logCtx.effectiveEffort } : {}),
|
|
@@ -2,6 +2,7 @@ import type { Server } from "bun";
|
|
|
2
2
|
import { bridgeToResponsesSSE, buildResponseJSON, formatErrorResponse, type ResponsesTerminalStatus } from "../../bridge";
|
|
3
3
|
import {
|
|
4
4
|
getConfigPath,
|
|
5
|
+
loadConfig,
|
|
5
6
|
multiAgentGuidanceEnabled,
|
|
6
7
|
resolveEnvValue,
|
|
7
8
|
} from "../../config";
|
|
@@ -10,6 +11,7 @@ import { buildCompactV1Output, COMPACT_PROMPT, decodeCompactionSummary, extractC
|
|
|
10
11
|
import { FORWARD_HEADERS, sanitizeReasoningInputContent } from "../../adapters/openai-responses";
|
|
11
12
|
import { expandPreviousResponseInput, previousResponseProviderState, rememberResponseState } from "../../responses/state";
|
|
12
13
|
import { routeModel } from "../../router";
|
|
14
|
+
import type { RawEntry } from "../../codex/catalog/parsing";
|
|
13
15
|
import {
|
|
14
16
|
advanceComboAfterFailure,
|
|
15
17
|
comboDefaultEffort,
|
|
@@ -243,15 +245,47 @@ export async function resolveEffectiveSubagentRoster(
|
|
|
243
245
|
surface: SpawnAgentSurface,
|
|
244
246
|
): Promise<EffectiveSubagentRoster> {
|
|
245
247
|
const { effectiveSubagentRoster } = await import("../../codex/catalog");
|
|
246
|
-
return effectiveSubagentRoster(configuredModels, surface);
|
|
248
|
+
return effectiveSubagentRoster(configuredModels, surface, await freshSubagentCatalogEntries());
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The persisted Codex catalog, with native context metadata re-derived from the CURRENT config.
|
|
253
|
+
*
|
|
254
|
+
* The subagent roster reads the catalog FILE, which is only as fresh as the last sync. A row
|
|
255
|
+
* written before the operator widened the native window keeps its old `context_window`, so a
|
|
256
|
+
* child was planning and compacting against a narrower budget than its parent — measured at
|
|
257
|
+
* 272,000 x 95% = 258,400 while the request path resolved 922,000 (#2574).
|
|
258
|
+
*
|
|
259
|
+
* Re-applying the override is cheap and idempotent: it is the same function the writer uses,
|
|
260
|
+
* so a fresh catalog is unchanged and a stale one is repaired in memory rather than silently
|
|
261
|
+
* believed. It does not rewrite the file — the row on disk stays whatever the last sync wrote,
|
|
262
|
+
* and `ocx sync` remains what refreshes it.
|
|
263
|
+
*/
|
|
264
|
+
async function freshSubagentCatalogEntries(): Promise<RawEntry[]> {
|
|
265
|
+
const { readCatalog, readCodexCatalogPath, nativeContextLimits } = await import("../../codex/catalog");
|
|
266
|
+
const { applyNativeOpenAiContextOverride } = await import("../../codex/catalog/parsing");
|
|
267
|
+
const entries = readCatalog(readCodexCatalogPath())?.models ?? [];
|
|
268
|
+
if (entries.length === 0) return [];
|
|
269
|
+
let limits: ReturnType<typeof nativeContextLimits>;
|
|
270
|
+
try {
|
|
271
|
+
limits = nativeContextLimits(loadConfig());
|
|
272
|
+
} catch {
|
|
273
|
+
// An unreadable config must not cost the caller its roster; serve the file as written.
|
|
274
|
+
return entries;
|
|
275
|
+
}
|
|
276
|
+
return entries.map(entry => {
|
|
277
|
+
const clone = { ...entry };
|
|
278
|
+
applyNativeOpenAiContextOverride(clone, limits);
|
|
279
|
+
return clone;
|
|
280
|
+
});
|
|
247
281
|
}
|
|
248
282
|
|
|
249
283
|
/** Reuse one parsed catalog snapshot across every roster projection for this request. */
|
|
250
284
|
async function createRequestScopedSubagentRosterResolver(): Promise<NonNullable<
|
|
251
285
|
MultiAgentGuidanceDeps["resolveEffectiveSubagentRoster"]
|
|
252
286
|
>> {
|
|
253
|
-
const { effectiveSubagentRoster
|
|
254
|
-
const catalogEntries =
|
|
287
|
+
const { effectiveSubagentRoster } = await import("../../codex/catalog");
|
|
288
|
+
const catalogEntries = await freshSubagentCatalogEntries();
|
|
255
289
|
return (configuredModels, surface) =>
|
|
256
290
|
effectiveSubagentRoster(configuredModels, surface, catalogEntries);
|
|
257
291
|
}
|
|
@@ -4,6 +4,12 @@ import { createSseInspector } from "../relay";
|
|
|
4
4
|
import { MAX_CLIENT_SSE_FRAME_BYTES } from "../sse-frame-buffer";
|
|
5
5
|
|
|
6
6
|
const COMBO_STREAM_PREFLIGHT_MAX_BYTES = MAX_CLIENT_SSE_FRAME_BYTES;
|
|
7
|
+
// Keep retained object count proportional to the same byte budget used by the
|
|
8
|
+
// shared SSE framer. Tiny or empty upstream reads must not bypass the byte cap.
|
|
9
|
+
const COMBO_STREAM_PREFLIGHT_MAX_CHUNKS = Math.max(
|
|
10
|
+
1,
|
|
11
|
+
Math.ceil(COMBO_STREAM_PREFLIGHT_MAX_BYTES / 1024),
|
|
12
|
+
);
|
|
7
13
|
|
|
8
14
|
const PRE_OUTPUT_CONTROL_EVENTS = new Set([
|
|
9
15
|
"response.created",
|
|
@@ -105,8 +111,8 @@ export type ComboStreamPreflightResult =
|
|
|
105
111
|
/**
|
|
106
112
|
* Buffer a combo child's downstream SSE only until the request becomes unsafe to
|
|
107
113
|
* replay or reaches a terminal. This owns exactly one body reader. The aggregate
|
|
108
|
-
* buffer is capped; hitting
|
|
109
|
-
* memory or guessing that replay is safe.
|
|
114
|
+
* buffer is capped by bytes and retained chunks; hitting either cap commits the
|
|
115
|
+
* current target instead of growing memory or guessing that replay is safe.
|
|
110
116
|
*/
|
|
111
117
|
export async function preflightComboStreamResponse(
|
|
112
118
|
response: Response,
|
|
@@ -161,7 +167,8 @@ export async function preflightComboStreamResponse(
|
|
|
161
167
|
return { kind: "failed", response: failedTerminalResponse(response, failedPayload, logCtx) };
|
|
162
168
|
}
|
|
163
169
|
if (next.done || terminalStatus !== undefined || outputCommitted
|
|
164
|
-
|| bufferedBytes >= COMBO_STREAM_PREFLIGHT_MAX_BYTES
|
|
170
|
+
|| bufferedBytes >= COMBO_STREAM_PREFLIGHT_MAX_BYTES
|
|
171
|
+
|| buffered.length >= COMBO_STREAM_PREFLIGHT_MAX_CHUNKS) {
|
|
165
172
|
return { kind: "accepted", response: replayBufferedResponse(response, reader, buffered) };
|
|
166
173
|
}
|
|
167
174
|
}
|