@oh-my-pi/pi-catalog 18.1.6 → 18.1.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [18.1.8] - 2026-09-03
6
+
7
+ ### Added
8
+
9
+ - Added GPT-6 Astra to the OpenAI Codex model catalog, including support for configuration updates and requests using the freeform `apply_patch` tool.
10
+
11
+ ### Fixed
12
+
13
+ - Fixed `omp models refresh` so revoked ChatGPT account tokens no longer prevent the remaining OpenAI Codex models from being discovered.
14
+
5
15
  ## [18.1.6] - 2026-09-03
6
16
 
7
17
  ### Added
@@ -26,6 +26,13 @@ export interface CodexModelDiscoveryOptions {
26
26
  export interface CodexModelDiscoveryResult {
27
27
  models: ModelSpec<"openai-codex-responses">[];
28
28
  etag?: string;
29
+ /**
30
+ * Set when the backend rejected the credential itself (401/403, e.g.
31
+ * `token_revoked`); `models` is empty. A definitive per-account denial,
32
+ * unlike the `null` result for transport/parse failures, so multi-account
33
+ * discovery can skip the account instead of aborting.
34
+ */
35
+ rejectedStatus?: 401 | 403;
29
36
  }
30
37
  /**
31
38
  * Fetches model metadata from Codex backend and normalizes it for pi model management.
@@ -700,6 +700,13 @@ export interface ResolvedOpenAIResponsesCompat extends ResolvedOpenAISharedCompa
700
700
  * transport; earlier ids reject the value.
701
701
  */
702
702
  supportsAllTurnsReasoningContext: boolean;
703
+ /**
704
+ * Whether a `configuration_update` input item may change `reasoning.effort`
705
+ * mid-conversation while the request-level effort stays byte-stable for
706
+ * prompt caching. Rule-owned: GPT-6 Astra only; every other model rejects
707
+ * the item type with 400.
708
+ */
709
+ supportsConfigurationUpdate: boolean;
703
710
  /** Inject the `# Juice: 0 !important` developer item when reasoning is forced off (gpt-5.6+). */
704
711
  requiresReasoningOffJuiceInstruction: boolean;
705
712
  /**
@@ -4,8 +4,12 @@
4
4
  export declare const CODEX_BASE_URL = "https://chatgpt.com/backend-api";
5
5
  /**
6
6
  * Pinned OpenAI Codex client version (corresponds to @openai/codex package version).
7
+ *
8
+ * The backend version-gates model availability against this value on both
9
+ * `/models?client_version=` and `/responses` (`gpt-6-astra` requires ≥ 0.153.0);
10
+ * an older pin silently hides newer SKUs from discovery.
7
11
  */
8
- export declare const CODEX_CLIENT_VERSION = "0.144.1";
12
+ export declare const CODEX_CLIENT_VERSION = "0.153.0";
9
13
  export declare const OPENAI_HEADERS: {
10
14
  readonly BETA: "OpenAI-Beta";
11
15
  /** Codex feature-negotiation header; values identify opt-in wire protocols. */
@@ -28,18 +32,32 @@ export declare const OPENAI_HEADERS: {
28
32
  readonly ATTESTATION: "x-oai-attestation";
29
33
  /** Client-declared data residency for region-pinned enterprise workspaces. */
30
34
  readonly RESIDENCY: "x-openai-internal-codex-residency";
35
+ /**
36
+ * Model routing hint (codex-rs `X_CODEX_ROUTING_HINT_HEADER`): `model=<slug>`
37
+ * or `model=<slug>;tier=<service_tier>`; sent on every ChatGPT-OAuth
38
+ * Responses, compaction, and WebSocket handshake request. Built by
39
+ * {@link codexRoutingHint}.
40
+ */
41
+ readonly ROUTING_HINT: "x-codex-routing-hint";
31
42
  };
32
43
  export declare const OPENAI_HEADER_VALUES: {
33
44
  readonly BETA_RESPONSES: "responses=experimental";
34
45
  readonly BETA_RESPONSES_WEBSOCKETS_V2: "responses_websockets=2026-02-06";
35
46
  readonly REMOTE_COMPACTION_V2: "remote_compaction_v2";
36
- readonly ORIGINATOR_CODEX: "pi";
47
+ readonly ORIGINATOR_CODEX: "omp";
37
48
  };
38
49
  export declare const URL_PATHS: {
39
50
  readonly RESPONSES: "/responses";
40
51
  readonly CODEX_RESPONSES: "/codex/responses";
41
52
  };
42
53
  export declare const JWT_CLAIM_PATH: "https://api.openai.com/auth";
54
+ /**
55
+ * Build the `x-codex-routing-hint` value for a request (codex-rs
56
+ * `build_routing_hint_header`): the requested model slug plus the explicit
57
+ * service tier when one is set. Callers set it only on ChatGPT-OAuth requests
58
+ * to the Codex backend; API-key OpenAI traffic never carries it.
59
+ */
60
+ export declare function codexRoutingHint(model: string, serviceTier: string | null | undefined): string;
43
61
  /**
44
62
  * Extract account ID from a Codex JWT access token.
45
63
  * Returns undefined if the token is not a valid Codex JWT.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@oh-my-pi/pi-catalog",
4
- "version": "18.1.6",
4
+ "version": "18.1.8",
5
5
  "description": "Model catalog for omp: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
6
6
  "homepage": "https://omp.sh",
7
7
  "author": "Stencil Labs, Inc.",
@@ -35,12 +35,12 @@
35
35
  "gen:proto": "bun scripts/generate-protocols.ts"
36
36
  },
37
37
  "dependencies": {
38
- "@oh-my-pi/omptype": "18.1.6",
39
- "@oh-my-pi/pi-utils": "18.1.6"
38
+ "@oh-my-pi/omptype": "18.1.8",
39
+ "@oh-my-pi/pi-utils": "18.1.8"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@bgotink/kdl": "0.4.0",
43
- "@oh-my-pi/pi-ai": "18.1.6",
43
+ "@oh-my-pi/pi-ai": "18.1.8",
44
44
  "@types/bun": "^1.3.14"
45
45
  },
46
46
  "engines": {
@@ -128,6 +128,7 @@ export const AXES: Readonly<Record<string, AxisDef>> = {
128
128
  "strict-responses-pairing": wire("strictResponsesPairing", ["openai-responses"]),
129
129
  "requires-reasoning-off-juice-instruction": wire("requiresReasoningOffJuiceInstruction", ["openai-responses"]),
130
130
  "supports-all-turns-reasoning-context": wire("supportsAllTurnsReasoningContext", ["openai-responses"]),
131
+ "supports-configuration-update": wire("supportsConfigurationUpdate", ["openai-responses"]),
131
132
  "strip-deepseek-special-tokens": wire("stripDeepseekSpecialTokens", OAI),
132
133
  "stream-markup-healing-pattern": wire("streamMarkupHealingPattern", OAI, "scalar", [
133
134
  "kimi",
@@ -714,6 +714,7 @@ function resolveOpenAIResponsesPolicy(
714
714
  supportsImageDetailOriginal: !isXaiHost && !modelMatchesHost(hostModel, "githubCopilot"),
715
715
  supportsReasoningSummary: !isXaiHost,
716
716
  supportsAllTurnsReasoningContext: false,
717
+ supportsConfigurationUpdate: false,
717
718
  requiresReasoningOffJuiceInstruction: false,
718
719
  stripImageInput: false,
719
720
  thinkingLoopGuard: undefined,
@@ -815,6 +816,7 @@ function pickResponsesOnly(compat: ResolvedOpenAIResponsesCompat): ResponsesOnly
815
816
  supportsImageDetailOriginal: compat.supportsImageDetailOriginal,
816
817
  supportsObfuscationOptOut: compat.supportsObfuscationOptOut,
817
818
  supportsAllTurnsReasoningContext: compat.supportsAllTurnsReasoningContext,
819
+ supportsConfigurationUpdate: compat.supportsConfigurationUpdate,
818
820
  officialEndpoint: compat.officialEndpoint,
819
821
  harmonyLeakMitigation: compat.harmonyLeakMitigation,
820
822
  cacheControlFormat: compat.cacheControlFormat,
@@ -8,7 +8,7 @@ auth "openai-codex" {
8
8
  authorize-params {
9
9
  id_token_add_organizations "true"
10
10
  codex_cli_simplified_flow "true"
11
- originator "pi"
11
+ originator "omp"
12
12
  }
13
13
  instructions "A browser window should open. Complete login to finish."
14
14
  // OpenAI only allowlists this exact URI; a busy port must fail rather than fall back.
@@ -30,6 +30,12 @@ class "openai" {
30
30
  thinking-efforts "low" "medium" "high" "xhigh" "max"
31
31
  requires-reasoning-off-juice-instruction #true
32
32
  }
33
+ // GPT-6 Astra changes reasoning effort mid-conversation through a
34
+ // `configuration_update` input item so the request-level effort (and the
35
+ // cached prompt prefix) stays put; every other SKU 400s on the item type.
36
+ models "gpt-6-astra" {
37
+ supports-configuration-update #true
38
+ }
33
39
  // Codex SKUs: the advertised 400K figure includes the output budget; the
34
40
  // true prompt window is 272K. Spark budgets are its own family's.
35
41
  family "codex" {
@@ -69,9 +69,9 @@ provider "openai-codex" {
69
69
  }
70
70
  }
71
71
  }
72
- // First-party GPT-5 Responses SKUs support the freeform apply_patch
72
+ // First-party GPT-5/GPT-6 Responses SKUs support the freeform apply_patch
73
73
  // custom tool with a Lark grammar.
74
- revision ">=5 <6" {
74
+ revision ">=5 <7" {
75
75
  apply-patch-tool-type "freeform"
76
76
  }
77
77
  }
@@ -40,7 +40,7 @@ provider "openai" {
40
40
  reasoning-disable-mode "none-effort"
41
41
  }
42
42
  }
43
- revision ">=5 <6" {
43
+ revision ">=5 <7" {
44
44
  apply-patch-tool-type "freeform"
45
45
  }
46
46
  }
@@ -6226,6 +6226,19 @@
6226
6226
  {
6227
6227
  "source": "classes/openai.kdl:36",
6228
6228
  "class": "openai",
6229
+ "models": [
6230
+ {
6231
+ "kind": "exact",
6232
+ "value": "gpt-6-astra"
6233
+ }
6234
+ ],
6235
+ "wire": {
6236
+ "supportsConfigurationUpdate": true
6237
+ }
6238
+ },
6239
+ {
6240
+ "source": "classes/openai.kdl:42",
6241
+ "class": "openai",
6229
6242
  "family": "codex",
6230
6243
  "revision": [
6231
6244
  {
@@ -10650,7 +10663,7 @@
10650
10663
  },
10651
10664
  {
10652
10665
  "op": "<",
10653
- "revision": "6.0.0"
10666
+ "revision": "7.0.0"
10654
10667
  }
10655
10668
  ],
10656
10669
  "catalog": {
@@ -10955,7 +10968,7 @@
10955
10968
  },
10956
10969
  {
10957
10970
  "op": "<",
10958
- "revision": "6.0.0"
10971
+ "revision": "7.0.0"
10959
10972
  }
10960
10973
  ],
10961
10974
  "catalog": {
@@ -14919,7 +14932,7 @@
14919
14932
  "authorizeParams": {
14920
14933
  "id_token_add_organizations": "true",
14921
14934
  "codex_cli_simplified_flow": "true",
14922
- "originator": "pi"
14935
+ "originator": "omp"
14923
14936
  },
14924
14937
  "clientId": {
14925
14938
  "value": "app_EMoamEEZ73f0CkXaXp7hrann"
@@ -110,6 +110,13 @@ export interface CodexModelDiscoveryOptions {
110
110
  export interface CodexModelDiscoveryResult {
111
111
  models: ModelSpec<"openai-codex-responses">[];
112
112
  etag?: string;
113
+ /**
114
+ * Set when the backend rejected the credential itself (401/403, e.g.
115
+ * `token_revoked`); `models` is empty. A definitive per-account denial,
116
+ * unlike the `null` result for transport/parse failures, so multi-account
117
+ * discovery can skip the account instead of aborting.
118
+ */
119
+ rejectedStatus?: 401 | 403;
113
120
  }
114
121
 
115
122
  /**
@@ -139,6 +146,9 @@ export async function fetchCodexModels(options: CodexModelDiscoveryOptions): Pro
139
146
  continue;
140
147
  }
141
148
 
149
+ if (response.status === 401 || response.status === 403) {
150
+ return { models: [], rejectedStatus: response.status };
151
+ }
142
152
  if (!response.ok) {
143
153
  continue;
144
154
  }