jeopi-catalog 16.6.2 → 16.6.3

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,12 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [16.6.3] - 2026-10-16
6
+
7
+ ### Fixed
8
+
9
+ - Refresh Antigravity account catalogs with the current client version so entitled Gemini 4 Argon and Gemini 3.8 Flash tiers are discoverable. Invalidate model caches when the client identity changes and exclude explicitly designated tab and image-generation models without removing other chat models.
10
+
5
11
  ## [16.6.2] - 2026-10-03
6
12
 
7
13
  ### Changed
@@ -31,12 +31,22 @@ export interface AntigravityDiscoveryAgentModelGroup {
31
31
  export interface AntigravityDiscoveryAgentModelSort {
32
32
  groups?: AntigravityDiscoveryAgentModelGroup[];
33
33
  }
34
+ /**
35
+ * Tiered model ids returned by Antigravity's authenticated agent picker.
36
+ */
37
+ export interface AntigravityDiscoveryTieredModelIds {
38
+ [tier: string]: string[];
39
+ }
34
40
  /**
35
41
  * Response payload returned by Antigravity's `fetchAvailableModels` endpoint.
36
42
  */
37
43
  export interface AntigravityDiscoveryApiResponse {
38
44
  models?: Record<string, AntigravityDiscoveryApiModel>;
39
45
  agentModelSorts?: AntigravityDiscoveryAgentModelSort[];
46
+ tabModelIds?: string[];
47
+ imageGenerationModelIds?: string[];
48
+ tieredModelIds?: AntigravityDiscoveryTieredModelIds;
49
+ defaultAgentModelId?: string;
40
50
  }
41
51
  /**
42
52
  * Options for fetching Antigravity discovery models.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "jeopi-catalog",
4
- "version": "16.6.2",
4
+ "version": "16.6.3",
5
5
  "description": "Model catalog for jeopi: bundled model database, provider discovery descriptors, model identity, classification, and equivalence",
6
6
  "homepage": "https://github.com/akillness/jeopi",
7
7
  "author": "Can Boluk",
@@ -34,12 +34,12 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@bufbuild/protobuf": "^2.12.0",
37
- "jeopi-utils": "16.6.2",
37
+ "jeopi-utils": "16.6.3",
38
38
  "arktype": "2.2.3",
39
39
  "zod": "^4"
40
40
  },
41
41
  "devDependencies": {
42
- "jeopi-ai": "16.6.2",
42
+ "jeopi-ai": "16.6.3",
43
43
  "@types/bun": "^1.3.14"
44
44
  },
45
45
  "engines": {
@@ -49,13 +49,36 @@ export interface AntigravityDiscoveryAgentModelSort {
49
49
  groups?: AntigravityDiscoveryAgentModelGroup[];
50
50
  }
51
51
 
52
+ /**
53
+ * Tiered model ids returned by Antigravity's authenticated agent picker.
54
+ */
55
+ export interface AntigravityDiscoveryTieredModelIds {
56
+ [tier: string]: string[];
57
+ }
58
+
52
59
  /**
53
60
  * Response payload returned by Antigravity's `fetchAvailableModels` endpoint.
54
61
  */
55
62
  export interface AntigravityDiscoveryApiResponse {
56
63
  models?: Record<string, AntigravityDiscoveryApiModel>;
57
64
  agentModelSorts?: AntigravityDiscoveryAgentModelSort[];
65
+ tabModelIds?: string[];
66
+ imageGenerationModelIds?: string[];
67
+ tieredModelIds?: AntigravityDiscoveryTieredModelIds;
68
+ defaultAgentModelId?: string;
58
69
  }
70
+
71
+ const parseModelIdList = (value: unknown): string[] | undefined => {
72
+ if (!Array.isArray(value)) return undefined;
73
+ const modelIds: string[] = [];
74
+ for (const modelId of value) {
75
+ if (typeof modelId === "string" && modelId.trim()) {
76
+ modelIds.push(modelId.trim());
77
+ }
78
+ }
79
+ return modelIds;
80
+ };
81
+
59
82
  const AntigravityDiscoveryApiModelSchema = type({
60
83
  "displayName?": type("unknown").pipe(value => (typeof value === "string" ? value : undefined)),
61
84
  "supportsImages?": type("unknown").pipe(value => (typeof value === "boolean" ? value : undefined)),
@@ -78,9 +101,7 @@ const AntigravityDiscoveryApiModelSchema = type({
78
101
  });
79
102
 
80
103
  const AntigravityDiscoveryAgentModelGroupSchema = type({
81
- "modelIds?": type("unknown").pipe(value =>
82
- Array.isArray(value) ? value.filter((modelId): modelId is string => typeof modelId === "string") : undefined,
83
- ),
104
+ "modelIds?": type("unknown").pipe(parseModelIdList),
84
105
  });
85
106
 
86
107
  const AntigravityDiscoveryAgentModelSortSchema = type({
@@ -97,6 +118,20 @@ const AntigravityDiscoveryAgentModelSortSchema = type({
97
118
  }),
98
119
  });
99
120
 
121
+ const AntigravityDiscoveryTieredModelIdsSchema = type("unknown").pipe(value => {
122
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
123
+ return undefined;
124
+ }
125
+ const normalized: AntigravityDiscoveryTieredModelIds = {};
126
+ for (const [tier, modelIds] of Object.entries(value)) {
127
+ const parsedModelIds = parseModelIdList(modelIds);
128
+ if (parsedModelIds?.length) {
129
+ normalized[tier] = parsedModelIds;
130
+ }
131
+ }
132
+ return normalized;
133
+ });
134
+
100
135
  const AntigravityDiscoveryApiResponseSchema = type({
101
136
  "models?": type("unknown").pipe(value => {
102
137
  if (typeof value !== "object" || value === null) {
@@ -127,6 +162,12 @@ const AntigravityDiscoveryApiResponseSchema = type({
127
162
  }
128
163
  return result;
129
164
  }),
165
+ "tabModelIds?": type("unknown").pipe(parseModelIdList),
166
+ "imageGenerationModelIds?": type("unknown").pipe(parseModelIdList),
167
+ "tieredModelIds?": AntigravityDiscoveryTieredModelIdsSchema,
168
+ "defaultAgentModelId?": type("unknown").pipe(value =>
169
+ typeof value === "string" && value.trim() ? value.trim() : undefined,
170
+ ),
130
171
  });
131
172
  /**
132
173
  * Options for fetching Antigravity discovery models.
@@ -205,6 +246,8 @@ export async function fetchAntigravityDiscoveryModels(
205
246
  }
206
247
 
207
248
  const models: ModelSpec<"google-gemini-cli">[] = [];
249
+ const excludedModelIds = new Set([...(parsed.tabModelIds ?? []), ...(parsed.imageGenerationModelIds ?? [])]);
250
+ const pickerModelIds = collectPickerModelIds(parsed);
208
251
 
209
252
  for (const [modelId, model] of Object.entries(parsed.models ?? {})) {
210
253
  if (ANTIGRAVITY_DISCOVERY_DENYLIST.has(modelId)) {
@@ -213,6 +256,12 @@ export async function fetchAntigravityDiscoveryModels(
213
256
  if (model.isInternal === true) {
214
257
  continue;
215
258
  }
259
+ if (excludedModelIds.has(modelId)) {
260
+ continue;
261
+ }
262
+ if (pickerModelIds && !model.displayName?.trim() && !pickerModelIds.has(modelId)) {
263
+ continue;
264
+ }
216
265
 
217
266
  const supportsImages = model.supportsImages === true;
218
267
  models.push({
@@ -245,6 +294,26 @@ export async function fetchAntigravityDiscoveryModels(
245
294
  return null;
246
295
  }
247
296
 
297
+ function collectPickerModelIds(response: AntigravityDiscoveryApiResponse): Set<string> | undefined {
298
+ const modelIds = new Set<string>();
299
+ for (const sort of response.agentModelSorts ?? []) {
300
+ for (const group of sort.groups ?? []) {
301
+ for (const modelId of group.modelIds ?? []) {
302
+ modelIds.add(modelId);
303
+ }
304
+ }
305
+ }
306
+ for (const tierModelIds of Object.values(response.tieredModelIds ?? {})) {
307
+ for (const modelId of tierModelIds) {
308
+ modelIds.add(modelId);
309
+ }
310
+ }
311
+ if (response.defaultAgentModelId) {
312
+ modelIds.add(response.defaultAgentModelId);
313
+ }
314
+ return modelIds.size ? modelIds : undefined;
315
+ }
316
+
248
317
  function parseAntigravityDiscoveryResponse(value: unknown): AntigravityDiscoveryApiResponse | null {
249
318
  // An absent or corrupt map is a failed discovery, never an authoritative empty catalog.
250
319
  if (typeof value !== "object" || value === null || !("models" in value)) return null;
@@ -3,6 +3,7 @@ import { fetchGeminiModels } from "../discovery/gemini";
3
3
  import type { ModelManagerOptions } from "../model-manager";
4
4
  import type { FetchImpl } from "../types";
5
5
  import { GEMINI_CLI_VARIANT_COLLAPSE_TABLE } from "../variant-collapse";
6
+ import { getAntigravityUserAgent } from "../wire/gemini-headers";
6
7
 
7
8
  export interface GoogleModelManagerConfig {
8
9
  apiKey?: string;
@@ -70,7 +71,7 @@ export function googleAntigravityModelManagerOptions(
70
71
  providerId: "google-antigravity",
71
72
  ...(token
72
73
  ? {
73
- cacheProviderId: `google-antigravity:discovery-v2:${Bun.hash(JSON.stringify([endpoint, config?.cacheScope ?? token])).toString(36)}`,
74
+ cacheProviderId: `google-antigravity:discovery-v3:${Bun.hash(JSON.stringify([endpoint, config?.cacheScope ?? token, getAntigravityUserAgent()])).toString(36)}`,
74
75
  dynamicModelsAuthoritative: true,
75
76
  preserveAuthoritativeCacheOnFailure: true,
76
77
  fetchDynamicModels: async () => {
@@ -27,7 +27,7 @@ export const ANTIGRAVITY_SYSTEM_INSTRUCTION =
27
27
  * parse graph.
28
28
  */
29
29
  export let getAntigravityUserAgent = () => {
30
- const DEFAULT_ANTIGRAVITY_VERSION = "2.1.4";
30
+ const DEFAULT_ANTIGRAVITY_VERSION = "2.23.1";
31
31
  const version = process.env.PI_AI_ANTIGRAVITY_VERSION || DEFAULT_ANTIGRAVITY_VERSION;
32
32
  // Map Node.js platform/arch to Antigravity's expected format.
33
33
  // Verified against Antigravity source: _qn() and wqn() in main.js.