@cortexkit/antigravity-auth-core 1.0.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/LICENSE +21 -0
- package/README.md +25 -0
- package/dist/agy-transport.d.ts +15 -0
- package/dist/agy-transport.d.ts.map +1 -0
- package/dist/agy-transport.js +380 -0
- package/dist/agy-transport.js.map +1 -0
- package/dist/antigravity/oauth.d.ts +42 -0
- package/dist/antigravity/oauth.d.ts.map +1 -0
- package/dist/antigravity/oauth.js +179 -0
- package/dist/antigravity/oauth.js.map +1 -0
- package/dist/auth-types.d.ts +26 -0
- package/dist/auth-types.d.ts.map +1 -0
- package/dist/auth-types.js +3 -0
- package/dist/auth-types.js.map +1 -0
- package/dist/auth.d.ts +21 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +46 -0
- package/dist/auth.js.map +1 -0
- package/dist/constants.d.ts +146 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +214 -0
- package/dist/constants.js.map +1 -0
- package/dist/fingerprint.d.ts +73 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +129 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.d.ts +32 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +67 -0
- package/dist/logger.js.map +1 -0
- package/dist/model-registry.d.ts +47 -0
- package/dist/model-registry.d.ts.map +1 -0
- package/dist/model-registry.js +214 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/model-types.d.ts +8 -0
- package/dist/model-types.d.ts.map +1 -0
- package/dist/model-types.js +3 -0
- package/dist/model-types.js.map +1 -0
- package/dist/project.d.ts +34 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +236 -0
- package/dist/project.js.map +1 -0
- package/dist/transform/claude.d.ts +92 -0
- package/dist/transform/claude.d.ts.map +1 -0
- package/dist/transform/claude.js +280 -0
- package/dist/transform/claude.js.map +1 -0
- package/dist/transform/cross-model-sanitizer.d.ts +35 -0
- package/dist/transform/cross-model-sanitizer.d.ts.map +1 -0
- package/dist/transform/cross-model-sanitizer.js +225 -0
- package/dist/transform/cross-model-sanitizer.js.map +1 -0
- package/dist/transform/gemini.d.ts +100 -0
- package/dist/transform/gemini.d.ts.map +1 -0
- package/dist/transform/gemini.js +446 -0
- package/dist/transform/gemini.js.map +1 -0
- package/dist/transform/index.d.ts +15 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +14 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/transform/model-resolver.d.ts +95 -0
- package/dist/transform/model-resolver.d.ts.map +1 -0
- package/dist/transform/model-resolver.js +398 -0
- package/dist/transform/model-resolver.js.map +1 -0
- package/dist/transform/types.d.ts +111 -0
- package/dist/transform/types.d.ts.map +1 -0
- package/dist/transform/types.js +2 -0
- package/dist/transform/types.js.map +1 -0
- package/dist/version.d.ts +26 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +87 -0
- package/dist/version.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Resolution with Thinking Tier Support
|
|
3
|
+
*
|
|
4
|
+
* Resolves model names with tier suffixes (e.g., gemini-3-pro-high, claude-opus-4-6-thinking-low)
|
|
5
|
+
* to their actual API model names and corresponding thinking configurations.
|
|
6
|
+
*/
|
|
7
|
+
import type { ResolvedModel, GoogleSearchConfig } from "./types.ts";
|
|
8
|
+
export interface ModelResolverOptions {
|
|
9
|
+
cli_first?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Thinking tier budgets by model family.
|
|
13
|
+
* Claude and Gemini 2.5 Pro use numeric budgets.
|
|
14
|
+
*/
|
|
15
|
+
export declare const THINKING_TIER_BUDGETS: {
|
|
16
|
+
readonly claude: {
|
|
17
|
+
readonly low: 8192;
|
|
18
|
+
readonly medium: 16384;
|
|
19
|
+
readonly high: 32768;
|
|
20
|
+
};
|
|
21
|
+
readonly "gemini-2.5-pro": {
|
|
22
|
+
readonly low: 8192;
|
|
23
|
+
readonly medium: 16384;
|
|
24
|
+
readonly high: 32768;
|
|
25
|
+
};
|
|
26
|
+
readonly "gemini-2.5-flash": {
|
|
27
|
+
readonly low: 6144;
|
|
28
|
+
readonly medium: 12288;
|
|
29
|
+
readonly high: 24576;
|
|
30
|
+
};
|
|
31
|
+
readonly default: {
|
|
32
|
+
readonly low: 4096;
|
|
33
|
+
readonly medium: 8192;
|
|
34
|
+
readonly high: 16384;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Gemini 3 uses thinkingLevel strings instead of numeric budgets.
|
|
39
|
+
* Flash supports: minimal, low, medium, high
|
|
40
|
+
* Pro supports: low, high (no minimal/medium)
|
|
41
|
+
*/
|
|
42
|
+
export declare const GEMINI_3_THINKING_LEVELS: readonly ["minimal", "low", "medium", "high"];
|
|
43
|
+
/**
|
|
44
|
+
* Model aliases - maps user-friendly names to API model names.
|
|
45
|
+
*
|
|
46
|
+
* Format:
|
|
47
|
+
* - Gemini 3.x Pro variants: gemini-3.1-pro-{low,high}
|
|
48
|
+
* - Claude thinking variants: claude-{model}-thinking-{low,medium,high}
|
|
49
|
+
* - Claude non-thinking: claude-{model} (no -thinking suffix)
|
|
50
|
+
*/
|
|
51
|
+
export declare const MODEL_ALIASES: Record<string, string>;
|
|
52
|
+
/**
|
|
53
|
+
* Resolves a model name with optional tier suffix and quota prefix to its actual API model name
|
|
54
|
+
* and corresponding thinking configuration.
|
|
55
|
+
*
|
|
56
|
+
* Quota routing:
|
|
57
|
+
* - Default to Antigravity quota unless cli_first is enabled for Gemini models
|
|
58
|
+
* - Fallback to Gemini CLI happens at account rotation level when Antigravity is exhausted
|
|
59
|
+
* - "antigravity-" prefix marks explicit quota (no fallback allowed)
|
|
60
|
+
* - Claude and image models always use Antigravity
|
|
61
|
+
*
|
|
62
|
+
* Examples:
|
|
63
|
+
* - "gemini-2.5-flash" → { quotaPreference: "antigravity" }
|
|
64
|
+
* - "antigravity-gemini-3.1-pro-high" → { quotaPreference: "antigravity", explicitQuota: true } * - "claude-opus-4-6-thinking-medium" → { quotaPreference: "antigravity" }
|
|
65
|
+
*
|
|
66
|
+
* @param requestedModel - The model name from the request
|
|
67
|
+
* @param options - Optional configuration including cli_first preference
|
|
68
|
+
* @returns Resolved model with thinking configuration
|
|
69
|
+
*/
|
|
70
|
+
export declare function resolveModelWithTier(requestedModel: string, options?: ModelResolverOptions): ResolvedModel;
|
|
71
|
+
/**
|
|
72
|
+
* Gets the model family for routing decisions.
|
|
73
|
+
*/
|
|
74
|
+
export declare function getModelFamily(model: string): "claude" | "gemini-flash" | "gemini-pro";
|
|
75
|
+
/**
|
|
76
|
+
* Variant config from OpenCode's providerOptions.
|
|
77
|
+
*/
|
|
78
|
+
export interface VariantConfig {
|
|
79
|
+
thinkingBudget?: number;
|
|
80
|
+
googleSearch?: GoogleSearchConfig;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Resolves model name for a specific headerStyle (quota fallback support).
|
|
84
|
+
* Transforms model names when switching between gemini-cli and antigravity quotas.
|
|
85
|
+
*
|
|
86
|
+
* Issue #103: When quota fallback occurs, model names need to be transformed:
|
|
87
|
+
* - gemini-3-flash-preview (gemini-cli) → gemini-3-flash (antigravity)
|
|
88
|
+
* - gemini-3-flash (antigravity) → gemini-3-flash-preview (gemini-cli) */
|
|
89
|
+
export declare function resolveModelForHeaderStyle(requestedModel: string, headerStyle: "antigravity" | "gemini-cli"): ResolvedModel;
|
|
90
|
+
/**
|
|
91
|
+
* Resolves model with variant config from providerOptions.
|
|
92
|
+
* Variant config takes priority over tier suffix in model name.
|
|
93
|
+
*/
|
|
94
|
+
export declare function resolveModelWithVariant(requestedModel: string, variantConfig?: VariantConfig): ResolvedModel;
|
|
95
|
+
//# sourceMappingURL=model-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/transform/model-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAgB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,+CAAgD,CAAC;AAEtF;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAyB,CAAC;AA2G3E;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAgJ9G;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,CAStF;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAYD;;;;;;0EAM0E;AAC1E,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,aAAa,GAAG,YAAY,GACxC,aAAa,CAwDf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,MAAM,EACtB,aAAa,CAAC,EAAE,aAAa,GAC5B,aAAa,CAoDf"}
|
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model Resolution with Thinking Tier Support
|
|
3
|
+
*
|
|
4
|
+
* Resolves model names with tier suffixes (e.g., gemini-3-pro-high, claude-opus-4-6-thinking-low)
|
|
5
|
+
* to their actual API model names and corresponding thinking configurations.
|
|
6
|
+
*/
|
|
7
|
+
import { getGemini35FlashAntigravityModel, getGemini35FlashGeminiCliFallbackModel, getResolverAliasMap, } from "../model-registry.js";
|
|
8
|
+
/**
|
|
9
|
+
* Thinking tier budgets by model family.
|
|
10
|
+
* Claude and Gemini 2.5 Pro use numeric budgets.
|
|
11
|
+
*/
|
|
12
|
+
export const THINKING_TIER_BUDGETS = {
|
|
13
|
+
claude: { low: 8192, medium: 16384, high: 32768 },
|
|
14
|
+
"gemini-2.5-pro": { low: 8192, medium: 16384, high: 32768 },
|
|
15
|
+
"gemini-2.5-flash": { low: 6144, medium: 12288, high: 24576 },
|
|
16
|
+
default: { low: 4096, medium: 8192, high: 16384 },
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Gemini 3 uses thinkingLevel strings instead of numeric budgets.
|
|
20
|
+
* Flash supports: minimal, low, medium, high
|
|
21
|
+
* Pro supports: low, high (no minimal/medium)
|
|
22
|
+
*/
|
|
23
|
+
export const GEMINI_3_THINKING_LEVELS = ["minimal", "low", "medium", "high"];
|
|
24
|
+
/**
|
|
25
|
+
* Model aliases - maps user-friendly names to API model names.
|
|
26
|
+
*
|
|
27
|
+
* Format:
|
|
28
|
+
* - Gemini 3.x Pro variants: gemini-3.1-pro-{low,high}
|
|
29
|
+
* - Claude thinking variants: claude-{model}-thinking-{low,medium,high}
|
|
30
|
+
* - Claude non-thinking: claude-{model} (no -thinking suffix)
|
|
31
|
+
*/
|
|
32
|
+
export const MODEL_ALIASES = getResolverAliasMap();
|
|
33
|
+
const TIER_REGEX = /-(minimal|low|medium|high)$/;
|
|
34
|
+
const QUOTA_PREFIX_REGEX = /^antigravity-/i;
|
|
35
|
+
const GEMINI_3_PRO_REGEX = /^gemini-3(?:\.\d+)?-pro/i;
|
|
36
|
+
const GEMINI_3_FLASH_REGEX = /^gemini-3(?:\.\d+)?-flash/i;
|
|
37
|
+
// ANTIGRAVITY_ONLY_MODELS removed - all models now default to antigravity
|
|
38
|
+
/**
|
|
39
|
+
* Image generation models - always route to Antigravity.
|
|
40
|
+
* These models don't support thinking and require imageConfig.
|
|
41
|
+
*/
|
|
42
|
+
const IMAGE_GENERATION_MODELS = /image|imagen/i;
|
|
43
|
+
// Legacy LEGACY_ANTIGRAVITY_GEMINI3 regex removed - all Gemini models now default to antigravity
|
|
44
|
+
/**
|
|
45
|
+
* Models that support thinking tier suffixes.
|
|
46
|
+
* Only these models should have -low/-medium/-high stripped as thinking tiers.
|
|
47
|
+
* GPT models like gpt-oss-120b-medium should NOT have -medium stripped.
|
|
48
|
+
*/
|
|
49
|
+
function supportsThinkingTiers(model) {
|
|
50
|
+
const lower = model.toLowerCase();
|
|
51
|
+
return (lower.includes("gemini-3") ||
|
|
52
|
+
lower.includes("gemini-2.5") ||
|
|
53
|
+
(lower.includes("claude") && lower.includes("thinking")));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Extracts thinking tier from model name suffix.
|
|
57
|
+
* Only extracts tier for models that support thinking tiers.
|
|
58
|
+
*/
|
|
59
|
+
function extractThinkingTierFromModel(model) {
|
|
60
|
+
// Only extract tier for models that support thinking tiers
|
|
61
|
+
if (!supportsThinkingTiers(model)) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const tierMatch = model.match(TIER_REGEX);
|
|
65
|
+
return tierMatch?.[1];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Determines the budget family for a model.
|
|
69
|
+
*/
|
|
70
|
+
function getBudgetFamily(model) {
|
|
71
|
+
if (model.includes("claude")) {
|
|
72
|
+
return "claude";
|
|
73
|
+
}
|
|
74
|
+
if (model.includes("gemini-2.5-pro")) {
|
|
75
|
+
return "gemini-2.5-pro";
|
|
76
|
+
}
|
|
77
|
+
if (model.includes("gemini-2.5-flash")) {
|
|
78
|
+
return "gemini-2.5-flash";
|
|
79
|
+
}
|
|
80
|
+
return "default";
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Checks if a model is a thinking-capable model.
|
|
84
|
+
*/
|
|
85
|
+
function isThinkingCapableModel(model) {
|
|
86
|
+
const lower = model.toLowerCase();
|
|
87
|
+
return (lower.includes("thinking") ||
|
|
88
|
+
lower.includes("gemini-3") ||
|
|
89
|
+
lower.includes("gemini-2.5"));
|
|
90
|
+
}
|
|
91
|
+
function isGemini3ProModel(model) {
|
|
92
|
+
return GEMINI_3_PRO_REGEX.test(model);
|
|
93
|
+
}
|
|
94
|
+
function isGemini3FlashModel(model) {
|
|
95
|
+
return GEMINI_3_FLASH_REGEX.test(model);
|
|
96
|
+
}
|
|
97
|
+
function isGemini35FlashModel(model) {
|
|
98
|
+
return /^gemini-3\.5-flash/i.test(model);
|
|
99
|
+
}
|
|
100
|
+
function resolveGemini35FlashAntigravityModel(tier) {
|
|
101
|
+
return getGemini35FlashAntigravityModel(tier);
|
|
102
|
+
}
|
|
103
|
+
function getAgyGemini35FlashThinkingBudget(tier) {
|
|
104
|
+
switch (tier) {
|
|
105
|
+
case "low":
|
|
106
|
+
return 1000;
|
|
107
|
+
case "high":
|
|
108
|
+
return 10000;
|
|
109
|
+
case "medium":
|
|
110
|
+
default:
|
|
111
|
+
return 4000;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function getAgyGemini31ProModel(tier) {
|
|
115
|
+
return tier === "high" ? "gemini-pro-agent" : "gemini-3.1-pro-low";
|
|
116
|
+
}
|
|
117
|
+
function getAgyGemini31ProThinkingBudget(tier) {
|
|
118
|
+
return tier === "high" ? 10001 : 1001;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Resolves a model name with optional tier suffix and quota prefix to its actual API model name
|
|
122
|
+
* and corresponding thinking configuration.
|
|
123
|
+
*
|
|
124
|
+
* Quota routing:
|
|
125
|
+
* - Default to Antigravity quota unless cli_first is enabled for Gemini models
|
|
126
|
+
* - Fallback to Gemini CLI happens at account rotation level when Antigravity is exhausted
|
|
127
|
+
* - "antigravity-" prefix marks explicit quota (no fallback allowed)
|
|
128
|
+
* - Claude and image models always use Antigravity
|
|
129
|
+
*
|
|
130
|
+
* Examples:
|
|
131
|
+
* - "gemini-2.5-flash" → { quotaPreference: "antigravity" }
|
|
132
|
+
* - "antigravity-gemini-3.1-pro-high" → { quotaPreference: "antigravity", explicitQuota: true } * - "claude-opus-4-6-thinking-medium" → { quotaPreference: "antigravity" }
|
|
133
|
+
*
|
|
134
|
+
* @param requestedModel - The model name from the request
|
|
135
|
+
* @param options - Optional configuration including cli_first preference
|
|
136
|
+
* @returns Resolved model with thinking configuration
|
|
137
|
+
*/
|
|
138
|
+
export function resolveModelWithTier(requestedModel, options = {}) {
|
|
139
|
+
const isAntigravity = QUOTA_PREFIX_REGEX.test(requestedModel);
|
|
140
|
+
const modelWithoutQuota = requestedModel.replace(QUOTA_PREFIX_REGEX, "");
|
|
141
|
+
const tier = extractThinkingTierFromModel(modelWithoutQuota);
|
|
142
|
+
const baseName = tier ? modelWithoutQuota.replace(TIER_REGEX, "") : modelWithoutQuota;
|
|
143
|
+
const isImageModel = IMAGE_GENERATION_MODELS.test(modelWithoutQuota);
|
|
144
|
+
const isClaudeModel = modelWithoutQuota.toLowerCase().includes("claude");
|
|
145
|
+
// All models default to Antigravity quota unless cli_first is enabled
|
|
146
|
+
// Fallback to gemini-cli happens at the account rotation level when Antigravity is exhausted
|
|
147
|
+
const preferGeminiCli = options.cli_first === true && !isAntigravity && !isImageModel && !isClaudeModel;
|
|
148
|
+
const quotaPreference = preferGeminiCli ? "gemini-cli" : "antigravity";
|
|
149
|
+
const explicitQuota = isAntigravity || isImageModel;
|
|
150
|
+
const isGemini3 = modelWithoutQuota.toLowerCase().startsWith("gemini-3");
|
|
151
|
+
const skipAlias = isAntigravity && isGemini3;
|
|
152
|
+
// For older Antigravity Gemini 3 models without explicit tier, append the
|
|
153
|
+
// tier to the model id. Gemini 3.5 Flash is different: live Antigravity
|
|
154
|
+
// exposes high as `gemini-3-flash-agent` and medium/low as
|
|
155
|
+
// `gemini-3.5-flash-low`.
|
|
156
|
+
const isGemini3Pro = isGemini3ProModel(modelWithoutQuota);
|
|
157
|
+
const isGemini3Flash = isGemini3FlashModel(modelWithoutQuota);
|
|
158
|
+
const isGemini31Pro = /^gemini-3\.1-pro/i.test(baseName);
|
|
159
|
+
const isGemini35Flash = /^gemini-3\.5-flash/i.test(baseName);
|
|
160
|
+
if (isGemini31Pro && quotaPreference === "antigravity") {
|
|
161
|
+
return {
|
|
162
|
+
actualModel: getAgyGemini31ProModel(tier),
|
|
163
|
+
thinkingBudget: getAgyGemini31ProThinkingBudget(tier),
|
|
164
|
+
tier,
|
|
165
|
+
isThinkingModel: true,
|
|
166
|
+
quotaPreference,
|
|
167
|
+
explicitQuota,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (isGemini35Flash && quotaPreference === "antigravity") {
|
|
171
|
+
return {
|
|
172
|
+
actualModel: resolveGemini35FlashAntigravityModel(tier ?? "medium"),
|
|
173
|
+
thinkingBudget: getAgyGemini35FlashThinkingBudget(tier),
|
|
174
|
+
tier: tier ?? "medium",
|
|
175
|
+
isThinkingModel: true,
|
|
176
|
+
quotaPreference,
|
|
177
|
+
explicitQuota,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
let antigravityModel = modelWithoutQuota;
|
|
181
|
+
if (skipAlias) {
|
|
182
|
+
if ((isGemini3Pro || isGemini3Flash) && !tier && !isImageModel) {
|
|
183
|
+
const defaultTier = isGemini3Pro ? "low" : "medium";
|
|
184
|
+
antigravityModel = `${modelWithoutQuota}-${defaultTier}`;
|
|
185
|
+
}
|
|
186
|
+
// When tier is present, modelWithoutQuota already contains the tier suffix
|
|
187
|
+
// (e.g., "gemini-3.5-flash-high") — no modification needed
|
|
188
|
+
}
|
|
189
|
+
const actualModel = skipAlias
|
|
190
|
+
? antigravityModel
|
|
191
|
+
: MODEL_ALIASES[modelWithoutQuota] || MODEL_ALIASES[baseName] || baseName;
|
|
192
|
+
const resolvedModel = actualModel;
|
|
193
|
+
const isThinking = isThinkingCapableModel(resolvedModel);
|
|
194
|
+
// Image generation models don't support thinking - return early without thinking config
|
|
195
|
+
if (isImageModel) {
|
|
196
|
+
return {
|
|
197
|
+
actualModel: resolvedModel,
|
|
198
|
+
isThinkingModel: false,
|
|
199
|
+
isImageModel: true,
|
|
200
|
+
quotaPreference,
|
|
201
|
+
explicitQuota,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
// Check if this is a Gemini 3 model (works for both aliased and skipAlias paths)
|
|
205
|
+
const isEffectiveGemini3 = resolvedModel.toLowerCase().includes("gemini-3");
|
|
206
|
+
const lowerModelWithoutQuota = modelWithoutQuota.toLowerCase();
|
|
207
|
+
const isClaudeThinking = (resolvedModel.toLowerCase().includes("claude") && resolvedModel.toLowerCase().includes("thinking")) ||
|
|
208
|
+
(lowerModelWithoutQuota.includes("claude") && lowerModelWithoutQuota.includes("thinking")) ||
|
|
209
|
+
lowerModelWithoutQuota === "gemini-claude-sonnet-4-6";
|
|
210
|
+
if (!tier) {
|
|
211
|
+
// Gemini 3 models without explicit tier get a default thinkingLevel
|
|
212
|
+
if (isEffectiveGemini3) {
|
|
213
|
+
return {
|
|
214
|
+
actualModel: resolvedModel,
|
|
215
|
+
thinkingLevel: isGemini35Flash ? "medium" : "low",
|
|
216
|
+
isThinkingModel: true,
|
|
217
|
+
quotaPreference,
|
|
218
|
+
explicitQuota,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// agy CLI sends a compact 1024-token budget for Claude thinking models.
|
|
222
|
+
if (isClaudeThinking) {
|
|
223
|
+
return {
|
|
224
|
+
actualModel: resolvedModel,
|
|
225
|
+
thinkingBudget: 1024,
|
|
226
|
+
isThinkingModel: true,
|
|
227
|
+
quotaPreference,
|
|
228
|
+
explicitQuota,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return { actualModel: resolvedModel, isThinkingModel: isThinking, quotaPreference, explicitQuota };
|
|
232
|
+
}
|
|
233
|
+
// Gemini 3 models with tier always get thinkingLevel set
|
|
234
|
+
if (isEffectiveGemini3) {
|
|
235
|
+
return {
|
|
236
|
+
actualModel: resolvedModel,
|
|
237
|
+
thinkingLevel: tier,
|
|
238
|
+
tier,
|
|
239
|
+
isThinkingModel: true,
|
|
240
|
+
quotaPreference,
|
|
241
|
+
explicitQuota,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
if (isClaudeThinking) {
|
|
245
|
+
return {
|
|
246
|
+
actualModel: resolvedModel,
|
|
247
|
+
thinkingBudget: 1024,
|
|
248
|
+
tier,
|
|
249
|
+
isThinkingModel: true,
|
|
250
|
+
quotaPreference,
|
|
251
|
+
explicitQuota,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const budgetFamily = getBudgetFamily(resolvedModel);
|
|
255
|
+
const budgets = THINKING_TIER_BUDGETS[budgetFamily];
|
|
256
|
+
const thinkingBudget = budgets[tier];
|
|
257
|
+
return {
|
|
258
|
+
actualModel: resolvedModel,
|
|
259
|
+
thinkingBudget,
|
|
260
|
+
tier,
|
|
261
|
+
isThinkingModel: isThinking,
|
|
262
|
+
quotaPreference,
|
|
263
|
+
explicitQuota,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Gets the model family for routing decisions.
|
|
268
|
+
*/
|
|
269
|
+
export function getModelFamily(model) {
|
|
270
|
+
const lower = model.toLowerCase();
|
|
271
|
+
if (lower.includes("claude")) {
|
|
272
|
+
return "claude";
|
|
273
|
+
}
|
|
274
|
+
if (lower.includes("flash")) {
|
|
275
|
+
return "gemini-flash";
|
|
276
|
+
}
|
|
277
|
+
return "gemini-pro";
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Maps a thinking budget to Gemini 3 thinking level.
|
|
281
|
+
* ≤8192 → low, ≤16384 → medium, >16384 → high
|
|
282
|
+
*/
|
|
283
|
+
function budgetToGemini3Level(budget) {
|
|
284
|
+
if (budget <= 8192)
|
|
285
|
+
return "low";
|
|
286
|
+
if (budget <= 16384)
|
|
287
|
+
return "medium";
|
|
288
|
+
return "high";
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Resolves model name for a specific headerStyle (quota fallback support).
|
|
292
|
+
* Transforms model names when switching between gemini-cli and antigravity quotas.
|
|
293
|
+
*
|
|
294
|
+
* Issue #103: When quota fallback occurs, model names need to be transformed:
|
|
295
|
+
* - gemini-3-flash-preview (gemini-cli) → gemini-3-flash (antigravity)
|
|
296
|
+
* - gemini-3-flash (antigravity) → gemini-3-flash-preview (gemini-cli) */
|
|
297
|
+
export function resolveModelForHeaderStyle(requestedModel, headerStyle) {
|
|
298
|
+
const lower = requestedModel.toLowerCase();
|
|
299
|
+
const isGemini3 = lower.includes("gemini-3");
|
|
300
|
+
if (!isGemini3) {
|
|
301
|
+
return resolveModelWithTier(requestedModel);
|
|
302
|
+
}
|
|
303
|
+
if (headerStyle === "antigravity") {
|
|
304
|
+
let transformedModel = requestedModel
|
|
305
|
+
.replace(/-preview-customtools$/i, "")
|
|
306
|
+
.replace(/-preview$/i, "")
|
|
307
|
+
.replace(/^antigravity-/i, "");
|
|
308
|
+
const isGemini3Pro = isGemini3ProModel(transformedModel);
|
|
309
|
+
const isGemini3Flash = isGemini3FlashModel(transformedModel);
|
|
310
|
+
const hasTierSuffix = /-(minimal|low|medium|high)$/i.test(transformedModel);
|
|
311
|
+
const isImageModel = IMAGE_GENERATION_MODELS.test(transformedModel);
|
|
312
|
+
const isGemini35Flash = isGemini35FlashModel(transformedModel.replace(TIER_REGEX, ""));
|
|
313
|
+
// Don't add tier suffix to image models - they don't support thinking
|
|
314
|
+
if ((isGemini3Pro || isGemini3Flash) && !isGemini35Flash && !hasTierSuffix && !isImageModel) {
|
|
315
|
+
const defaultTier = isGemini3Pro ? "low" : "medium";
|
|
316
|
+
transformedModel = `${transformedModel}-${defaultTier}`;
|
|
317
|
+
}
|
|
318
|
+
const prefixedModel = `antigravity-${transformedModel}`;
|
|
319
|
+
return resolveModelWithTier(prefixedModel);
|
|
320
|
+
}
|
|
321
|
+
if (headerStyle === "gemini-cli") {
|
|
322
|
+
const requestedTier = extractThinkingTierFromModel(requestedModel.replace(/^antigravity-/i, ""));
|
|
323
|
+
let transformedModel = requestedModel
|
|
324
|
+
.replace(/^antigravity-/i, "")
|
|
325
|
+
.replace(/-(minimal|low|medium|high)$/i, "");
|
|
326
|
+
const hasPreviewSuffix = /-preview($|-)/i.test(transformedModel);
|
|
327
|
+
// Gemini Code Assist still exposes Gemini 3.5 Flash through the
|
|
328
|
+
// gemini-3-flash-preview bucket; retrieveUserQuota does not list a
|
|
329
|
+
// gemini-3.5-flash bucket for the gemini-cli header path.
|
|
330
|
+
const isGemini35Flash = isGemini35FlashModel(transformedModel);
|
|
331
|
+
if (isGemini35Flash) {
|
|
332
|
+
transformedModel = getGemini35FlashGeminiCliFallbackModel();
|
|
333
|
+
}
|
|
334
|
+
else if (!hasPreviewSuffix) {
|
|
335
|
+
transformedModel = `${transformedModel}-preview`;
|
|
336
|
+
}
|
|
337
|
+
const resolved = resolveModelWithTier(transformedModel, { cli_first: true });
|
|
338
|
+
return {
|
|
339
|
+
...resolved,
|
|
340
|
+
thinkingLevel: requestedTier ?? resolved.thinkingLevel,
|
|
341
|
+
tier: requestedTier ?? resolved.tier,
|
|
342
|
+
quotaPreference: "gemini-cli",
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
return resolveModelWithTier(requestedModel);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Resolves model with variant config from providerOptions.
|
|
349
|
+
* Variant config takes priority over tier suffix in model name.
|
|
350
|
+
*/
|
|
351
|
+
export function resolveModelWithVariant(requestedModel, variantConfig) {
|
|
352
|
+
const base = resolveModelWithTier(requestedModel);
|
|
353
|
+
if (!variantConfig) {
|
|
354
|
+
return base;
|
|
355
|
+
}
|
|
356
|
+
// Apply Google Search config if present
|
|
357
|
+
if (variantConfig.googleSearch) {
|
|
358
|
+
base.googleSearch = variantConfig.googleSearch;
|
|
359
|
+
base.configSource = "variant";
|
|
360
|
+
}
|
|
361
|
+
if (!variantConfig.thinkingBudget) {
|
|
362
|
+
return base;
|
|
363
|
+
}
|
|
364
|
+
const budget = variantConfig.thinkingBudget;
|
|
365
|
+
const isGemini3 = base.actualModel.toLowerCase().includes("gemini-3");
|
|
366
|
+
if (isGemini3) {
|
|
367
|
+
const level = budgetToGemini3Level(budget);
|
|
368
|
+
const requestedBase = requestedModel
|
|
369
|
+
.replace(/^antigravity-/i, "")
|
|
370
|
+
.replace(TIER_REGEX, "");
|
|
371
|
+
const isGemini35FlashAlias = isGemini35FlashModel(requestedBase) ||
|
|
372
|
+
base.actualModel === "gemini-3-flash-agent" ||
|
|
373
|
+
base.actualModel === "gemini-3.5-flash-low";
|
|
374
|
+
const isAntigravityGemini3WithTier = base.quotaPreference === "antigravity" &&
|
|
375
|
+
(isGemini3ProModel(base.actualModel) || isGemini3FlashModel(base.actualModel));
|
|
376
|
+
let actualModel = base.actualModel;
|
|
377
|
+
if (isGemini35FlashAlias) {
|
|
378
|
+
actualModel = resolveGemini35FlashAntigravityModel(level);
|
|
379
|
+
}
|
|
380
|
+
else if (isAntigravityGemini3WithTier) {
|
|
381
|
+
const baseModel = base.actualModel.replace(/-(low|medium|high)$/, "");
|
|
382
|
+
actualModel = `${baseModel}-${level}`;
|
|
383
|
+
}
|
|
384
|
+
return {
|
|
385
|
+
...base,
|
|
386
|
+
actualModel,
|
|
387
|
+
thinkingLevel: level,
|
|
388
|
+
thinkingBudget: undefined,
|
|
389
|
+
configSource: "variant",
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
return {
|
|
393
|
+
...base,
|
|
394
|
+
thinkingBudget: budget,
|
|
395
|
+
configSource: "variant",
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
//# sourceMappingURL=model-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/transform/model-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { HeaderStyle } from "../constants.ts";
|
|
2
|
+
export type ModelFamily = "claude" | "gemini-flash" | "gemini-pro";
|
|
3
|
+
export type ThinkingTier = "low" | "medium" | "high";
|
|
4
|
+
/**
|
|
5
|
+
* Context for request transformation.
|
|
6
|
+
* Contains all information needed to transform a request payload.
|
|
7
|
+
*/
|
|
8
|
+
export interface TransformContext {
|
|
9
|
+
/** The resolved project ID for the API call */
|
|
10
|
+
projectId: string;
|
|
11
|
+
/** The resolved model name (after alias resolution) */
|
|
12
|
+
model: string;
|
|
13
|
+
/** The original model name from the request */
|
|
14
|
+
requestedModel: string;
|
|
15
|
+
/** Model family for routing decisions */
|
|
16
|
+
family: ModelFamily;
|
|
17
|
+
/** Whether this is a streaming request */
|
|
18
|
+
streaming: boolean;
|
|
19
|
+
/** Unique request ID for tracking */
|
|
20
|
+
requestId: string;
|
|
21
|
+
/** Session ID for signature caching */
|
|
22
|
+
sessionId?: string;
|
|
23
|
+
/** Thinking tier if specified via model suffix */
|
|
24
|
+
thinkingTier?: ThinkingTier;
|
|
25
|
+
/** Thinking budget for Claude models (derived from tier) */
|
|
26
|
+
thinkingBudget?: number;
|
|
27
|
+
/** Thinking level for Gemini 3 models (derived from tier) */
|
|
28
|
+
thinkingLevel?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result of request transformation.
|
|
32
|
+
*/
|
|
33
|
+
export interface TransformResult {
|
|
34
|
+
/** The transformed request body as JSON string */
|
|
35
|
+
body: string;
|
|
36
|
+
/** Debug information about the transformation */
|
|
37
|
+
debugInfo: TransformDebugInfo;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Debug information from transformation.
|
|
41
|
+
*/
|
|
42
|
+
export interface TransformDebugInfo {
|
|
43
|
+
/** Which transformer was used */
|
|
44
|
+
transformer: "claude" | "gemini";
|
|
45
|
+
/** Number of tools in the request */
|
|
46
|
+
toolCount: number;
|
|
47
|
+
/** Whether tools were transformed */
|
|
48
|
+
toolsTransformed?: boolean;
|
|
49
|
+
/** Thinking tier if resolved */
|
|
50
|
+
thinkingTier?: string;
|
|
51
|
+
/** Thinking budget if set */
|
|
52
|
+
thinkingBudget?: number;
|
|
53
|
+
/** Thinking level if set (Gemini 3) */
|
|
54
|
+
thinkingLevel?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Generic request payload type.
|
|
58
|
+
* The actual structure varies between Claude and Gemini.
|
|
59
|
+
*/
|
|
60
|
+
export type RequestPayload = Record<string, unknown>;
|
|
61
|
+
/**
|
|
62
|
+
* Thinking configuration normalized from various input formats.
|
|
63
|
+
*/
|
|
64
|
+
export interface ThinkingConfig {
|
|
65
|
+
/** Numeric thinking budget (for Claude and Gemini 2.5) */
|
|
66
|
+
thinkingBudget?: number;
|
|
67
|
+
/** String thinking level (for Gemini 3: 'low', 'medium', 'high') */
|
|
68
|
+
thinkingLevel?: string;
|
|
69
|
+
/** Whether to include thinking in the response */
|
|
70
|
+
includeThoughts?: boolean;
|
|
71
|
+
/** Snake_case variant for Antigravity backend */
|
|
72
|
+
include_thoughts?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Google Search Grounding configuration.
|
|
76
|
+
*
|
|
77
|
+
* Note: The new googleSearch API for Gemini 2.0+ does not support threshold
|
|
78
|
+
* configuration. The model automatically decides when to search.
|
|
79
|
+
* The threshold field is kept for backward compatibility but is ignored.
|
|
80
|
+
*/
|
|
81
|
+
export interface GoogleSearchConfig {
|
|
82
|
+
mode?: 'auto' | 'off';
|
|
83
|
+
/** @deprecated No longer used - kept for backward compatibility */
|
|
84
|
+
threshold?: number;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Model resolution result with tier information.
|
|
88
|
+
*/
|
|
89
|
+
export interface ResolvedModel {
|
|
90
|
+
/** The actual model name for the API call */
|
|
91
|
+
actualModel: string;
|
|
92
|
+
/** Thinking level for Gemini 3 models */
|
|
93
|
+
thinkingLevel?: string;
|
|
94
|
+
/** Thinking budget for Claude/Gemini 2.5 */
|
|
95
|
+
thinkingBudget?: number;
|
|
96
|
+
/** The tier suffix that was extracted */
|
|
97
|
+
tier?: ThinkingTier;
|
|
98
|
+
/** Whether this is a thinking-capable model */
|
|
99
|
+
isThinkingModel?: boolean;
|
|
100
|
+
/** Whether this is an image generation model */
|
|
101
|
+
isImageModel?: boolean;
|
|
102
|
+
/** Quota preference - all models default to antigravity, with CLI as fallback */
|
|
103
|
+
quotaPreference?: HeaderStyle;
|
|
104
|
+
/** Whether user explicitly specified quota via suffix (vs default selection) */
|
|
105
|
+
explicitQuota?: boolean;
|
|
106
|
+
/** Source of thinking config: "variant" (providerOptions) or "tier" (model suffix) */
|
|
107
|
+
configSource?: "variant" | "tier";
|
|
108
|
+
/** Google Search configuration from variant or global config */
|
|
109
|
+
googleSearch?: GoogleSearchConfig;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transform/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,YAAY,CAAC;AAEnE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAErD;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,MAAM,EAAE,WAAW,CAAC;IACpB,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,kBAAkB,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACjC,qCAAqC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gCAAgC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kDAAkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yCAAyC;IACzC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gDAAgD;IAChD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iFAAiF;IACjF,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sFAAsF;IACtF,YAAY,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAClC,gEAAgE;IAChE,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transform/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote Antigravity version fetcher.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the Antigravity-Manager's version resolution strategy:
|
|
5
|
+
* 1. Auto-updater API (plain text with semver)
|
|
6
|
+
* 2. Changelog page scrape (first 5000 chars)
|
|
7
|
+
* 3. Hardcoded fallback in constants.ts
|
|
8
|
+
*
|
|
9
|
+
* Called once at plugin startup to ensure headers use the latest
|
|
10
|
+
* supported version, avoiding "version no longer supported" errors.
|
|
11
|
+
*
|
|
12
|
+
* @see https://github.com/lbjlaq/Antigravity-Manager (src-tauri/src/constants.rs)
|
|
13
|
+
*/
|
|
14
|
+
type VersionSource = "api" | "changelog" | "fallback";
|
|
15
|
+
export interface AntigravityVersionResolution {
|
|
16
|
+
version: string;
|
|
17
|
+
source: VersionSource;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Fetch the latest Antigravity version and update the global constant.
|
|
21
|
+
* Safe to call before logger is initialized (will silently skip logging).
|
|
22
|
+
*/
|
|
23
|
+
export declare function getAntigravityVersionResolution(): AntigravityVersionResolution;
|
|
24
|
+
export declare function initAntigravityVersion(): Promise<AntigravityVersionResolution>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,KAAK,aAAa,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;CACvB;AAyBD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,4BAA4B,CAE9E;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAiCpF"}
|