@bitkyc08/opencodex 2.55.0 → 2.57.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/bin/ocx.mjs +10 -0
- package/gui/dist/assets/{index-BBOZWGB6.css → index-C5-RdDmD.css} +1 -1
- package/gui/dist/assets/{index-VuoiWj9J.js → index-Cz7CLdif.js} +21 -21
- package/gui/dist/index.html +2 -2
- package/package.json +4 -3
- package/src/adapters/base.ts +21 -0
- package/src/adapters/codebuddy/adapter.ts +2 -1
- package/src/adapters/codebuddy/scaffold-guard.ts +248 -0
- package/src/adapters/command-code.ts +1 -1
- package/src/adapters/cursor/envelope-echo.ts +8 -2
- package/src/adapters/cursor/transport-retry.ts +46 -1
- package/src/adapters/cursor.ts +4 -0
- package/src/adapters/google.ts +7 -7
- package/src/adapters/kiro/adapter.ts +42 -1
- package/src/adapters/kiro/payload.ts +17 -3
- package/src/adapters/kiro/reasoning.ts +70 -7
- package/src/adapters/kiro/stream.ts +8 -2
- package/src/adapters/kiro/wire.ts +2 -1
- package/src/adapters/kiro-events.ts +21 -13
- package/src/adapters/kiro-retry.ts +23 -4
- package/src/adapters/openai-chat/errors.ts +116 -0
- package/src/adapters/openai-chat/messages.ts +346 -0
- package/src/adapters/openai-chat/passthrough.ts +146 -0
- package/src/adapters/openai-chat/response-events.ts +117 -0
- package/src/adapters/openai-chat/tool-call-validation.ts +200 -0
- package/src/adapters/openai-chat/tool-name-registry.ts +166 -0
- package/src/adapters/openai-chat/tool-schema.ts +495 -0
- package/src/adapters/openai-chat/wire.ts +50 -0
- package/src/adapters/openai-chat.ts +40 -1452
- package/src/adapters/openai-responses/canonical-forward.ts +202 -0
- package/src/adapters/openai-responses/image-gen.ts +406 -0
- package/src/adapters/openai-responses/internal.ts +3 -0
- package/src/adapters/openai-responses/passthrough.ts +642 -0
- package/src/adapters/openai-responses/prompt-cache.ts +83 -0
- package/src/adapters/openai-responses/reasoning.ts +220 -0
- package/src/adapters/openai-responses/request-strips.ts +185 -0
- package/src/adapters/openai-responses/tool-output-recovery.ts +509 -0
- package/src/adapters/openai-responses/tool-schema.ts +293 -0
- package/src/adapters/openai-responses/web-search.ts +156 -0
- package/src/adapters/openai-responses.ts +4 -2625
- package/src/bridge/errors.ts +58 -0
- package/src/bridge/internal.ts +174 -0
- package/src/bridge/response-json.ts +630 -0
- package/src/bridge/sse.ts +1462 -0
- package/src/bridge.ts +5 -2204
- package/src/chat/inbound.ts +12 -1
- package/src/claude/desktop-profile.ts +66 -9
- package/src/claude/outbound.ts +18 -0
- package/src/cli/account-main.ts +1 -1
- package/src/cli/capabilities.ts +2 -2
- package/src/cli/combo.ts +10 -1
- package/src/cli/index.ts +48 -5
- package/src/cli/registry.ts +2 -1
- package/src/cli/system-command.ts +4 -4
- package/src/clients/config-export.ts +7 -3
- package/src/codex/account-label.ts +14 -3
- package/src/codex/account-lifecycle.ts +3 -0
- package/src/codex/account-store.ts +184 -35
- package/src/codex/account-usability.ts +21 -0
- package/src/codex/auth-api/account-list.ts +507 -0
- package/src/codex/auth-api/http.ts +32 -0
- package/src/codex/auth-api/login-flow.ts +566 -0
- package/src/codex/auth-api/login-state.ts +64 -0
- package/src/codex/auth-api/main-account-probe.ts +331 -0
- package/src/codex/auth-api/pool-mode-gate.ts +274 -0
- package/src/codex/auth-api/pool-quota-probe.ts +512 -0
- package/src/codex/auth-api/reset-credit-service.ts +431 -0
- package/src/codex/auth-api/routes.ts +425 -0
- package/src/codex/auth-api/runtime-config.ts +48 -0
- package/src/codex/auth-api.ts +27 -3118
- package/src/codex/auth-context.ts +252 -35
- package/src/codex/catalog/aggregation.ts +80 -1
- package/src/codex/catalog/auto-review.ts +507 -0
- package/src/codex/catalog/build-entries.ts +981 -0
- package/src/codex/catalog/combo-member.ts +375 -0
- package/src/codex/catalog/derive-entry.ts +229 -0
- package/src/codex/catalog/effort.ts +0 -1
- package/src/codex/catalog/gated-native-warn.ts +63 -0
- package/src/codex/catalog/gather-capture.ts +533 -0
- package/src/codex/catalog/model-hints.ts +691 -0
- package/src/codex/catalog/model-visibility.ts +305 -0
- package/src/codex/catalog/provider-fetch.ts +52 -2942
- package/src/codex/catalog/provider-models.ts +685 -0
- package/src/codex/catalog/remote.ts +30 -0
- package/src/codex/catalog/restore.ts +132 -0
- package/src/codex/catalog/retained-sync.ts +714 -0
- package/src/codex/catalog/routed-gather.ts +895 -0
- package/src/codex/catalog/subagent-roster.ts +176 -0
- package/src/codex/catalog/sync.ts +52 -2698
- package/src/codex/cli-install-provenance.ts +7 -1
- package/src/codex/convergence.ts +7 -2
- package/src/codex/desktop-app/types.ts +11 -2
- package/src/codex/desktop-app/windows.ts +5 -5
- package/src/codex/inject/config-toml.ts +563 -0
- package/src/codex/inject/remove.ts +192 -0
- package/src/codex/inject/restore.ts +567 -0
- package/src/codex/inject/routing-classify.ts +109 -0
- package/src/codex/inject/routing-target.ts +125 -0
- package/src/codex/inject.ts +89 -1444
- package/src/codex/lineage.ts +458 -0
- package/src/codex/model-entitlements.ts +152 -15
- package/src/codex/pool-refresh-backoff.ts +161 -0
- package/src/codex/quota-rejection.ts +104 -15
- package/src/codex/routing/active-account.ts +194 -0
- package/src/codex/routing/cache-affinity.ts +70 -0
- package/src/codex/routing/cooldown-math.ts +285 -0
- package/src/codex/routing/health-store.ts +402 -0
- package/src/codex/routing/probe-lease.ts +358 -0
- package/src/codex/routing/selection.ts +780 -0
- package/src/codex/routing/thread-affinity.ts +586 -0
- package/src/codex/routing/transient-hold-dispatch.ts +141 -0
- package/src/codex/routing.ts +370 -2271
- package/src/codex/shim-fingerprint.ts +223 -0
- package/src/codex/shim-inspect.ts +175 -0
- package/src/codex/shim-probe.ts +367 -0
- package/src/codex/shim-restore-lock.ts +169 -0
- package/src/codex/shim-state-file.ts +151 -0
- package/src/codex/shim-templates.ts +265 -0
- package/src/codex/shim.ts +48 -1268
- package/src/codex/warmup.ts +1 -1
- package/src/combos/failover.ts +85 -0
- package/src/combos/request.ts +17 -10
- package/src/combos/types.ts +23 -2
- package/src/config/diagnostics.ts +705 -0
- package/src/config/feature-flags.ts +55 -0
- package/src/config/live-reconcile.ts +403 -0
- package/src/config/load-degrade.ts +880 -0
- package/src/config/mutation-lock.ts +244 -0
- package/src/config/openai-tier-backup.ts +268 -0
- package/src/config/pending-teardown.ts +31 -0
- package/src/config/persist-unlocked.ts +92 -0
- package/src/config/proxy-env.ts +188 -0
- package/src/config/salvage.ts +244 -0
- package/src/config/schema/config-schema.ts +640 -0
- package/src/config/schema/leaf-validators.ts +855 -0
- package/src/config/warn-memo.ts +28 -0
- package/src/config.ts +234 -4481
- package/src/generated/compatibility-version.json +649 -121
- package/src/images/loop.ts +1 -1
- package/src/lib/errors.ts +17 -0
- package/src/lib/request-execution-budget.ts +198 -23
- package/src/lib/spend-reservation-ledger.ts +958 -0
- package/src/lib/state-store-registrations.ts +6 -2
- package/src/lib/test-home-guard.ts +85 -1
- package/src/lib/upstream-retry.ts +132 -21
- package/src/lib/windows-elevation.ts +76 -14
- package/src/lib/workflow-budget.ts +553 -30
- package/src/oauth/index.ts +2 -2
- package/src/oauth/key-providers.ts +2 -2
- package/src/providers/kiro-models.ts +4 -3
- package/src/providers/label.ts +19 -1
- package/src/providers/model-discovery.ts +16 -0
- package/src/providers/quota/account-cache.ts +441 -0
- package/src/providers/quota/antigravity.ts +295 -0
- package/src/providers/quota/report-cache.ts +320 -0
- package/src/providers/quota/vendor-probes-key.ts +1243 -0
- package/src/providers/quota/vendor-probes-oauth.ts +590 -0
- package/src/providers/quota.ts +324 -3079
- package/src/providers/registry/entries-core.ts +1228 -0
- package/src/providers/registry/entries-extended.ts +1213 -0
- package/src/providers/registry/model-seeds.ts +912 -0
- package/src/providers/registry/types.ts +352 -0
- package/src/providers/registry.ts +24 -3536
- package/src/responses/continuation-ownership.ts +29 -0
- package/src/responses/reasoning-envelope.ts +6 -3
- package/src/responses/state/replay-fingerprint.ts +80 -0
- package/src/responses/state/snapshot-codec.ts +104 -0
- package/src/responses/state/spill-failure.ts +118 -0
- package/src/responses/state/spill-queue.ts +665 -0
- package/src/responses/state/temp-recovery.ts +257 -0
- package/src/responses/state.ts +82 -1143
- package/src/routing/identity-domains.ts +456 -0
- package/src/routing/probe-lease.ts +613 -0
- package/src/server/chat-completions.ts +3 -1
- package/src/server/chat-native.ts +37 -9
- package/src/server/index/bounded-request.ts +88 -0
- package/src/server/index/live-sideband.ts +601 -0
- package/src/server/index/serve-options.ts +1766 -0
- package/src/server/index/startup-warnings.ts +213 -0
- package/src/server/index/websocket-handler.ts +339 -0
- package/src/server/index.ts +45 -2552
- package/src/server/inspection-tee.ts +107 -0
- package/src/server/live.ts +46 -1
- package/src/server/management/combo-routes.ts +10 -1
- package/src/server/management/route-registry.ts +26 -23
- package/src/server/management/shared.ts +8 -5
- package/src/server/management/workflow-budget-routes.ts +133 -0
- package/src/server/management-api.ts +12 -0
- package/src/server/relay-eager.ts +2 -0
- package/src/server/relay.ts +14 -19
- package/src/server/request-log-conversation.ts +9 -7
- package/src/server/request-log.ts +372 -4
- package/src/server/response-log-body.ts +153 -0
- package/src/server/responses/account-change-state.ts +307 -0
- package/src/server/responses/adapter-continuation.ts +540 -0
- package/src/server/responses/adapter-delivery.ts +208 -0
- package/src/server/responses/adapter-dispatch.ts +1042 -0
- package/src/server/responses/codex-ws-wire.ts +5 -0
- package/src/server/responses/collaboration.ts +74 -4
- package/src/server/responses/combo-session-recall.ts +68 -8
- package/src/server/responses/compact.ts +113 -17
- package/src/server/responses/completion-policy.ts +33 -0
- package/src/server/responses/core-auth.ts +529 -0
- package/src/server/responses/core-codex-account.ts +907 -0
- package/src/server/responses/core-combo-failure.ts +210 -0
- package/src/server/responses/core-combo.ts +787 -0
- package/src/server/responses/core-errors.ts +170 -0
- package/src/server/responses/core-lifetime.ts +95 -0
- package/src/server/responses/core-normalize.ts +350 -0
- package/src/server/responses/core-opaque-recovery.ts +380 -0
- package/src/server/responses/core-options.ts +159 -0
- package/src/server/responses/core-replay.ts +298 -0
- package/src/server/responses/core.ts +192 -8893
- package/src/server/responses/encrypted-payload.ts +0 -1
- package/src/server/responses/input-admission.ts +126 -6
- package/src/server/responses/passthrough-delivery.ts +869 -0
- package/src/server/responses/passthrough-dispatch.ts +1494 -0
- package/src/server/responses/passthrough-error.ts +38 -2
- package/src/server/responses/passthrough-execution.ts +54 -0
- package/src/server/responses/request-prepare.ts +1080 -0
- package/src/server/responses/request-send-budget.ts +259 -0
- package/src/server/responses/request-sidecar-auth.ts +149 -0
- package/src/server/responses/request-spend.ts +147 -0
- package/src/server/responses/request-transport.ts +803 -0
- package/src/server/responses/response-effects.ts +157 -0
- package/src/server/responses/run-turn-execution.ts +476 -0
- package/src/server/responses/sidecar-execution.ts +463 -0
- package/src/server/responses/terminal-guard.ts +65 -4
- package/src/server/responses-image-gen-repair.ts +1 -1
- package/src/server/responses-undeclared-tool-guard.ts +9 -5
- package/src/server/workflow-refusal.ts +84 -0
- package/src/service/windows-ops.ts +210 -16
- package/src/service/windows-scheduler.ts +28 -21
- package/src/service.ts +1 -1
- package/src/types/config.ts +34 -1
- package/src/types/request.ts +8 -5
- package/src/types/tools.ts +24 -0
- package/src/types.ts +2 -0
- package/src/update/index.ts +10 -0
- package/src/update/stop-contract.d.mts +1 -0
- package/src/update/stop-contract.mjs +19 -0
- package/src/update/stop-decision.d.mts +1 -1
- package/src/update/stop-decision.mjs +12 -3
- package/src/usage/log.ts +147 -1
- package/src/usage/summary.ts +171 -21
- package/src/vision/anthropic-describe.ts +1 -1
- package/src/vision/describe.ts +5 -5
- package/src/web-search/anthropic-executor.ts +1 -1
- package/src/web-search/exa-executor.ts +1 -1
- package/src/web-search/executor.ts +1 -1
- package/src/web-search/gemini-executor.ts +1 -1
- package/src/web-search/loop.ts +1 -1
- package/src/web-search/ollama-executor.ts +1 -1
- package/src/web-search/parse.ts +67 -14
- package/src/web-search/passthrough-bridge.ts +64 -31
- package/src/web-search/xai-executor.ts +1 -1
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// Holds INV-AGENT-01 from structure/overview.md; keep the id here if this file is split or renamed.
|
|
2
|
+
import { slugsEquivalent } from "../../providers/slug-codec";
|
|
3
|
+
import { readCatalog, readCodexCatalogPath } from "./parsing";
|
|
4
|
+
import type { RawEntry } from "./parsing";
|
|
5
|
+
import { SUPPORTED_NATIVE_OPENAI_SLUGS } from "./metadata";
|
|
6
|
+
import { trustedAccountBoundNativeCatalogSlug } from "./account-models";
|
|
7
|
+
import { catalogEntryEfforts } from "./effort";
|
|
8
|
+
|
|
9
|
+
export const MAX_SPAWN_AGENT_MODEL_OVERRIDES = 5;
|
|
10
|
+
|
|
11
|
+
// Base for config.modelPickerOrder display priorities (#1649). modelPickerOrder is a DISPLAY-ONLY
|
|
12
|
+
// reordering of the Codex model picker: it rewrites a row's Codex-visible `priority` but not
|
|
13
|
+
// OpenCodex's natural-priority guidance window. Native Codex advertisements still follow the
|
|
14
|
+
// visible priority and can differ from that guidance window.
|
|
15
|
+
export const PICKER_ORDER_PRIORITY_BASE = 1_000;
|
|
16
|
+
|
|
17
|
+
// OpenCodex-private catalog field: the guidance candidate priority a row would have WITHOUT
|
|
18
|
+
// modelPickerOrder. Codex ignores unknown catalog fields (same as opencodex_catalog_kind), so this
|
|
19
|
+
// is invisible to Codex; effectiveSubagentRoster reads it to keep OpenCodex guidance candidates
|
|
20
|
+
// independent of display order. It does not freeze native advertisements. Absent on unmoved rows.
|
|
21
|
+
export const SPAWN_PRIORITY_FIELD = "opencodex_spawn_priority";
|
|
22
|
+
|
|
23
|
+
// OpenCodex-private catalog field: this row is listed but currently unable to serve (#1711).
|
|
24
|
+
// Codex ignores unknown catalog fields (same as opencodex_catalog_kind and the spawn priority
|
|
25
|
+
// above) and ensureStrictCatalogFields does not strip extras, so this is invisible to the native
|
|
26
|
+
// picker and cannot change what Codex offers. It never touches `visibility`.
|
|
27
|
+
export const CATALOG_INACTIVE_REASON_FIELD = "opencodex_inactive_reason";
|
|
28
|
+
|
|
29
|
+
export type SpawnAgentSurface = "v1" | "v2";
|
|
30
|
+
|
|
31
|
+
export type SubagentRosterExclusionReason =
|
|
32
|
+
| "missing_catalog_entry"
|
|
33
|
+
| "picker_hidden"
|
|
34
|
+
| "surface_incompatible"
|
|
35
|
+
| "outside_display_limit";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Whether a catalog entry may be offered as a V2 subagent model.
|
|
39
|
+
*
|
|
40
|
+
* Upstream changed this rule in codex-rs `6d4d9442c` ("Support leaf models in
|
|
41
|
+
* multi-agent v2"). `model_supports_multi_agent_backend`
|
|
42
|
+
* (core/src/tools/handlers/multi_agents_common.rs:36-42) now admits EVERY model
|
|
43
|
+
* except one explicitly marked `disabled`; the older `== Some(V2)` equality that
|
|
44
|
+
* `92938d880` introduced is gone.
|
|
45
|
+
*
|
|
46
|
+
* The field no longer answers "may I be a delegation target". It answers "does the
|
|
47
|
+
* CHILD get collaboration tools": `collab_tools_enabled`
|
|
48
|
+
* (core/src/tools/spec_plan.rs:599-610) grants a child recursive tools only when its
|
|
49
|
+
* own catalog value is exactly `Some(V2)`. The three-way distinction survives, but it
|
|
50
|
+
* now means eligible-recursive / eligible-LEAF / excluded:
|
|
51
|
+
*
|
|
52
|
+
* - `"v2"` -> eligible, and the child may itself delegate.
|
|
53
|
+
* - `"v1"` -> eligible LEAF worker. This is upstream's pin for `gpt-5.6-luna`
|
|
54
|
+
* (models-manager/models.json); excluding it here is exactly what
|
|
55
|
+
* kept Luna out of opencodex's roster.
|
|
56
|
+
* - absent/null -> eligible LEAF worker (routed or unpinned-native model).
|
|
57
|
+
* - `"disabled"` -> the sole capability-based exclusion.
|
|
58
|
+
*
|
|
59
|
+
* This is the roster filter only. Catalog STAMPING is a separate concern owned by
|
|
60
|
+
* `applyMultiAgentMode`, including the `keepNativeChatGptOnV1` policy (#1728) that
|
|
61
|
+
* keeps ChatGPT-native rows on `v1` so a native parent can still spawn a routed child
|
|
62
|
+
* despite backend-encrypted NEW_TASK bodies (#92). Recognizing those `v1` rows as
|
|
63
|
+
* eligible leaves here is what makes that policy usable, not a contradiction of it.
|
|
64
|
+
*
|
|
65
|
+
* Devlog: 260816_codexrs_multiagent_v2_and_history_perf/011 (C1), superseding the
|
|
66
|
+
* option-B decision in 260730_codex_rs_upstream_v2_live_handoff/060.
|
|
67
|
+
*/
|
|
68
|
+
export function isEligibleV2SubagentEntry(entry: RawEntry): boolean {
|
|
69
|
+
return entry.multi_agent_version !== "disabled";
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface EffectiveSubagentModel {
|
|
73
|
+
model: string;
|
|
74
|
+
efforts: string[];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface SubagentRosterExclusion {
|
|
78
|
+
configured: string;
|
|
79
|
+
reason: SubagentRosterExclusionReason;
|
|
80
|
+
catalogModel?: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface EffectiveSubagentRoster {
|
|
84
|
+
/** OpenCodex's natural-priority guidance projection, not captured native tool text. */
|
|
85
|
+
candidates: EffectiveSubagentModel[];
|
|
86
|
+
/** Configured models within that projection; exact-name eligibility is a separate check. */
|
|
87
|
+
advertised: EffectiveSubagentModel[];
|
|
88
|
+
excluded: SubagentRosterExclusion[];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export function configuredCatalogEntry(entries: readonly RawEntry[], configured: string): RawEntry | undefined {
|
|
92
|
+
return entries.find(entry => entry.slug === configured)
|
|
93
|
+
?? entries.find(entry => typeof entry.slug === "string" && slugsEquivalent(configured, entry.slug));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function configuredSubagentModelMatchesEntry(configured: string, entry: RawEntry): boolean {
|
|
97
|
+
if (typeof entry.slug !== "string") return false;
|
|
98
|
+
if (slugsEquivalent(configured, entry.slug)) return true;
|
|
99
|
+
const nativeSlug = trustedAccountBoundNativeCatalogSlug(entry);
|
|
100
|
+
return !configured.includes("/")
|
|
101
|
+
&& nativeSlug !== undefined
|
|
102
|
+
&& SUPPORTED_NATIVE_OPENAI_SLUGS.has(nativeSlug)
|
|
103
|
+
&& slugsEquivalent(configured, nativeSlug);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function effectiveSubagentRoster(
|
|
107
|
+
configuredModels: readonly string[],
|
|
108
|
+
surface: SpawnAgentSurface,
|
|
109
|
+
catalogEntries?: readonly RawEntry[],
|
|
110
|
+
): EffectiveSubagentRoster {
|
|
111
|
+
const configured = configuredModels
|
|
112
|
+
.filter(model => model.trim().length > 0)
|
|
113
|
+
.filter((model, index, all) =>
|
|
114
|
+
!all.slice(0, index).some(previous => slugsEquivalent(previous, model))
|
|
115
|
+
);
|
|
116
|
+
const entries = catalogEntries ?? readCatalog(readCodexCatalogPath())?.models ?? [];
|
|
117
|
+
const ordered = entries
|
|
118
|
+
.map((entry, index) => ({ entry, index }))
|
|
119
|
+
.filter(({ entry }) => typeof entry.slug === "string")
|
|
120
|
+
.filter(({ entry }) => entry.visibility === "list")
|
|
121
|
+
.filter(({ entry }) => surface !== "v2" || isEligibleV2SubagentEntry(entry))
|
|
122
|
+
.sort((left, right) => {
|
|
123
|
+
// OpenCodex guidance candidates rank by natural priority (SPAWN_PRIORITY_FIELD when present),
|
|
124
|
+
// so modelPickerOrder does not change this projection. Native tool advertisements differ. Rows the
|
|
125
|
+
// override did not move fall back to their Codex-visible `priority`.
|
|
126
|
+
const spawnPriorityOf = (entry: RawEntry): number => {
|
|
127
|
+
const spawn = entry[SPAWN_PRIORITY_FIELD];
|
|
128
|
+
if (typeof spawn === "number" && Number.isFinite(spawn)) return spawn;
|
|
129
|
+
return typeof entry.priority === "number" && Number.isFinite(entry.priority)
|
|
130
|
+
? entry.priority : Number.MAX_SAFE_INTEGER;
|
|
131
|
+
};
|
|
132
|
+
const leftPriority = spawnPriorityOf(left.entry);
|
|
133
|
+
const rightPriority = spawnPriorityOf(right.entry);
|
|
134
|
+
return leftPriority - rightPriority || left.index - right.index;
|
|
135
|
+
})
|
|
136
|
+
.slice(0, MAX_SPAWN_AGENT_MODEL_OVERRIDES);
|
|
137
|
+
const orderedEntries = new Set(ordered.map(({ entry }) => entry));
|
|
138
|
+
|
|
139
|
+
const candidates = ordered.map(({ entry }) => ({
|
|
140
|
+
model: entry.slug as string,
|
|
141
|
+
efforts: catalogEntryEfforts(entry),
|
|
142
|
+
}));
|
|
143
|
+
const advertised = ordered
|
|
144
|
+
.filter(({ entry }) => configured.some(model => configuredSubagentModelMatchesEntry(model, entry)))
|
|
145
|
+
.map(({ entry }) => ({
|
|
146
|
+
model: entry.slug as string,
|
|
147
|
+
efforts: catalogEntryEfforts(entry),
|
|
148
|
+
}));
|
|
149
|
+
const excluded = configured.flatMap((model): SubagentRosterExclusion[] => {
|
|
150
|
+
const matchingEntries = entries.filter(entry => configuredSubagentModelMatchesEntry(model, entry));
|
|
151
|
+
if (matchingEntries.some(entry => orderedEntries.has(entry))) return [];
|
|
152
|
+
if (matchingEntries.length === 0) return [{ configured: model, reason: "missing_catalog_entry" }];
|
|
153
|
+
const visibleCompatible = matchingEntries.find(entry =>
|
|
154
|
+
entry.visibility === "list"
|
|
155
|
+
&& (surface !== "v2" || isEligibleV2SubagentEntry(entry))
|
|
156
|
+
);
|
|
157
|
+
if (visibleCompatible) {
|
|
158
|
+
return [{
|
|
159
|
+
configured: model,
|
|
160
|
+
catalogModel: visibleCompatible.slug as string,
|
|
161
|
+
reason: "outside_display_limit",
|
|
162
|
+
}];
|
|
163
|
+
}
|
|
164
|
+
const visible = matchingEntries.find(entry => entry.visibility === "list");
|
|
165
|
+
if (visible) {
|
|
166
|
+
return [{
|
|
167
|
+
configured: model,
|
|
168
|
+
catalogModel: visible.slug as string,
|
|
169
|
+
reason: "surface_incompatible",
|
|
170
|
+
}];
|
|
171
|
+
}
|
|
172
|
+
const hidden = configuredCatalogEntry(entries, model) ?? matchingEntries[0]!;
|
|
173
|
+
return [{ configured: model, catalogModel: hidden.slug as string, reason: "picker_hidden" }];
|
|
174
|
+
});
|
|
175
|
+
return { candidates, advertised, excluded };
|
|
176
|
+
}
|