@anthonyhaussman/opencode-agy-auth 1.1.1 → 1.1.2-0.alpha.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.
Files changed (51) hide show
  1. package/dist/index.d.ts +4 -18
  2. package/dist/index.js +2009 -759
  3. package/dist/index.js.map +1 -1
  4. package/dist/src/constants.d.ts +7 -0
  5. package/dist/src/fetch.d.ts +1 -0
  6. package/dist/src/plugin/auth.d.ts +14 -0
  7. package/dist/src/plugin/cache.d.ts +28 -0
  8. package/dist/src/plugin/notify.d.ts +9 -0
  9. package/dist/src/plugin/oauth-authorize.d.ts +15 -0
  10. package/dist/src/plugin/pricing.d.ts +5 -0
  11. package/dist/src/plugin/project/context.d.ts +13 -0
  12. package/dist/src/plugin/project/index.d.ts +2 -0
  13. package/dist/src/plugin/project/types.d.ts +84 -0
  14. package/dist/src/plugin/project/utils.d.ts +35 -0
  15. package/dist/src/plugin/provider.d.ts +12 -0
  16. package/dist/src/plugin/quota-summary.d.ts +14 -0
  17. package/dist/src/plugin/quota-utils.d.ts +5 -0
  18. package/dist/src/plugin/quota.d.ts +14 -0
  19. package/dist/src/plugin/token.d.ts +2 -0
  20. package/dist/src/plugin/traffic.d.ts +47 -0
  21. package/dist/src/plugin/types.d.ts +31 -0
  22. package/dist/src/plugin.d.ts +6 -0
  23. package/dist/src/sdk/activity-request-id.d.ts +5 -0
  24. package/dist/src/sdk/agy-cli-version.d.ts +1 -0
  25. package/dist/src/sdk/cache/signature-cache.d.ts +130 -0
  26. package/dist/src/sdk/chat-logger.d.ts +8 -0
  27. package/dist/src/sdk/fetch_models.d.ts +47 -0
  28. package/dist/src/sdk/fetch_project.d.ts +9 -0
  29. package/dist/src/sdk/fetch_quota.d.ts +9 -0
  30. package/dist/src/sdk/oauth.d.ts +26 -0
  31. package/dist/src/sdk/request/identifiers.d.ts +16 -0
  32. package/dist/src/sdk/request/index.d.ts +12 -0
  33. package/dist/src/sdk/request/openai.d.ts +17 -0
  34. package/dist/src/sdk/request/prepare.d.ts +14 -0
  35. package/dist/src/sdk/request/response.d.ts +5 -0
  36. package/dist/src/sdk/request/shared.d.ts +20 -0
  37. package/dist/src/sdk/request/thinking.d.ts +129 -0
  38. package/dist/src/sdk/request/tool-mapper.d.ts +47 -0
  39. package/dist/src/sdk/request/turn-state-tracker.d.ts +21 -0
  40. package/dist/src/sdk/request-helpers/errors.d.ts +9 -0
  41. package/dist/src/sdk/request-helpers/index.d.ts +4 -0
  42. package/dist/src/sdk/request-helpers/parsing.d.ts +9 -0
  43. package/dist/src/sdk/request-helpers/thinking.d.ts +5 -0
  44. package/dist/src/sdk/request-helpers/types.d.ts +65 -0
  45. package/dist/src/sdk/retry/cooldown-store.d.ts +14 -0
  46. package/dist/src/sdk/retry/helpers.d.ts +19 -0
  47. package/dist/src/sdk/retry/index.d.ts +9 -0
  48. package/dist/src/sdk/retry/quota.d.ts +37 -0
  49. package/dist/src/sdk/terminal-hyperlink.d.ts +3 -0
  50. package/dist/src/sdk/user-agent.d.ts +5 -0
  51. package/package.json +13 -6
package/dist/index.js CHANGED
@@ -4,6 +4,104 @@ var __export = (target, all) => {
4
4
  __defProp(target, name, { get: all[name], enumerable: true });
5
5
  };
6
6
 
7
+ // src/plugin/pricing.ts
8
+ import { tmpdir, userInfo } from "os";
9
+ import { join } from "path";
10
+ import { existsSync, readFileSync, writeFileSync, statSync } from "fs";
11
+ var PRICING_API_URL = "https://models.dev/api.json";
12
+ var CACHE_FILE_NAME = "agy-pricing-cache.json";
13
+ var CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
14
+ var memoryCache = null;
15
+ function getCachePath() {
16
+ try {
17
+ return join(tmpdir(), `${CACHE_FILE_NAME}-${userInfo().uid}`);
18
+ } catch (err) {
19
+ return join(tmpdir(), CACHE_FILE_NAME);
20
+ }
21
+ }
22
+ function loadCachedPricing() {
23
+ try {
24
+ const cachePath = getCachePath();
25
+ if (!existsSync(cachePath)) return null;
26
+ const stats = statSync(cachePath);
27
+ if (Date.now() - stats.mtimeMs > CACHE_TTL_MS) {
28
+ return null;
29
+ }
30
+ const data = readFileSync(cachePath, "utf-8");
31
+ return JSON.parse(data);
32
+ } catch (err) {
33
+ return null;
34
+ }
35
+ }
36
+ function savePricingCache(data) {
37
+ try {
38
+ const cachePath = getCachePath();
39
+ writeFileSync(cachePath, JSON.stringify(data), "utf-8");
40
+ } catch (err) {
41
+ }
42
+ }
43
+ async function fetchPricing() {
44
+ if (memoryCache) {
45
+ return memoryCache;
46
+ }
47
+ const cached2 = loadCachedPricing();
48
+ if (cached2) {
49
+ memoryCache = cached2;
50
+ return cached2;
51
+ }
52
+ const controller = new AbortController();
53
+ const timeoutId = setTimeout(() => controller.abort(), 2e3);
54
+ try {
55
+ const response = await fetch(PRICING_API_URL, { signal: controller.signal });
56
+ clearTimeout(timeoutId);
57
+ if (!response.ok) {
58
+ return null;
59
+ }
60
+ const data = await response.json();
61
+ if (data) {
62
+ savePricingCache(data);
63
+ memoryCache = data;
64
+ return data;
65
+ }
66
+ } catch (err) {
67
+ clearTimeout(timeoutId);
68
+ }
69
+ return null;
70
+ }
71
+ function determineProvider(modelId) {
72
+ const lower = modelId.toLowerCase();
73
+ if (lower.startsWith("gemini-") || lower.startsWith("gemma-")) return "google";
74
+ if (lower.startsWith("claude-")) return "anthropic";
75
+ if (lower.startsWith("gpt-") || lower.startsWith("o1") || lower.startsWith("o3")) return "openai";
76
+ return null;
77
+ }
78
+ function updateStaticModelsWithPricing(staticModels) {
79
+ fetchPricing().then((pricingData) => {
80
+ if (!pricingData) return;
81
+ for (const [modelId, modelObj] of Object.entries(staticModels)) {
82
+ const provider = determineProvider(modelId);
83
+ if (!provider || !pricingData[provider]?.models) continue;
84
+ let lookupId = modelId;
85
+ if (lookupId.endsWith("-thinking") && !pricingData[provider].models[lookupId]) {
86
+ lookupId = lookupId.replace("-thinking", "");
87
+ }
88
+ const apiModel = pricingData[provider].models[lookupId];
89
+ if (apiModel && apiModel.cost) {
90
+ const apiCost = apiModel.cost;
91
+ modelObj.cost = {
92
+ input: apiCost.input ?? modelObj.cost?.input ?? 0,
93
+ output: apiCost.output ?? modelObj.cost?.output ?? 0,
94
+ cache: {
95
+ read: apiCost.cache_read ?? modelObj.cost?.cache?.read ?? 0,
96
+ write: apiCost.cache_write ?? modelObj.cost?.cache?.write ?? 0
97
+ }
98
+ };
99
+ }
100
+ }
101
+ }).catch(() => {
102
+ });
103
+ }
104
+
7
105
  // src/constants.ts
8
106
  var AGY_PROVIDER_ID = "google-agy";
9
107
  var AGY_CLIENT_ID = "1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com";
@@ -147,7 +245,7 @@ async function exchangeAgyWithVerifierInternal(code, verifier) {
147
245
  Authorization: `Bearer ${tokenPayload.access_token}`
148
246
  }
149
247
  });
150
- const userInfo = userInfoResponse.ok ? await userInfoResponse.json() : {};
248
+ const userInfo2 = userInfoResponse.ok ? await userInfoResponse.json() : {};
151
249
  const refreshToken = tokenPayload.refresh_token;
152
250
  if (!refreshToken) {
153
251
  return { type: "failed", error: "Missing refresh token in response" };
@@ -157,7 +255,7 @@ async function exchangeAgyWithVerifierInternal(code, verifier) {
157
255
  refresh: refreshToken,
158
256
  access: tokenPayload.access_token,
159
257
  expires: Date.now() + tokenPayload.expires_in * 1e3,
160
- email: userInfo.email
258
+ email: userInfo2.email
161
259
  };
162
260
  }
163
261
 
@@ -170,7 +268,7 @@ function createAgyActivityRequestId() {
170
268
  import os from "os";
171
269
 
172
270
  // src/sdk/agy-cli-version.ts
173
- var AGY_CLI_VERSION = "1.1.1";
271
+ var AGY_CLI_VERSION = "1.1.20";
174
272
 
175
273
  // src/sdk/user-agent.ts
176
274
  var cachedUserAgent = null;
@@ -418,6 +516,69 @@ function normalizeErrorEnvelope(parsed) {
418
516
  }
419
517
  return isObject(parsed) ? parsed : null;
420
518
  }
519
+ var MAX_QUOTA_RESET_WAIT_MS = 72e5;
520
+ function findResetTimeForModel(summary, model) {
521
+ if (!summary) return null;
522
+ const normalize2 = (str) => str.toLowerCase().replace(/[^a-z0-9]/g, "");
523
+ const modelNorm = model ? normalize2(model) : "";
524
+ let targetGroups = summary.groups ?? [];
525
+ if (modelNorm && targetGroups.length > 0) {
526
+ const matched = targetGroups.filter((g) => {
527
+ const gName = normalize2(g.displayName ?? "");
528
+ return gName.includes(modelNorm) || modelNorm.includes(gName);
529
+ });
530
+ if (matched.length > 0) {
531
+ targetGroups = matched;
532
+ }
533
+ }
534
+ const allBuckets = [];
535
+ for (const group of targetGroups) {
536
+ if (group.buckets) {
537
+ allBuckets.push(...group.buckets);
538
+ }
539
+ }
540
+ if (allBuckets.length === 0 && summary.buckets) {
541
+ allBuckets.push(...summary.buckets);
542
+ }
543
+ const now = Date.now();
544
+ const validResetBuckets = allBuckets.filter((b) => {
545
+ if (!b.resetTime) return false;
546
+ const t = new Date(b.resetTime).getTime();
547
+ return !Number.isNaN(t) && t > now;
548
+ });
549
+ if (validResetBuckets.length === 0) {
550
+ return null;
551
+ }
552
+ const exhaustedFiveHour = validResetBuckets.find(
553
+ (b) => (b.remainingFraction === 0 || b.disabled) && b.window?.toUpperCase() === "FIVE_HOUR"
554
+ );
555
+ if (exhaustedFiveHour?.resetTime) return exhaustedFiveHour.resetTime;
556
+ const exhaustedAny = validResetBuckets.find((b) => b.remainingFraction === 0 || b.disabled);
557
+ if (exhaustedAny?.resetTime) return exhaustedAny.resetTime;
558
+ const fiveHour = validResetBuckets.find((b) => b.window?.toUpperCase() === "FIVE_HOUR");
559
+ if (fiveHour?.resetTime) return fiveHour.resetTime;
560
+ validResetBuckets.sort(
561
+ (a, b) => new Date(a.resetTime).getTime() - new Date(b.resetTime).getTime()
562
+ );
563
+ return validResetBuckets[0]?.resetTime ?? null;
564
+ }
565
+ async function resolveQuotaResetDelay(accessToken, projectId, model, userAgentModel) {
566
+ try {
567
+ const summary = await retrieveUserQuotaSummary(accessToken, projectId, userAgentModel);
568
+ if (!summary) return null;
569
+ const resetTime = findResetTimeForModel(summary, model);
570
+ if (!resetTime) return null;
571
+ const resetTimestamp = new Date(resetTime).getTime();
572
+ if (Number.isNaN(resetTimestamp)) return null;
573
+ const waitMs = resetTimestamp - Date.now() + 1e3;
574
+ if (waitMs <= 0 || waitMs > MAX_QUOTA_RESET_WAIT_MS) {
575
+ return null;
576
+ }
577
+ return { waitMs, resetTime };
578
+ } catch {
579
+ return null;
580
+ }
581
+ }
421
582
 
422
583
  // src/sdk/retry/helpers.ts
423
584
  var DEFAULT_MAX_ATTEMPTS = 3;
@@ -559,29 +720,29 @@ function clampDelay(delayMs) {
559
720
  }
560
721
 
561
722
  // src/sdk/retry/cooldown-store.ts
562
- import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync, unlinkSync } from "fs";
563
- import { join, dirname } from "path";
564
- import { homedir, tmpdir } from "os";
723
+ import { existsSync as existsSync2, mkdirSync, readFileSync as readFileSync2, writeFileSync as writeFileSync2, renameSync, unlinkSync } from "fs";
724
+ import { join as join2, dirname } from "path";
725
+ import { homedir, tmpdir as tmpdir2 } from "os";
565
726
  var WRITE_THROTTLE_MS = 5e3;
566
727
  function getConfigDir() {
567
728
  const platform2 = process.platform;
568
729
  if (platform2 === "win32") {
569
- return join(process.env.APPDATA || join(homedir(), "AppData", "Roaming"), "opencode");
730
+ return join2(process.env.APPDATA || join2(homedir(), "AppData", "Roaming"), "opencode");
570
731
  }
571
- const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
572
- return join(xdgConfig, "opencode");
732
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join2(homedir(), ".config");
733
+ return join2(xdgConfig, "opencode");
573
734
  }
574
735
  function getCooldownFilePath() {
575
- return join(getConfigDir(), "antigravity-retry-cooldowns.json");
736
+ return join2(getConfigDir(), "antigravity-retry-cooldowns.json");
576
737
  }
577
738
  function loadCooldowns() {
578
739
  const result = /* @__PURE__ */ new Map();
579
740
  try {
580
741
  const filePath = getCooldownFilePath();
581
- if (!existsSync(filePath)) {
742
+ if (!existsSync2(filePath)) {
582
743
  return result;
583
744
  }
584
- const content = readFileSync(filePath, "utf-8");
745
+ const content = readFileSync2(filePath, "utf-8");
585
746
  const data = JSON.parse(content);
586
747
  if (data.version !== "1.0") {
587
748
  return result;
@@ -600,7 +761,7 @@ function saveCooldowns(entries) {
600
761
  try {
601
762
  const filePath = getCooldownFilePath();
602
763
  const dir = dirname(filePath);
603
- if (!existsSync(dir)) {
764
+ if (!existsSync2(dir)) {
604
765
  mkdirSync(dir, { recursive: true });
605
766
  }
606
767
  const now = Date.now();
@@ -615,12 +776,12 @@ function saveCooldowns(entries) {
615
776
  entries: serializable,
616
777
  updatedAt: now
617
778
  };
618
- const tmpPath = join(tmpdir(), `antigravity-cooldowns-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
619
- writeFileSync(tmpPath, JSON.stringify(data), "utf-8");
779
+ const tmpPath = join2(tmpdir2(), `antigravity-cooldowns-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
780
+ writeFileSync2(tmpPath, JSON.stringify(data), "utf-8");
620
781
  try {
621
782
  renameSync(tmpPath, filePath);
622
783
  } catch {
623
- writeFileSync(filePath, readFileSync(tmpPath));
784
+ writeFileSync2(filePath, readFileSync2(tmpPath));
624
785
  try {
625
786
  unlinkSync(tmpPath);
626
787
  } catch {
@@ -714,6 +875,7 @@ async function fetchWithRetry(input, init) {
714
875
  const throttleKey = buildRetryThrottleKey(input, retryInit);
715
876
  await waitForRetryCooldown(throttleKey, retryInit.signal);
716
877
  let attempt = 1;
878
+ let hasRetriedQuotaReset = false;
717
879
  const url2 = readRequestUrl(input);
718
880
  while (attempt <= DEFAULT_MAX_ATTEMPTS) {
719
881
  let response;
@@ -739,6 +901,25 @@ async function fetchWithRetry(input, init) {
739
901
  if (quotaContext.reason === "MODEL_CAPACITY_EXHAUSTED") {
740
902
  const cooldownMs = quotaContext.retryDelayMs ?? MODEL_CAPACITY_COOLDOWN_MS;
741
903
  setRetryCooldown(throttleKey, cooldownMs);
904
+ return response;
905
+ }
906
+ if (quotaContext.reason === "QUOTA_EXHAUSTED" && !hasRetriedQuotaReset && !retryInit.signal?.aborted) {
907
+ const body = typeof retryInit.body === "string" ? safeParseBody(retryInit.body) : null;
908
+ const project = readString(body?.project);
909
+ const model = readString(body?.model);
910
+ const token = extractAuthToken(retryInit.headers);
911
+ if (token && project) {
912
+ const resetInfo = await resolveQuotaResetDelay(token, project, model);
913
+ if (resetInfo && resetInfo.waitMs > 0 && resetInfo.waitMs <= MAX_QUOTA_RESET_WAIT_MS) {
914
+ hasRetriedQuotaReset = true;
915
+ setRetryCooldown(throttleKey, resetInfo.waitMs);
916
+ await wait(resetInfo.waitMs);
917
+ if (retryInit.signal?.aborted) {
918
+ return response;
919
+ }
920
+ continue;
921
+ }
922
+ }
742
923
  }
743
924
  return response;
744
925
  }
@@ -824,6 +1005,14 @@ function safeParseBody(body) {
824
1005
  function readString(value) {
825
1006
  return typeof value === "string" && value.trim() ? value : void 0;
826
1007
  }
1008
+ function extractAuthToken(headers) {
1009
+ if (!headers) return void 0;
1010
+ const h = new Headers(headers);
1011
+ const auth = h.get("authorization") || h.get("Authorization");
1012
+ if (!auth) return void 0;
1013
+ const match = auth.match(/^Bearer\s+(.+)$/i);
1014
+ return match?.[1]?.trim() || auth.trim();
1015
+ }
827
1016
 
828
1017
  // src/sdk/terminal-hyperlink.ts
829
1018
  var OSC8_OPEN = "\x1B]8;;";
@@ -1390,7 +1579,7 @@ function createOAuthAuthorizeMethod(options) {
1390
1579
  }
1391
1580
  return {
1392
1581
  url: authorization.url,
1393
- instructions: "Please complete Google account authorization in your browser. After authorization, the page will redirect to https://antigravity.google/oauth-callback?code=... . Please copy the full redirect URL from your browser address bar, or just the code parameter value, and paste it into the input box below:",
1582
+ instructions: isHeadless ? "Headless/SSH environment detected. Browser auto-open skipped. Please manually open the following URL in a browser on your local machine to authorize:\n\n" + authorization.url + "\n\nAfter authorization, the page will redirect to https://antigravity.google/oauth-callback?code=... . Copy the full redirect URL from your browser address bar, or just the code parameter value, and paste it into the input box below.\n\nNote: If you are not in a headless environment, unset OPENCODE_HEADLESS or run without SSH to enable browser auto-open." : "Please complete Google account authorization in your browser. After authorization, the page will redirect to https://antigravity.google/oauth-callback?code=... . Please copy the full redirect URL from your browser address bar, or just the code parameter value, and paste it into the input box below:",
1394
1583
  method: "code",
1395
1584
  callback: async (callbackUrl) => {
1396
1585
  try {
@@ -1458,33 +1647,33 @@ function openBrowserUrl(url2) {
1458
1647
  import { createHash } from "crypto";
1459
1648
 
1460
1649
  // src/sdk/cache/signature-cache.ts
1461
- import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, writeFileSync as writeFileSync2, renameSync as renameSync2, unlinkSync as unlinkSync2, appendFileSync } from "fs";
1462
- import { join as join2, dirname as dirname2 } from "path";
1463
- import { homedir as homedir2, tmpdir as tmpdir2 } from "os";
1650
+ import { existsSync as existsSync3, mkdirSync as mkdirSync2, readFileSync as readFileSync3, writeFileSync as writeFileSync3, renameSync as renameSync2, unlinkSync as unlinkSync2, appendFileSync } from "fs";
1651
+ import { join as join3, dirname as dirname2 } from "path";
1652
+ import { homedir as homedir2, tmpdir as tmpdir3 } from "os";
1464
1653
  function getConfigDir2() {
1465
1654
  const platform2 = process.platform;
1466
1655
  if (platform2 === "win32") {
1467
- return join2(process.env.APPDATA || join2(homedir2(), "AppData", "Roaming"), "opencode");
1656
+ return join3(process.env.APPDATA || join3(homedir2(), "AppData", "Roaming"), "opencode");
1468
1657
  }
1469
- const xdgConfig = process.env.XDG_CONFIG_HOME || join2(homedir2(), ".config");
1470
- return join2(xdgConfig, "opencode");
1658
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join3(homedir2(), ".config");
1659
+ return join3(xdgConfig, "opencode");
1471
1660
  }
1472
1661
  function getCacheFilePath() {
1473
- return join2(getConfigDir2(), "antigravity-signature-cache.json");
1662
+ return join3(getConfigDir2(), "antigravity-signature-cache.json");
1474
1663
  }
1475
1664
  function ensureGitignoreSync(configDir) {
1476
- const gitignorePath = join2(configDir, ".gitignore");
1665
+ const gitignorePath = join3(configDir, ".gitignore");
1477
1666
  const entries = [".gitignore", "antigravity-signature-cache.json"];
1478
1667
  try {
1479
1668
  let content = "";
1480
- if (existsSync2(gitignorePath)) {
1481
- content = readFileSync2(gitignorePath, "utf-8");
1669
+ if (existsSync3(gitignorePath)) {
1670
+ content = readFileSync3(gitignorePath, "utf-8");
1482
1671
  }
1483
1672
  const existingLines = content.split("\n").map((line) => line.trim());
1484
1673
  const missing = entries.filter((e) => !existingLines.includes(e));
1485
1674
  if (missing.length === 0) return;
1486
1675
  if (content === "") {
1487
- writeFileSync2(gitignorePath, missing.join("\n") + "\n", "utf-8");
1676
+ writeFileSync3(gitignorePath, missing.join("\n") + "\n", "utf-8");
1488
1677
  } else {
1489
1678
  const suffix = content.endsWith("\n") ? "" : "\n";
1490
1679
  appendFileSync(gitignorePath, suffix + missing.join("\n") + "\n", "utf-8");
@@ -1660,10 +1849,10 @@ var SignatureCache = class {
1660
1849
  */
1661
1850
  loadFromDisk() {
1662
1851
  try {
1663
- if (!existsSync2(this.cacheFilePath)) {
1852
+ if (!existsSync3(this.cacheFilePath)) {
1664
1853
  return;
1665
1854
  }
1666
- const content = readFileSync2(this.cacheFilePath, "utf-8");
1855
+ const content = readFileSync3(this.cacheFilePath, "utf-8");
1667
1856
  const data = JSON.parse(content);
1668
1857
  if (data.version !== "1.0") {
1669
1858
  return;
@@ -1691,15 +1880,15 @@ var SignatureCache = class {
1691
1880
  saveToDisk() {
1692
1881
  try {
1693
1882
  const dir = dirname2(this.cacheFilePath);
1694
- if (!existsSync2(dir)) {
1883
+ if (!existsSync3(dir)) {
1695
1884
  mkdirSync2(dir, { recursive: true });
1696
1885
  }
1697
1886
  ensureGitignoreSync(dir);
1698
1887
  const now = Date.now();
1699
1888
  let existingEntries = {};
1700
- if (existsSync2(this.cacheFilePath)) {
1889
+ if (existsSync3(this.cacheFilePath)) {
1701
1890
  try {
1702
- const content = readFileSync2(this.cacheFilePath, "utf-8");
1891
+ const content = readFileSync3(this.cacheFilePath, "utf-8");
1703
1892
  const data = JSON.parse(content);
1704
1893
  existingEntries = data.entries || {};
1705
1894
  } catch {
@@ -1735,12 +1924,12 @@ var SignatureCache = class {
1735
1924
  last_write: now
1736
1925
  }
1737
1926
  };
1738
- const tmpPath = join2(tmpdir2(), `antigravity-cache-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
1739
- writeFileSync2(tmpPath, JSON.stringify(cacheData, null, 2), "utf-8");
1927
+ const tmpPath = join3(tmpdir3(), `antigravity-cache-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
1928
+ writeFileSync3(tmpPath, JSON.stringify(cacheData, null, 2), "utf-8");
1740
1929
  try {
1741
1930
  renameSync2(tmpPath, this.cacheFilePath);
1742
1931
  } catch {
1743
- writeFileSync2(this.cacheFilePath, readFileSync2(tmpPath));
1932
+ writeFileSync3(this.cacheFilePath, readFileSync3(tmpPath));
1744
1933
  try {
1745
1934
  unlinkSync2(tmpPath);
1746
1935
  } catch {
@@ -1894,9 +2083,9 @@ function getLatestSignature(sessionId) {
1894
2083
  }
1895
2084
 
1896
2085
  // src/sdk/request/turn-state-tracker.ts
1897
- import { existsSync as existsSync3, mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync3, renameSync as renameSync3, unlinkSync as unlinkSync3 } from "fs";
1898
- import { join as join3, dirname as dirname3 } from "path";
1899
- import { homedir as homedir3, tmpdir as tmpdir3 } from "os";
2086
+ import { existsSync as existsSync4, mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync4, renameSync as renameSync3, unlinkSync as unlinkSync3 } from "fs";
2087
+ import { join as join4, dirname as dirname3 } from "path";
2088
+ import { homedir as homedir3, tmpdir as tmpdir4 } from "os";
1900
2089
 
1901
2090
  // src/sdk/request/thinking.ts
1902
2091
  import { createHash as createHash2 } from "crypto";
@@ -2319,22 +2508,22 @@ var WRITE_THROTTLE_MS2 = 5e3;
2319
2508
  function getConfigDir3() {
2320
2509
  const platform2 = process.platform;
2321
2510
  if (platform2 === "win32") {
2322
- return join3(process.env.APPDATA || join3(homedir3(), "AppData", "Roaming"), "opencode");
2511
+ return join4(process.env.APPDATA || join4(homedir3(), "AppData", "Roaming"), "opencode");
2323
2512
  }
2324
- const xdgConfig = process.env.XDG_CONFIG_HOME || join3(homedir3(), ".config");
2325
- return join3(xdgConfig, "opencode");
2513
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join4(homedir3(), ".config");
2514
+ return join4(xdgConfig, "opencode");
2326
2515
  }
2327
2516
  function getTurnStateFilePath() {
2328
- return join3(getConfigDir3(), "antigravity-turn-states.json");
2517
+ return join4(getConfigDir3(), "antigravity-turn-states.json");
2329
2518
  }
2330
2519
  function loadTurnStatesFromDisk() {
2331
2520
  const result = /* @__PURE__ */ new Map();
2332
2521
  try {
2333
2522
  const filePath = getTurnStateFilePath();
2334
- if (!existsSync3(filePath)) {
2523
+ if (!existsSync4(filePath)) {
2335
2524
  return result;
2336
2525
  }
2337
- const content = readFileSync3(filePath, "utf-8");
2526
+ const content = readFileSync4(filePath, "utf-8");
2338
2527
  const data = JSON.parse(content);
2339
2528
  if (data.version !== "1.0") {
2340
2529
  return result;
@@ -2354,7 +2543,7 @@ function saveTurnStatesToDisk(entries) {
2354
2543
  try {
2355
2544
  const filePath = getTurnStateFilePath();
2356
2545
  const dir = dirname3(filePath);
2357
- if (!existsSync3(dir)) {
2546
+ if (!existsSync4(dir)) {
2358
2547
  mkdirSync3(dir, { recursive: true });
2359
2548
  }
2360
2549
  const now = Date.now();
@@ -2370,12 +2559,12 @@ function saveTurnStatesToDisk(entries) {
2370
2559
  entries: serializable,
2371
2560
  updatedAt: now
2372
2561
  };
2373
- const tmpPath = join3(tmpdir3(), `antigravity-turn-states-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
2374
- writeFileSync3(tmpPath, JSON.stringify(data), "utf-8");
2562
+ const tmpPath = join4(tmpdir4(), `antigravity-turn-states-${Date.now()}-${Math.random().toString(36).slice(2)}.tmp`);
2563
+ writeFileSync4(tmpPath, JSON.stringify(data), "utf-8");
2375
2564
  try {
2376
2565
  renameSync3(tmpPath, filePath);
2377
2566
  } catch {
2378
- writeFileSync3(filePath, readFileSync3(tmpPath));
2567
+ writeFileSync4(filePath, readFileSync4(tmpPath));
2379
2568
  try {
2380
2569
  unlinkSync3(tmpPath);
2381
2570
  } catch {
@@ -15811,717 +16000,1504 @@ import { randomUUID as randomUUID3 } from "crypto";
15811
16000
 
15812
16001
  // models.json
15813
16002
  var models_default = {
16003
+ agentModelSorts: [
16004
+ {
16005
+ displayName: "Recommended",
16006
+ groups: [
16007
+ {
16008
+ modelIds: [
16009
+ "gemini-3.7-flash-high",
16010
+ "gemini-3.7-flash-medium",
16011
+ "gemini-3.7-flash-low",
16012
+ "gemini-3.6-flash-high",
16013
+ "gemini-3.6-flash-medium",
16014
+ "gemini-3.6-flash-low",
16015
+ "gemini-3-flash-agent",
16016
+ "gemini-3.5-flash-low",
16017
+ "gemini-3.5-flash-extra-low",
16018
+ "gemini-pro-agent",
16019
+ "gemini-3.1-pro-low",
16020
+ "claude-sonnet-4-6",
16021
+ "claude-opus-4-6-thinking",
16022
+ "gpt-oss-120b-medium"
16023
+ ]
16024
+ }
16025
+ ]
16026
+ }
16027
+ ],
16028
+ audioTranscriptionModelIds: [
16029
+ "models/proactive-observer-v10"
16030
+ ],
16031
+ commandModelIds: [
16032
+ "gemini-3-flash"
16033
+ ],
16034
+ commitMessageModelIds: [
16035
+ "gemini-3.1-flash-lite"
16036
+ ],
16037
+ defaultAgentModelId: "gemini-3.7-flash-high",
16038
+ deprecatedModelIds: {
16039
+ "gemini-3.1-pro-high": {
16040
+ newModelEnum: "MODEL_PLACEHOLDER_M16",
16041
+ newModelId: "gemini-pro-agent",
16042
+ oldModelEnum: "MODEL_PLACEHOLDER_M37"
16043
+ }
16044
+ },
16045
+ experimentIds: [
16046
+ 106581054,
16047
+ 105979552,
16048
+ 105979574,
16049
+ 106015333,
16050
+ 106568772,
16051
+ 105867471,
16052
+ 106548982,
16053
+ 106123599,
16054
+ 106121401,
16055
+ 106100625,
16056
+ 106143956,
16057
+ 105879567,
16058
+ 105856899,
16059
+ 106312323,
16060
+ 106064030,
16061
+ 106567313,
16062
+ 106396310,
16063
+ 106470335,
16064
+ 106106760,
16065
+ 106021688,
16066
+ 105887299,
16067
+ 106428370,
16068
+ 106283618,
16069
+ 106278607,
16070
+ 106538964,
16071
+ 106512082,
16072
+ 106380926,
16073
+ 106281951,
16074
+ 106264532,
16075
+ 106044947,
16076
+ 106032303,
16077
+ 106228452,
16078
+ 106121607,
16079
+ 105979531,
16080
+ 105979553,
16081
+ 106015328,
16082
+ 106568390,
16083
+ 105867469,
16084
+ 106123597,
16085
+ 106121399,
16086
+ 106100654,
16087
+ 106064028,
16088
+ 106567309,
16089
+ 106396304,
16090
+ 106470331,
16091
+ 105906495,
16092
+ 106283614,
16093
+ 106038164,
16094
+ 106032301,
16095
+ 106121604
16096
+ ],
16097
+ imageGenerationModelIds: [
16098
+ "gemini-3.1-flash-image"
16099
+ ],
15814
16100
  models: {
15815
- tab_jump_flash_lite_preview: {
16101
+ chat_20706: {
16102
+ addCursorToFindReplaceTarget: true,
16103
+ apiProvider: "API_PROVIDER_INTERNAL",
16104
+ isInternal: true,
15816
16105
  maxTokens: 16384,
15817
- maxOutputTokens: 4096,
15818
- tokenizerType: "LLAMA_WITH_SPECIAL",
16106
+ model: "MODEL_CHAT_20706",
16107
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16108
+ promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
15819
16109
  quotaInfo: {
15820
16110
  remainingFraction: 1
15821
16111
  },
15822
- model: "MODEL_PLACEHOLDER_M28",
15823
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
15824
- modelProvider: "MODEL_PROVIDER_GOOGLE",
16112
+ requiresLeadInGeneration: true,
15825
16113
  supportsCumulativeContext: true,
15826
- tabJumpPrintLineRange: true,
15827
16114
  supportsEstimateTokenCounter: true,
15828
- addCursorToFindReplaceTarget: true,
15829
- toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
15830
- requiresLeadInGeneration: true,
15831
- requiresNoXmlToolExamples: true
16115
+ tabJumpPrintLineRange: true,
16116
+ toolFormatterType: "TOOL_FORMATTER_TYPE_XML"
15832
16117
  },
15833
- "gemini-3.1-pro-high": {
15834
- displayName: "Gemini 3.1 Pro (High)",
15835
- supportsImages: true,
15836
- supportsThinking: true,
15837
- thinkingBudget: 10001,
15838
- minThinkingBudget: 128,
15839
- recommended: true,
15840
- maxTokens: 1048576,
15841
- maxOutputTokens: 65535,
15842
- tokenizerType: "LLAMA_WITH_SPECIAL",
15843
- quotaInfo: {
15844
- remainingFraction: 1,
15845
- resetTime: "2026-05-29T18:30:05Z"
15846
- },
15847
- model: "MODEL_PLACEHOLDER_M37",
15848
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16118
+ chat_23310: {
16119
+ apiProvider: "API_PROVIDER_INTERNAL",
16120
+ isInternal: true,
16121
+ maxTokens: 32768,
16122
+ model: "MODEL_CHAT_23310",
15849
16123
  modelProvider: "MODEL_PROVIDER_GOOGLE",
15850
- supportsVideo: true,
15851
- tagTitle: "New",
15852
- supportedMimeTypes: {
15853
- "audio/webm;codecs=opus": true,
15854
- "application/x-python-code": true,
15855
- "text/xml": true,
15856
- "text/x-python": true,
15857
- "text/html": true,
15858
- "application/x-ipynb+json": true,
15859
- "video/text/timestamp": true,
15860
- "text/markdown": true,
15861
- "text/x-python-script": true,
15862
- "video/jpeg2000": true,
15863
- "image/jpeg": true,
15864
- "image/png": true,
15865
- "image/heic": true,
15866
- "text/plain": true,
15867
- "application/x-javascript": true,
15868
- "application/json": true,
15869
- "application/pdf": true,
15870
- "text/javascript": true,
15871
- "image/webp": true,
15872
- "application/x-typescript": true,
15873
- "text/x-typescript": true,
15874
- "text/rtf": true,
15875
- "video/webm": true,
15876
- "video/audio/wav": true,
15877
- "video/audio/s16le": true,
15878
- "text/csv": true,
15879
- "video/mp4": true,
15880
- "video/videoframe/jpeg2000": true,
15881
- "image/heif": true,
15882
- "text/css": true,
15883
- "application/rtf": true
15884
- },
15885
- modelExperiments: {
15886
- experiments: {
15887
- "cascade-include-ephemeral-message": {
15888
- stringValue: '{\n "enabled": true,\n "disabledHeuristics": ["running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
15889
- },
15890
- template__system_prompts__communication_style: {
15891
- stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\nCRITICAL INSTRUCTION 1: ...\\nCRITICAL INSTRUCTION 2: ...'."
15892
- },
15893
- template__system_prompts__identity: {
15894
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
15895
- },
15896
- template__system_prompts__planning_more_artifacts: {
15897
- stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
15898
- },
15899
- CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
15900
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
15901
- }
15902
- }
15903
- }
15904
- },
15905
- "gemini-2.5-flash": {
15906
- displayName: "Gemini 3.1 Flash Lite",
15907
- maxTokens: 1048576,
15908
- maxOutputTokens: 65535,
15909
- tokenizerType: "LLAMA_WITH_SPECIAL",
16124
+ promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
15910
16125
  quotaInfo: {
15911
- remainingFraction: 1,
15912
- resetTime: "2026-05-29T18:30:05Z"
16126
+ remainingFraction: 1
15913
16127
  },
15914
- model: "MODEL_GOOGLE_GEMINI_2_5_FLASH",
15915
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
15916
- modelProvider: "MODEL_PROVIDER_GOOGLE",
15917
- modelExperiments: {
15918
- experiments: {
15919
- CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
15920
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
15921
- }
15922
- }
15923
- }
16128
+ requiresLeadInGeneration: true,
16129
+ supportsCumulativeContext: true,
16130
+ supportsEstimateTokenCounter: true,
16131
+ toolFormatterType: "TOOL_FORMATTER_TYPE_XML"
15924
16132
  },
15925
16133
  "claude-opus-4-6-thinking": {
16134
+ apiProvider: "API_PROVIDER_ANTHROPIC_VERTEX",
15926
16135
  displayName: "Claude Opus 4.6 (Thinking)",
15927
- supportsImages: true,
15928
- supportsThinking: true,
15929
- thinkingBudget: 1024,
15930
- recommended: true,
15931
- maxTokens: 25e4,
15932
16136
  maxOutputTokens: 64e3,
15933
- tokenizerType: "LLAMA_WITH_SPECIAL",
15934
- quotaInfo: {
15935
- remainingFraction: 0.6,
15936
- resetTime: "2026-05-29T19:43:59Z"
15937
- },
16137
+ maxTokens: 25e4,
15938
16138
  model: "MODEL_PLACEHOLDER_M26",
15939
- apiProvider: "API_PROVIDER_ANTHROPIC_VERTEX",
15940
- modelProvider: "MODEL_PROVIDER_ANTHROPIC",
15941
- supportedMimeTypes: {
15942
- "image/webp": true,
15943
- "video/jpeg2000": true,
15944
- "video/videoframe/jpeg2000": true,
15945
- "image/heic": true,
15946
- "image/heif": true,
15947
- "image/jpeg": true,
15948
- "image/png": true
15949
- },
15950
16139
  modelExperiments: {
15951
16140
  experiments: {
15952
16141
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
15953
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_UNSPECIFIED",\n "max_token_limit": "160000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16142
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_UNSPECIFIED",\n "max_token_limit": "160000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
15954
16143
  },
15955
- template__system_prompts__planning_more_artifacts: {
16144
+ template__system_prompts__planning_mode_artifacts: {
15956
16145
  stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
15957
16146
  }
15958
16147
  }
15959
16148
  },
15960
- vertexModelId: "claude-opus-4-6@default"
15961
- },
15962
- "gemini-2.5-flash-thinking": {
15963
- displayName: "Gemini 3.1 Flash Lite",
15964
- maxTokens: 1048576,
15965
- maxOutputTokens: 65535,
15966
- tokenizerType: "LLAMA_WITH_SPECIAL",
16149
+ modelProvider: "MODEL_PROVIDER_ANTHROPIC",
15967
16150
  quotaInfo: {
15968
16151
  remainingFraction: 1,
15969
- resetTime: "2026-05-29T18:30:05Z"
16152
+ resetTime: "2026-08-25T09:18:20Z"
15970
16153
  },
15971
- model: "MODEL_GOOGLE_GEMINI_2_5_FLASH_THINKING",
15972
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
15973
- modelProvider: "MODEL_PROVIDER_GOOGLE",
16154
+ recommended: true,
16155
+ supportedMimeTypes: {
16156
+ "image/heic": true,
16157
+ "image/heif": true,
16158
+ "image/jpeg": true,
16159
+ "image/png": true,
16160
+ "image/webp": true,
16161
+ "video/jpeg2000": true,
16162
+ "video/videoframe/jpeg2000": true
16163
+ },
16164
+ supportsImages: true,
16165
+ supportsThinking: true,
16166
+ thinkingBudget: 1024,
16167
+ vertexModelId: "claude-opus-4-6@default"
16168
+ },
16169
+ "claude-sonnet-4-6": {
16170
+ apiProvider: "API_PROVIDER_ANTHROPIC_VERTEX",
16171
+ displayName: "Claude Sonnet 4.6 (Thinking)",
16172
+ maxOutputTokens: 64e3,
16173
+ maxTokens: 25e4,
16174
+ model: "MODEL_PLACEHOLDER_M35",
15974
16175
  modelExperiments: {
15975
16176
  experiments: {
15976
16177
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
15977
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16178
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_UNSPECIFIED",\n "max_token_limit": "160000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16179
+ },
16180
+ template__system_prompts__planning_mode_artifacts: {
16181
+ stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
15978
16182
  }
15979
16183
  }
15980
- }
15981
- },
15982
- "gemini-2.5-pro": {
15983
- displayName: "Gemini 2.5 Pro",
15984
- supportsImages: true,
15985
- supportsThinking: true,
15986
- thinkingBudget: 1024,
15987
- minThinkingBudget: 128,
15988
- recommended: true,
15989
- maxTokens: 1048576,
15990
- maxOutputTokens: 65535,
15991
- tokenizerType: "LLAMA_WITH_SPECIAL",
16184
+ },
16185
+ modelProvider: "MODEL_PROVIDER_ANTHROPIC",
15992
16186
  quotaInfo: {
15993
16187
  remainingFraction: 1,
15994
- resetTime: "2026-05-29T18:30:05Z"
16188
+ resetTime: "2026-08-25T09:18:20Z"
15995
16189
  },
15996
- model: "MODEL_GOOGLE_GEMINI_2_5_PRO",
15997
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
15998
- modelProvider: "MODEL_PROVIDER_GOOGLE",
16190
+ recommended: true,
15999
16191
  supportedMimeTypes: {
16000
- "video/audio/wav": true,
16001
16192
  "image/heic": true,
16002
- "text/html": true,
16003
- "application/x-python-code": true,
16004
16193
  "image/heif": true,
16005
- "text/xml": true,
16194
+ "image/jpeg": true,
16195
+ "image/png": true,
16006
16196
  "image/webp": true,
16007
16197
  "video/jpeg2000": true,
16008
- "application/pdf": true,
16009
- "text/csv": true,
16010
- "image/jpeg": true,
16011
- "text/markdown": true,
16012
- "text/css": true,
16013
- "audio/webm;codecs=opus": true,
16014
- "application/json": true,
16015
- "text/x-python-script": true,
16016
- "video/audio/s16le": true,
16017
- "text/javascript": true,
16018
- "text/x-typescript": true,
16019
- "text/plain": true,
16020
- "application/x-typescript": true,
16021
- "application/x-ipynb+json": true,
16022
- "text/rtf": true,
16023
- "video/text/timestamp": true,
16024
- "video/webm": true,
16025
- "text/x-python": true,
16026
- "video/videoframe/jpeg2000": true,
16027
- "application/x-javascript": true,
16028
- "application/rtf": true,
16029
- "video/mp4": true,
16030
- "image/png": true
16198
+ "video/videoframe/jpeg2000": true
16031
16199
  },
16032
- requiresImageOutputOutsideFunctionResponses: true,
16200
+ supportsImages: true,
16201
+ supportsThinking: true,
16202
+ thinkingBudget: 1024,
16203
+ vertexModelId: "claude-sonnet-4-6@default"
16204
+ },
16205
+ "gemini-2.5-flash": {
16206
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16207
+ displayName: "Gemini 3.1 Flash Lite",
16208
+ maxOutputTokens: 65535,
16209
+ maxTokens: 1048576,
16210
+ model: "MODEL_GOOGLE_GEMINI_2_5_FLASH",
16033
16211
  modelExperiments: {
16034
16212
  experiments: {
16035
16213
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16036
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16214
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16037
16215
  }
16038
16216
  }
16217
+ },
16218
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16219
+ quotaInfo: {
16220
+ remainingFraction: 0.9598632,
16221
+ resetTime: "2026-08-25T09:13:21Z"
16039
16222
  }
16040
16223
  },
16041
- "gemini-3.1-flash-image": {
16042
- displayName: "Gemini 3.1 Flash Image",
16043
- tokenizerType: "LLAMA_WITH_SPECIAL",
16044
- quotaInfo: {
16045
- remainingFraction: 1,
16046
- resetTime: "2026-05-29T18:30:05Z"
16047
- },
16048
- model: "MODEL_PLACEHOLDER_M21",
16224
+ "gemini-2.5-flash-lite": {
16049
16225
  apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16050
- modelProvider: "MODEL_PROVIDER_GOOGLE"
16051
- },
16052
- "gemini-pro-agent": {
16053
- displayName: "Gemini 3.1 Pro (High)",
16054
- supportsImages: true,
16055
- supportsThinking: true,
16056
- thinkingBudget: 10001,
16057
- minThinkingBudget: 128,
16058
- recommended: true,
16059
- maxTokens: 1048576,
16226
+ displayName: "Gemini 3.1 Flash Lite",
16060
16227
  maxOutputTokens: 65535,
16061
- tokenizerType: "LLAMA_WITH_SPECIAL",
16228
+ maxTokens: 1048576,
16229
+ model: "MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE",
16230
+ modelExperiments: {
16231
+ experiments: {
16232
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16233
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16234
+ }
16235
+ }
16236
+ },
16237
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16062
16238
  quotaInfo: {
16063
- remainingFraction: 1,
16064
- resetTime: "2026-05-29T18:30:05Z"
16239
+ remainingFraction: 0.9598632,
16240
+ resetTime: "2026-08-25T09:13:21Z"
16241
+ }
16242
+ },
16243
+ "gemini-2.5-flash-thinking": {
16244
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16245
+ displayName: "Gemini 3.1 Flash Lite",
16246
+ maxOutputTokens: 65535,
16247
+ maxTokens: 1048576,
16248
+ model: "MODEL_GOOGLE_GEMINI_2_5_FLASH_THINKING",
16249
+ modelExperiments: {
16250
+ experiments: {
16251
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16252
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16253
+ }
16254
+ }
16065
16255
  },
16066
- model: "MODEL_PLACEHOLDER_M16",
16256
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16257
+ quotaInfo: {
16258
+ remainingFraction: 0.9598632,
16259
+ resetTime: "2026-08-25T09:13:21Z"
16260
+ }
16261
+ },
16262
+ "gemini-2.5-pro": {
16067
16263
  apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16264
+ displayName: "Gemini 2.5 Pro",
16265
+ maxOutputTokens: 65535,
16266
+ maxTokens: 1048576,
16267
+ minThinkingBudget: 128,
16268
+ model: "MODEL_GOOGLE_GEMINI_2_5_PRO",
16269
+ modelExperiments: {
16270
+ experiments: {
16271
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16272
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16273
+ }
16274
+ }
16275
+ },
16068
16276
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16069
- supportsVideo: true,
16277
+ quotaInfo: {
16278
+ remainingFraction: 0.9598632,
16279
+ resetTime: "2026-08-25T09:13:21Z"
16280
+ },
16281
+ recommended: true,
16282
+ requiresImageOutputOutsideFunctionResponses: true,
16070
16283
  supportedMimeTypes: {
16071
- "image/png": true,
16284
+ "application/json": true,
16285
+ "application/pdf": true,
16286
+ "application/rtf": true,
16287
+ "application/x-ipynb+json": true,
16288
+ "application/x-javascript": true,
16289
+ "application/x-python-code": true,
16290
+ "application/x-typescript": true,
16291
+ "audio/aac": true,
16292
+ "audio/flac": true,
16293
+ "audio/l16": true,
16294
+ "audio/m4a": true,
16295
+ "audio/mp3": true,
16296
+ "audio/mp4": true,
16297
+ "audio/mpeg": true,
16298
+ "audio/ogg": true,
16299
+ "audio/opus": true,
16300
+ "audio/vnd.wave": true,
16301
+ "audio/wav": true,
16302
+ "audio/wave": true,
16303
+ "audio/webm": true,
16304
+ "audio/webm;codecs=opus": true,
16305
+ "audio/x-wav": true,
16072
16306
  "image/heic": true,
16073
- "text/plain": true,
16074
- "video/mp4": true,
16307
+ "image/heif": true,
16308
+ "image/jpeg": true,
16309
+ "image/png": true,
16310
+ "image/webp": true,
16075
16311
  "text/css": true,
16076
- "text/rtf": true,
16312
+ "text/csv": true,
16313
+ "text/html": true,
16077
16314
  "text/javascript": true,
16078
- "audio/webm;codecs=opus": true,
16079
- "application/x-typescript": true,
16080
- "video/jpeg2000": true,
16081
- "video/videoframe/jpeg2000": true,
16082
- "application/rtf": true,
16083
- "text/xml": true,
16084
- "video/text/timestamp": true,
16085
- "application/x-python-code": true,
16086
16315
  "text/markdown": true,
16316
+ "text/plain": true,
16317
+ "text/rtf": true,
16087
16318
  "text/x-python": true,
16088
- "image/webp": true,
16089
- "application/x-javascript": true,
16090
16319
  "text/x-python-script": true,
16091
- "application/json": true,
16092
- "text/html": true,
16093
- "video/webm": true,
16094
- "video/audio/s16le": true,
16095
- "application/x-ipynb+json": true,
16096
- "image/jpeg": true,
16097
16320
  "text/x-typescript": true,
16098
- "text/csv": true,
16321
+ "text/xml": true,
16322
+ "video/audio/s16le": true,
16099
16323
  "video/audio/wav": true,
16100
- "image/heif": true,
16101
- "application/pdf": true
16324
+ "video/jpeg2000": true,
16325
+ "video/mp4": true,
16326
+ "video/text/timestamp": true,
16327
+ "video/videoframe/jpeg2000": true,
16328
+ "video/webm": true
16102
16329
  },
16330
+ supportsImages: true,
16331
+ supportsThinking: true,
16332
+ thinkingBudget: 1024
16333
+ },
16334
+ "gemini-3-flash": {
16335
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16336
+ displayName: "Gemini 3 Flash",
16337
+ maxOutputTokens: 65536,
16338
+ maxTokens: 1048576,
16339
+ minThinkingBudget: 32,
16340
+ model: "MODEL_PLACEHOLDER_M18",
16103
16341
  modelExperiments: {
16104
16342
  experiments: {
16105
- template__system_prompts__communication_style: {
16106
- stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\nCRITICAL INSTRUCTION 1: ...\\nCRITICAL INSTRUCTION 2: ...'."
16107
- },
16108
- template__system_prompts__identity: {
16109
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
16110
- },
16111
- template__system_prompts__planning_more_artifacts: {
16112
- stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16113
- },
16114
16343
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16115
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16344
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16116
16345
  },
16117
- "cascade-include-ephemeral-message": {
16118
- stringValue: '{\n "enabled": true,\n "disabledHeuristics": ["running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
16346
+ template__system_prompts__communication_style: {
16347
+ stringValue: '- Keep your responses concise.\n- Provide a summary of your work when you end your turn. Ground your response in the work you did. Keep your tone professional and avoid overconfident language, bragging, or overclaiming success.\n- AVOID using superlatives such as "perfectly", "flawlessly", "100% correct", "Summary of Accomplishments" etc. to summarize your work for the user. Be humble.\n- AVOID over-the-top politeness or complimenting the user excessively.\n- Format your responses in github-style markdown.'
16119
16348
  }
16120
16349
  }
16121
- }
16122
- },
16123
- "gemini-3.5-flash-extra-low": {
16124
- displayName: "Gemini 3.5 Flash (Low)",
16125
- supportsImages: true,
16126
- supportsThinking: true,
16127
- thinkingBudget: 1e3,
16128
- minThinkingBudget: 32,
16129
- recommended: true,
16130
- maxTokens: 1048576,
16131
- maxOutputTokens: 65536,
16132
- tokenizerType: "LLAMA_WITH_SPECIAL",
16133
- quotaInfo: {
16134
- remainingFraction: 1,
16135
- resetTime: "2026-05-29T18:30:05Z"
16136
16350
  },
16137
- model: "MODEL_PLACEHOLDER_M187",
16138
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16139
16351
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16140
- supportsVideo: true,
16141
- tagTitle: "Fast",
16142
- tagDescription: "Limited time",
16352
+ quotaInfo: {
16353
+ remainingFraction: 0.9598632,
16354
+ resetTime: "2026-08-25T09:13:21Z"
16355
+ },
16356
+ recommended: true,
16143
16357
  supportedMimeTypes: {
16144
- "video/audio/s16le": true,
16145
- "video/mp4": true,
16146
- "image/heif": true,
16358
+ "application/json": true,
16359
+ "application/pdf": true,
16360
+ "application/rtf": true,
16361
+ "application/x-ipynb+json": true,
16362
+ "application/x-javascript": true,
16363
+ "application/x-python-code": true,
16147
16364
  "application/x-typescript": true,
16148
- "image/png": true,
16149
- "video/jpeg2000": true,
16150
- "text/csv": true,
16151
- "text/x-python-script": true,
16152
- "image/jpeg": true,
16153
- "text/rtf": true,
16154
- "text/x-python": true,
16365
+ "audio/aac": true,
16366
+ "audio/flac": true,
16367
+ "audio/l16": true,
16368
+ "audio/m4a": true,
16369
+ "audio/mp3": true,
16370
+ "audio/mp4": true,
16371
+ "audio/mpeg": true,
16372
+ "audio/ogg": true,
16373
+ "audio/opus": true,
16374
+ "audio/vnd.wave": true,
16375
+ "audio/wav": true,
16376
+ "audio/wave": true,
16377
+ "audio/webm": true,
16155
16378
  "audio/webm;codecs=opus": true,
16156
- "video/text/timestamp": true,
16157
- "application/pdf": true,
16379
+ "audio/x-wav": true,
16380
+ "image/heic": true,
16381
+ "image/heif": true,
16382
+ "image/jpeg": true,
16383
+ "image/png": true,
16158
16384
  "image/webp": true,
16159
- "application/x-javascript": true,
16160
- "text/markdown": true,
16161
- "application/x-ipynb+json": true,
16162
- "video/audio/wav": true,
16163
- "text/javascript": true,
16164
- "application/rtf": true,
16165
- "video/webm": true,
16166
16385
  "text/css": true,
16386
+ "text/csv": true,
16167
16387
  "text/html": true,
16168
- "text/xml": true,
16169
- "text/x-typescript": true,
16170
- "application/x-python-code": true,
16171
- "application/json": true,
16172
- "image/heic": true,
16388
+ "text/javascript": true,
16389
+ "text/markdown": true,
16173
16390
  "text/plain": true,
16174
- "video/videoframe/jpeg2000": true
16391
+ "text/rtf": true,
16392
+ "text/x-python": true,
16393
+ "text/x-python-script": true,
16394
+ "text/x-typescript": true,
16395
+ "text/xml": true,
16396
+ "video/audio/s16le": true,
16397
+ "video/audio/wav": true,
16398
+ "video/jpeg2000": true,
16399
+ "video/mp4": true,
16400
+ "video/text/timestamp": true,
16401
+ "video/videoframe/jpeg2000": true,
16402
+ "video/webm": true
16175
16403
  },
16404
+ supportsImages: true,
16405
+ supportsThinking: true,
16406
+ supportsVideo: true,
16407
+ thinkingBudget: -1
16408
+ },
16409
+ "gemini-3-flash-agent": {
16410
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16411
+ displayName: "Gemini 3.5 Flash (High)",
16412
+ maxOutputTokens: 65536,
16413
+ maxTokens: 1048576,
16414
+ minThinkingBudget: 32,
16415
+ model: "MODEL_PLACEHOLDER_M84",
16176
16416
  modelExperiments: {
16177
16417
  experiments: {
16178
16418
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16179
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "100000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": true,\n "max_user_requests": 10,\n "include_last_user_message": true,\n "include_conversation_log": false,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16180
- },
16181
- template__system_prompts__identity: {
16182
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
16419
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16183
16420
  },
16184
- template__system_prompts__planning_more_artifacts: {
16421
+ template__system_prompts__planning_mode_artifacts: {
16185
16422
  stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16186
16423
  }
16187
16424
  }
16188
- }
16189
- },
16190
- "gemini-3-flash-agent": {
16191
- displayName: "Gemini 3.5 Flash (High)",
16192
- supportsImages: true,
16193
- supportsThinking: true,
16194
- thinkingBudget: 1e4,
16195
- minThinkingBudget: 32,
16196
- recommended: true,
16197
- maxTokens: 1048576,
16198
- maxOutputTokens: 65536,
16199
- tokenizerType: "LLAMA_WITH_SPECIAL",
16200
- quotaInfo: {
16201
- remainingFraction: 1,
16202
- resetTime: "2026-05-29T18:30:05Z"
16203
16425
  },
16204
- model: "MODEL_PLACEHOLDER_M132",
16205
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16206
16426
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16207
- supportsVideo: true,
16208
- tagTitle: "Fast",
16209
- tagDescription: "Limited time",
16427
+ quotaInfo: {
16428
+ remainingFraction: 0.9598632,
16429
+ resetTime: "2026-08-25T09:13:21Z"
16430
+ },
16431
+ recommended: true,
16210
16432
  supportedMimeTypes: {
16211
16433
  "application/json": true,
16212
- "text/html": true,
16213
- "text/markdown": true,
16214
- "image/webp": true,
16215
- "video/text/timestamp": true,
16216
16434
  "application/pdf": true,
16217
- "text/javascript": true,
16218
16435
  "application/rtf": true,
16219
- "video/jpeg2000": true,
16220
- "video/videoframe/jpeg2000": true,
16221
- "text/csv": true,
16222
- "text/x-python-script": true,
16223
- "text/rtf": true,
16224
- "image/png": true,
16225
- "audio/webm;codecs=opus": true,
16226
16436
  "application/x-ipynb+json": true,
16227
- "video/audio/wav": true,
16228
- "video/audio/s16le": true,
16229
- "video/webm": true,
16230
- "text/x-python": true,
16231
- "image/heif": true,
16232
- "text/plain": true,
16233
- "video/mp4": true,
16234
16437
  "application/x-javascript": true,
16235
- "image/heic": true,
16236
- "text/x-typescript": true,
16237
16438
  "application/x-python-code": true,
16238
- "text/css": true,
16439
+ "application/x-typescript": true,
16440
+ "audio/aac": true,
16441
+ "audio/flac": true,
16442
+ "audio/l16": true,
16443
+ "audio/m4a": true,
16444
+ "audio/mp3": true,
16445
+ "audio/mp4": true,
16446
+ "audio/mpeg": true,
16447
+ "audio/ogg": true,
16448
+ "audio/opus": true,
16449
+ "audio/vnd.wave": true,
16450
+ "audio/wav": true,
16451
+ "audio/wave": true,
16452
+ "audio/webm": true,
16453
+ "audio/webm;codecs=opus": true,
16454
+ "audio/x-wav": true,
16455
+ "image/heic": true,
16456
+ "image/heif": true,
16239
16457
  "image/jpeg": true,
16458
+ "image/png": true,
16459
+ "image/webp": true,
16460
+ "text/css": true,
16461
+ "text/csv": true,
16462
+ "text/html": true,
16463
+ "text/javascript": true,
16464
+ "text/markdown": true,
16465
+ "text/plain": true,
16466
+ "text/rtf": true,
16467
+ "text/x-python": true,
16468
+ "text/x-python-script": true,
16469
+ "text/x-typescript": true,
16240
16470
  "text/xml": true,
16241
- "application/x-typescript": true
16471
+ "video/audio/s16le": true,
16472
+ "video/audio/wav": true,
16473
+ "video/jpeg2000": true,
16474
+ "video/mp4": true,
16475
+ "video/text/timestamp": true,
16476
+ "video/videoframe/jpeg2000": true,
16477
+ "video/webm": true
16242
16478
  },
16479
+ supportsImages: true,
16480
+ supportsThinking: true,
16481
+ supportsVideo: true,
16482
+ tagDescription: "Limited time",
16483
+ tagTitle: "Fast",
16484
+ thinkingBudget: -1
16485
+ },
16486
+ "gemini-3.1-flash-image": {
16487
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16488
+ displayName: "Gemini 3.1 Flash Image",
16489
+ model: "MODEL_PLACEHOLDER_M21",
16490
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16491
+ quotaInfo: {
16492
+ remainingFraction: 0.9598632,
16493
+ resetTime: "2026-08-25T09:13:21Z"
16494
+ }
16495
+ },
16496
+ "gemini-3.1-flash-lite": {
16497
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16498
+ displayName: "Gemini 3.1 Flash Lite",
16499
+ maxOutputTokens: 65535,
16500
+ maxTokens: 1048576,
16501
+ model: "MODEL_PLACEHOLDER_M50",
16243
16502
  modelExperiments: {
16244
16503
  experiments: {
16245
16504
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16246
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "100000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": true,\n "max_user_requests": 10,\n "include_last_user_message": true,\n "include_conversation_log": false,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16247
- },
16248
- template__system_prompts__identity: {
16249
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
16250
- },
16251
- template__system_prompts__planning_more_artifacts: {
16252
- stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16505
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16253
16506
  }
16254
16507
  }
16255
- }
16256
- },
16257
- chat_23310: {
16258
- maxTokens: 32768,
16259
- tokenizerType: "QWEN2",
16260
- quotaInfo: {
16261
- remainingFraction: 1
16262
16508
  },
16263
- model: "MODEL_CHAT_23310",
16264
- apiProvider: "API_PROVIDER_INTERNAL",
16265
- supportsCumulativeContext: true,
16266
- supportsEstimateTokenCounter: true,
16267
- isInternal: true,
16268
- promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
16269
- toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
16270
- requiresLeadInGeneration: true
16271
- },
16272
- chat_20706: {
16273
- maxTokens: 16384,
16274
- tokenizerType: "QWEN2",
16509
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16275
16510
  quotaInfo: {
16276
- remainingFraction: 1
16277
- },
16278
- model: "MODEL_CHAT_20706",
16279
- apiProvider: "API_PROVIDER_INTERNAL",
16280
- supportsCumulativeContext: true,
16281
- tabJumpPrintLineRange: true,
16282
- supportsEstimateTokenCounter: true,
16283
- isInternal: true,
16284
- addCursorToFindReplaceTarget: true,
16285
- promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
16286
- toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
16287
- requiresLeadInGeneration: true
16511
+ remainingFraction: 0.9598632,
16512
+ resetTime: "2026-08-25T09:13:21Z"
16513
+ }
16288
16514
  },
16289
- "gpt-oss-120b-medium": {
16290
- displayName: "GPT-OSS 120B (Medium)",
16291
- supportsThinking: true,
16292
- thinkingBudget: 8192,
16293
- recommended: true,
16294
- maxTokens: 131072,
16295
- maxOutputTokens: 32768,
16296
- tokenizerType: "LLAMA_WITH_SPECIAL",
16297
- quotaInfo: {
16298
- remainingFraction: 0.6,
16299
- resetTime: "2026-05-29T19:43:59Z"
16300
- },
16301
- model: "MODEL_OPENAI_GPT_OSS_120B_MEDIUM",
16302
- apiProvider: "API_PROVIDER_OPENAI_VERTEX",
16303
- modelProvider: "MODEL_PROVIDER_OPENAI",
16515
+ "gemini-3.1-pro-high": {
16516
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16517
+ displayName: "Gemini 3.1 Pro (High)",
16518
+ maxOutputTokens: 65535,
16519
+ maxTokens: 1048576,
16520
+ minThinkingBudget: 128,
16521
+ model: "MODEL_PLACEHOLDER_M37",
16304
16522
  modelExperiments: {
16305
16523
  experiments: {
16306
16524
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16307
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_UNSPECIFIED",\n "max_token_limit": "80000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "8192",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16525
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16526
+ },
16527
+ "cascade-include-ephemeral-message": {
16528
+ stringValue: '{\n "enabled": true,\n "disabledHeuristics": ["running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
16529
+ },
16530
+ template__system_prompts__communication_style: {
16531
+ stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\nCRITICAL INSTRUCTION 1: ...\\nCRITICAL INSTRUCTION 2: ...'."
16532
+ },
16533
+ template__system_prompts__planning_mode_artifacts: {
16534
+ stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16308
16535
  }
16309
16536
  }
16310
16537
  },
16311
- vertexModelId: "openai/gpt-oss-120b-maas"
16312
- },
16313
- tab_flash_lite_preview: {
16314
- maxTokens: 16384,
16315
- maxOutputTokens: 4096,
16316
- tokenizerType: "LLAMA_WITH_SPECIAL",
16317
- quotaInfo: {
16318
- remainingFraction: 1
16319
- },
16320
- model: "MODEL_PLACEHOLDER_M19",
16321
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16322
16538
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16323
- supportsCumulativeContext: true,
16324
- supportsEstimateTokenCounter: true,
16325
- toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
16326
- requiresLeadInGeneration: true
16327
- },
16328
- "gemini-2.5-flash-lite": {
16329
- displayName: "Gemini 3.1 Flash Lite",
16330
- maxTokens: 1048576,
16331
- maxOutputTokens: 65535,
16332
- tokenizerType: "LLAMA_WITH_SPECIAL",
16333
16539
  quotaInfo: {
16334
- remainingFraction: 1,
16335
- resetTime: "2026-05-29T18:30:05Z"
16540
+ remainingFraction: 0.9598632,
16541
+ resetTime: "2026-08-25T09:13:21Z"
16336
16542
  },
16337
- model: "MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE",
16543
+ recommended: true,
16544
+ supportedMimeTypes: {
16545
+ "application/json": true,
16546
+ "application/pdf": true,
16547
+ "application/rtf": true,
16548
+ "application/x-ipynb+json": true,
16549
+ "application/x-javascript": true,
16550
+ "application/x-python-code": true,
16551
+ "application/x-typescript": true,
16552
+ "audio/aac": true,
16553
+ "audio/flac": true,
16554
+ "audio/l16": true,
16555
+ "audio/m4a": true,
16556
+ "audio/mp3": true,
16557
+ "audio/mp4": true,
16558
+ "audio/mpeg": true,
16559
+ "audio/ogg": true,
16560
+ "audio/opus": true,
16561
+ "audio/vnd.wave": true,
16562
+ "audio/wav": true,
16563
+ "audio/wave": true,
16564
+ "audio/webm": true,
16565
+ "audio/webm;codecs=opus": true,
16566
+ "audio/x-wav": true,
16567
+ "image/heic": true,
16568
+ "image/heif": true,
16569
+ "image/jpeg": true,
16570
+ "image/png": true,
16571
+ "image/webp": true,
16572
+ "text/css": true,
16573
+ "text/csv": true,
16574
+ "text/html": true,
16575
+ "text/javascript": true,
16576
+ "text/markdown": true,
16577
+ "text/plain": true,
16578
+ "text/rtf": true,
16579
+ "text/x-python": true,
16580
+ "text/x-python-script": true,
16581
+ "text/x-typescript": true,
16582
+ "text/xml": true,
16583
+ "video/audio/s16le": true,
16584
+ "video/audio/wav": true,
16585
+ "video/jpeg2000": true,
16586
+ "video/mp4": true,
16587
+ "video/text/timestamp": true,
16588
+ "video/videoframe/jpeg2000": true,
16589
+ "video/webm": true
16590
+ },
16591
+ supportsImages: true,
16592
+ supportsThinking: true,
16593
+ supportsVideo: true,
16594
+ tagTitle: "New",
16595
+ thinkingBudget: 10001
16596
+ },
16597
+ "gemini-3.1-pro-low": {
16338
16598
  apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16339
- modelProvider: "MODEL_PROVIDER_GOOGLE",
16599
+ displayName: "Gemini 3.1 Pro (Low)",
16600
+ maxOutputTokens: 65535,
16601
+ maxTokens: 1048576,
16602
+ minThinkingBudget: 128,
16603
+ model: "MODEL_PLACEHOLDER_M36",
16340
16604
  modelExperiments: {
16341
16605
  experiments: {
16342
16606
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16343
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
16607
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16608
+ },
16609
+ "cascade-include-ephemeral-message": {
16610
+ stringValue: '{\n "enabled": true,\n "disabledHeuristics": ["running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
16611
+ },
16612
+ template__system_prompts__communication_style: {
16613
+ stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\nCRITICAL INSTRUCTION 1: ...\\nCRITICAL INSTRUCTION 2: ...'."
16614
+ },
16615
+ template__system_prompts__planning_mode_artifacts: {
16616
+ stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16344
16617
  }
16345
16618
  }
16346
- }
16347
- },
16348
- "gemini-3.1-flash-lite": {
16349
- displayName: "Gemini 3.1 Flash Lite",
16350
- maxTokens: 1048576,
16351
- maxOutputTokens: 65535,
16352
- tokenizerType: "LLAMA_WITH_SPECIAL",
16619
+ },
16620
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16353
16621
  quotaInfo: {
16354
- remainingFraction: 1,
16355
- resetTime: "2026-05-29T18:30:05Z"
16622
+ remainingFraction: 0.9598632,
16623
+ resetTime: "2026-08-25T09:13:21Z"
16356
16624
  },
16357
- model: "MODEL_PLACEHOLDER_M50",
16625
+ recommended: true,
16626
+ supportedMimeTypes: {
16627
+ "application/json": true,
16628
+ "application/pdf": true,
16629
+ "application/rtf": true,
16630
+ "application/x-ipynb+json": true,
16631
+ "application/x-javascript": true,
16632
+ "application/x-python-code": true,
16633
+ "application/x-typescript": true,
16634
+ "audio/aac": true,
16635
+ "audio/flac": true,
16636
+ "audio/l16": true,
16637
+ "audio/m4a": true,
16638
+ "audio/mp3": true,
16639
+ "audio/mp4": true,
16640
+ "audio/mpeg": true,
16641
+ "audio/ogg": true,
16642
+ "audio/opus": true,
16643
+ "audio/vnd.wave": true,
16644
+ "audio/wav": true,
16645
+ "audio/wave": true,
16646
+ "audio/webm": true,
16647
+ "audio/webm;codecs=opus": true,
16648
+ "audio/x-wav": true,
16649
+ "image/heic": true,
16650
+ "image/heif": true,
16651
+ "image/jpeg": true,
16652
+ "image/png": true,
16653
+ "image/webp": true,
16654
+ "text/css": true,
16655
+ "text/csv": true,
16656
+ "text/html": true,
16657
+ "text/javascript": true,
16658
+ "text/markdown": true,
16659
+ "text/plain": true,
16660
+ "text/rtf": true,
16661
+ "text/x-python": true,
16662
+ "text/x-python-script": true,
16663
+ "text/x-typescript": true,
16664
+ "text/xml": true,
16665
+ "video/audio/s16le": true,
16666
+ "video/audio/wav": true,
16667
+ "video/jpeg2000": true,
16668
+ "video/mp4": true,
16669
+ "video/text/timestamp": true,
16670
+ "video/videoframe/jpeg2000": true,
16671
+ "video/webm": true
16672
+ },
16673
+ supportsImages: true,
16674
+ supportsThinking: true,
16675
+ supportsVideo: true,
16676
+ thinkingBudget: 1001
16677
+ },
16678
+ "gemini-3.5-flash-extra-low": {
16679
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16680
+ displayName: "Gemini 3.5 Flash (Low)",
16681
+ maxOutputTokens: 65536,
16682
+ maxTokens: 1048576,
16683
+ minThinkingBudget: 32,
16684
+ model: "MODEL_PLACEHOLDER_M187",
16685
+ modelExperiments: {
16686
+ experiments: {
16687
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16688
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16689
+ },
16690
+ template__system_prompts__planning_mode_artifacts: {
16691
+ stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16692
+ }
16693
+ }
16694
+ },
16695
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16696
+ quotaInfo: {
16697
+ remainingFraction: 0.9598632,
16698
+ resetTime: "2026-08-25T09:13:21Z"
16699
+ },
16700
+ recommended: true,
16701
+ supportedMimeTypes: {
16702
+ "application/json": true,
16703
+ "application/pdf": true,
16704
+ "application/rtf": true,
16705
+ "application/x-ipynb+json": true,
16706
+ "application/x-javascript": true,
16707
+ "application/x-python-code": true,
16708
+ "application/x-typescript": true,
16709
+ "audio/aac": true,
16710
+ "audio/flac": true,
16711
+ "audio/l16": true,
16712
+ "audio/m4a": true,
16713
+ "audio/mp3": true,
16714
+ "audio/mp4": true,
16715
+ "audio/mpeg": true,
16716
+ "audio/ogg": true,
16717
+ "audio/opus": true,
16718
+ "audio/vnd.wave": true,
16719
+ "audio/wav": true,
16720
+ "audio/wave": true,
16721
+ "audio/webm": true,
16722
+ "audio/webm;codecs=opus": true,
16723
+ "audio/x-wav": true,
16724
+ "image/heic": true,
16725
+ "image/heif": true,
16726
+ "image/jpeg": true,
16727
+ "image/png": true,
16728
+ "image/webp": true,
16729
+ "text/css": true,
16730
+ "text/csv": true,
16731
+ "text/html": true,
16732
+ "text/javascript": true,
16733
+ "text/markdown": true,
16734
+ "text/plain": true,
16735
+ "text/rtf": true,
16736
+ "text/x-python": true,
16737
+ "text/x-python-script": true,
16738
+ "text/x-typescript": true,
16739
+ "text/xml": true,
16740
+ "video/audio/s16le": true,
16741
+ "video/audio/wav": true,
16742
+ "video/jpeg2000": true,
16743
+ "video/mp4": true,
16744
+ "video/text/timestamp": true,
16745
+ "video/videoframe/jpeg2000": true,
16746
+ "video/webm": true
16747
+ },
16748
+ supportsImages: true,
16749
+ supportsThinking: true,
16750
+ supportsVideo: true,
16751
+ tagDescription: "Limited time",
16752
+ tagTitle: "Fast",
16753
+ thinkingBudget: 1e3
16754
+ },
16755
+ "gemini-3.5-flash-low": {
16756
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16757
+ displayName: "Gemini 3.5 Flash (Medium)",
16758
+ maxOutputTokens: 65536,
16759
+ maxTokens: 1048576,
16760
+ minThinkingBudget: 32,
16761
+ model: "MODEL_PLACEHOLDER_M20",
16762
+ modelExperiments: {
16763
+ experiments: {
16764
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16765
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16766
+ },
16767
+ template__system_prompts__planning_mode_artifacts: {
16768
+ stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16769
+ }
16770
+ }
16771
+ },
16772
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16773
+ quotaInfo: {
16774
+ remainingFraction: 0.9598632,
16775
+ resetTime: "2026-08-25T09:13:21Z"
16776
+ },
16777
+ recommended: true,
16778
+ supportedMimeTypes: {
16779
+ "application/json": true,
16780
+ "application/pdf": true,
16781
+ "application/rtf": true,
16782
+ "application/x-ipynb+json": true,
16783
+ "application/x-javascript": true,
16784
+ "application/x-python-code": true,
16785
+ "application/x-typescript": true,
16786
+ "audio/aac": true,
16787
+ "audio/flac": true,
16788
+ "audio/l16": true,
16789
+ "audio/m4a": true,
16790
+ "audio/mp3": true,
16791
+ "audio/mp4": true,
16792
+ "audio/mpeg": true,
16793
+ "audio/ogg": true,
16794
+ "audio/opus": true,
16795
+ "audio/vnd.wave": true,
16796
+ "audio/wav": true,
16797
+ "audio/wave": true,
16798
+ "audio/webm": true,
16799
+ "audio/webm;codecs=opus": true,
16800
+ "audio/x-wav": true,
16801
+ "image/heic": true,
16802
+ "image/heif": true,
16803
+ "image/jpeg": true,
16804
+ "image/png": true,
16805
+ "image/webp": true,
16806
+ "text/css": true,
16807
+ "text/csv": true,
16808
+ "text/html": true,
16809
+ "text/javascript": true,
16810
+ "text/markdown": true,
16811
+ "text/plain": true,
16812
+ "text/rtf": true,
16813
+ "text/x-python": true,
16814
+ "text/x-python-script": true,
16815
+ "text/x-typescript": true,
16816
+ "text/xml": true,
16817
+ "video/audio/s16le": true,
16818
+ "video/audio/wav": true,
16819
+ "video/jpeg2000": true,
16820
+ "video/mp4": true,
16821
+ "video/text/timestamp": true,
16822
+ "video/videoframe/jpeg2000": true,
16823
+ "video/webm": true
16824
+ },
16825
+ supportsImages: true,
16826
+ supportsThinking: true,
16827
+ supportsVideo: true,
16828
+ tagDescription: "Limited time",
16829
+ tagTitle: "Fast",
16830
+ thinkingBudget: 4e3
16831
+ },
16832
+ "gemini-3.6-flash-high": {
16833
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16834
+ displayName: "Gemini 3.6 Flash (High)",
16835
+ maxOutputTokens: 65536,
16836
+ maxTokens: 1048576,
16837
+ minThinkingBudget: 32,
16838
+ model: "MODEL_PLACEHOLDER_M71",
16839
+ modelExperiments: {
16840
+ experiments: {
16841
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16842
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16843
+ },
16844
+ "cascade-include-ephemeral-message": {
16845
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
16846
+ },
16847
+ template__system_prompts__communication_style: {
16848
+ stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- You can render LaTeX math (KaTeX): inline with `\\(...\\)` or `$...$`, display with `\\[...\\]` or `$$...$$` placed on its own line.\n- Use math only for genuine mathematical content. Use backticks for code, identifiers, paths, flags, and shell variables.\n- `$` opens inline math, so write a literal dollar as `\\$` or wrap it in backticks. Two unescaped `$` in the same paragraph turn everything between them into math \u2014 this bites prices (`\\$100`) and shell syntax written in prose (`$HOME`, awk `$1`).\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [utils.py](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n- After launching a background task such as 'run_command', YOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: \nA) either proceed to other relevant work (if any) or, \nB) simply update the user with a short message (e.g. 'task-20 has been launched in the background. I will wait for it to complete before proceeding.') and end the turn.\nDO NOTHING ELSE.\n"
16849
+ },
16850
+ template__system_prompts__guidelines: {
16851
+ stringValue: "Follow these behavioral and workflow guidelines at all times:\n# Documentation\n- Maintain documentation integrity. Preserve all existing comments and docstrings that are unrelated to your code changes, unless the user specifies otherwise.\n\n# Obey Explicit Directives\nIf the user specifies precise quantitative filtering rules, layout boundaries, or architectural preferences, enforce them exactly as requested without alteration.\n\n# Never Guess Code Logic, Schemas, or File Paths\nNEVER infer implementation details, variable names, or file locations without inspecting the authoritative source using code search and file viewing tools.\n\n# Inspect Logs & Stack Traces Before Diagnosing Errors\nNEVER form a diagnostic hypothesis for a runtime failure, or test breakage, without reading the full, un-truncated error log. When an error occurs, your VERY FIRST ACTION must be to fetch and read the exact logs. Base your diagnosis strictly on empirical log evidence.\n\n# No Superficial Symptom Patches\nNEVER resolve errors by masking symptoms, swallowing exceptions, returning dummy fallbacks, commenting out broken assertions, or deleting failing unit tests. When a test or function fails, identify why the underlying contract was broken. If an API returns missing or null data, trace the upstream data provider instead of wrapping the call in a silent try/except or returning an empty 0-byte ArrayBuffer.\n\n# Never Declare Success Without Running Verification Commands\nNEVER claim a task is resolved, a bug is fixed, or a feature is working until you have gathered concrete, empirical runtime verification demonstrating clean success. Editing a file does not equal completing the task. You MUST run the build or test command afterwards.\n\n# Never Ignore Explicit Command Failures or Error Exit Codes\nIf a command fails, you MUST explicitly acknowledge the failure to the user or continue debugging. Never gloss over a build timeout or permission denied error by focusing only on the part of the code that compiled.\n\n# Check Feature Flags & Enforce Strict Control Flow Scoping\nWhenever modifying conditional branches, adding experimental features, or processing loops, ensure that new logic is strictly scoped and evaluated against all possible execution paths.\n\n# Preserve Existing API Contracts & Avoid Unintended Side Effects\nIf you modify a function signature, use code search to find and update every invocation site so the parameter is actually passed.\n\n# Silent Log Inspection & Professional Synthesis\nWhen background tasks (run_command async, manage_task, schedule) complete or emit log notifications, inspect the log files silently. Summarize and synthesize the exact findings in clean, professional natural language.\n\n# No Snippet Tunnel Vision\nNever infer the definition of data structures (proto, struct, class, or enum schemas) from partial file views (first 15 lines or L40-L65 snippets) or design doc text.\nIf view_file output indicates truncation or if an imported schema is referenced, you MUST adjust StartLine/EndLine or ContentOffset to inspect the complete, exact definition of the target symbols before writing code that consumes them.\n\n# Check Command Registries\nWhenever modifying core C/C++/Java command implementations (CLIENT LIST, CLIENT KILL), explicitly search for and update corresponding command definitions across all registry files (commands.def, JSON schemas, .bzl build manifests).\n\n# Audit Before Re-inventing\nSearch the codebase and recent commit history for pre-existing utility classes or decoupled architecture before writing custom helper classes from scratch.\n\n# No Blocking Calls on Main Looper Threads\nNever invoke blocking thread synchronizations (webLatch.await(500, ...), Future.get()) on main Android UI loops or single-threaded event dispatchers. \n\n# Thread Pool Shutdown Safety\nWhen modifying worker thread loops or shared queues, ensure emergency stop/shutdown signals and loop termination criteria remain intact so thread join operations never deadlock.\n\n# Exact Argument Structure\nPass arguments exactly as expected by the API (calculateRoute({ origin, destination, travelMode }) vs calculateRoute(origin, destination, travelMode)).\n\n# Local State Mutation Only\nDo not mutate private third-party DOM properties. Do not push incomplete draft objects directly into global array states; keep transient state within local component state.\n\n# Traceback Justification Required\nEvery code or configuration edit during debugging MUST be justified by an explicit error traceback, log line, or verified root cause. If the root cause is unknown, investigate further before mutating code.\n\n# Analyze Before Retrying\nNever repeat the exact same broken test or shell command line with duplicate/conflicting arguments without analyzing and resolving why the previous command failed.\n\n# Persevere on Log Extraction\nIf a log retrieval command fails, NEVER abandon log extraction to diagnose blindly. Immediately switch to alternative tools to inspect the actual failure traceback.\n\n# Verify Signatures & Prop Names\nCheck exact variable names, component prop keys, and method signatures before passing them. Prevent NullPointerException, AttributeError, KeyError, and ReferenceError crashes by explicitly verifying object initialization and non-null states before property dereferencing (layer._path, stat.owner()).\n\n# Dynamic Layout Math\nAvoid hardcoding static pixel offsets (+ 12) or arbitrary multipliers (pill_font_size * 2.0) when computing dynamic UI layout heights; calculate exact container bounds from wrapped elements.\n"
16852
+ },
16853
+ template__system_prompts__messaging: {
16854
+ stringValue: "You are connected to a messaging system where you may receive messages from: {{- $subagent := .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled -}}\n{{- $message := .CascadeConfig.GetMessageConfig.GetEnabled -}}\n{{- if and $subagent $message }} agents, background tasks, user-queued messages\n{{- else if $subagent }} agents, background tasks\n{{- else if $message }} background tasks, user-queued messages\n{{- else }} background tasks\n{{- end }}.\n\n## Receiving Messages\n\nYou receive messages automatically at the start of each invocation. All messages are delivered in full directly into your context \u2014 no manual retrieval is needed.\n\n## Reactive Wakeup (No Polling Needed)\n\nThe system automatically resumes your execution when:\n{{- if .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled }}\n- A message arrives from a subagent or peer agent\n{{- end }}\n- A **background task** completes or sends you a notification\n{{- if .CascadeConfig.GetMessageConfig.GetEnabled }}\n- A **user-queued message** is ready to be dequeued\n{{- end }}\n\nThis means you do **NOT** need to poll in a loop while waiting for messages or updates. After launching a task that runs in the background, you may continue other work or simply stop by calling no more tools. The system will notify you when there is something to process."
16855
+ }
16856
+ }
16857
+ },
16858
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16859
+ quotaInfo: {
16860
+ remainingFraction: 0.9598632,
16861
+ resetTime: "2026-08-25T09:13:21Z"
16862
+ },
16863
+ recommended: true,
16864
+ supportedMimeTypes: {
16865
+ "application/json": true,
16866
+ "application/pdf": true,
16867
+ "application/rtf": true,
16868
+ "application/x-ipynb+json": true,
16869
+ "application/x-javascript": true,
16870
+ "application/x-python-code": true,
16871
+ "application/x-typescript": true,
16872
+ "audio/aac": true,
16873
+ "audio/flac": true,
16874
+ "audio/l16": true,
16875
+ "audio/m4a": true,
16876
+ "audio/mp3": true,
16877
+ "audio/mp4": true,
16878
+ "audio/mpeg": true,
16879
+ "audio/ogg": true,
16880
+ "audio/opus": true,
16881
+ "audio/vnd.wave": true,
16882
+ "audio/wav": true,
16883
+ "audio/wave": true,
16884
+ "audio/webm": true,
16885
+ "audio/webm;codecs=opus": true,
16886
+ "audio/x-wav": true,
16887
+ "image/heic": true,
16888
+ "image/heif": true,
16889
+ "image/jpeg": true,
16890
+ "image/png": true,
16891
+ "image/webp": true,
16892
+ "text/css": true,
16893
+ "text/csv": true,
16894
+ "text/html": true,
16895
+ "text/javascript": true,
16896
+ "text/markdown": true,
16897
+ "text/plain": true,
16898
+ "text/rtf": true,
16899
+ "text/x-python": true,
16900
+ "text/x-python-script": true,
16901
+ "text/x-typescript": true,
16902
+ "text/xml": true,
16903
+ "video/audio/s16le": true,
16904
+ "video/audio/wav": true,
16905
+ "video/jpeg2000": true,
16906
+ "video/mp4": true,
16907
+ "video/text/timestamp": true,
16908
+ "video/videoframe/jpeg2000": true,
16909
+ "video/webm": true
16910
+ },
16911
+ supportsImages: true,
16912
+ supportsThinking: true,
16913
+ supportsVideo: true,
16914
+ tagDescription: "Limited time",
16915
+ tagTitle: "Fast",
16916
+ thinkingBudget: -1
16917
+ },
16918
+ "gemini-3.6-flash-low": {
16919
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16920
+ displayName: "Gemini 3.6 Flash (Low)",
16921
+ maxOutputTokens: 65536,
16922
+ maxTokens: 1048576,
16923
+ minThinkingBudget: 32,
16924
+ model: "MODEL_PLACEHOLDER_M73",
16925
+ modelExperiments: {
16926
+ experiments: {
16927
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16928
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16929
+ },
16930
+ "cascade-include-ephemeral-message": {
16931
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
16932
+ },
16933
+ template__system_prompts__communication_style: {
16934
+ stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- You can render LaTeX math (KaTeX): inline with `\\(...\\)` or `$...$`, display with `\\[...\\]` or `$$...$$` placed on its own line.\n- Use math only for genuine mathematical content. Use backticks for code, identifiers, paths, flags, and shell variables.\n- `$` opens inline math, so write a literal dollar as `\\$` or wrap it in backticks. Two unescaped `$` in the same paragraph turn everything between them into math \u2014 this bites prices (`\\$100`) and shell syntax written in prose (`$HOME`, awk `$1`).\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [utils.py](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n- After launching a background task such as 'run_command', YOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: \nA) either proceed to other relevant work (if any) or, \nB) simply update the user with a short message (e.g. 'task-20 has been launched in the background. I will wait for it to complete before proceeding.') and end the turn.\nDO NOTHING ELSE.\n"
16935
+ },
16936
+ template__system_prompts__guidelines: {
16937
+ stringValue: "Follow these behavioral and workflow guidelines at all times:\n# Documentation\n- Maintain documentation integrity. Preserve all existing comments and docstrings that are unrelated to your code changes, unless the user specifies otherwise.\n\n# Obey Explicit Directives\nIf the user specifies precise quantitative filtering rules, layout boundaries, or architectural preferences, enforce them exactly as requested without alteration.\n\n# Never Guess Code Logic, Schemas, or File Paths\nNEVER infer implementation details, variable names, or file locations without inspecting the authoritative source using code search and file viewing tools.\n\n# Inspect Logs & Stack Traces Before Diagnosing Errors\nNEVER form a diagnostic hypothesis for a runtime failure, or test breakage, without reading the full, un-truncated error log. When an error occurs, your VERY FIRST ACTION must be to fetch and read the exact logs. Base your diagnosis strictly on empirical log evidence.\n\n# No Superficial Symptom Patches\nNEVER resolve errors by masking symptoms, swallowing exceptions, returning dummy fallbacks, commenting out broken assertions, or deleting failing unit tests. When a test or function fails, identify why the underlying contract was broken. If an API returns missing or null data, trace the upstream data provider instead of wrapping the call in a silent try/except or returning an empty 0-byte ArrayBuffer.\n\n# Never Declare Success Without Running Verification Commands\nNEVER claim a task is resolved, a bug is fixed, or a feature is working until you have gathered concrete, empirical runtime verification demonstrating clean success. Editing a file does not equal completing the task. You MUST run the build or test command afterwards.\n\n# Never Ignore Explicit Command Failures or Error Exit Codes\nIf a command fails, you MUST explicitly acknowledge the failure to the user or continue debugging. Never gloss over a build timeout or permission denied error by focusing only on the part of the code that compiled.\n\n# Check Feature Flags & Enforce Strict Control Flow Scoping\nWhenever modifying conditional branches, adding experimental features, or processing loops, ensure that new logic is strictly scoped and evaluated against all possible execution paths.\n\n# Preserve Existing API Contracts & Avoid Unintended Side Effects\nIf you modify a function signature, use code search to find and update every invocation site so the parameter is actually passed.\n\n# Silent Log Inspection & Professional Synthesis\nWhen background tasks (run_command async, manage_task, schedule) complete or emit log notifications, inspect the log files silently. Summarize and synthesize the exact findings in clean, professional natural language.\n\n# No Snippet Tunnel Vision\nNever infer the definition of data structures (proto, struct, class, or enum schemas) from partial file views (first 15 lines or L40-L65 snippets) or design doc text.\nIf view_file output indicates truncation or if an imported schema is referenced, you MUST adjust StartLine/EndLine or ContentOffset to inspect the complete, exact definition of the target symbols before writing code that consumes them.\n\n# Check Command Registries\nWhenever modifying core C/C++/Java command implementations (CLIENT LIST, CLIENT KILL), explicitly search for and update corresponding command definitions across all registry files (commands.def, JSON schemas, .bzl build manifests).\n\n# Audit Before Re-inventing\nSearch the codebase and recent commit history for pre-existing utility classes or decoupled architecture before writing custom helper classes from scratch.\n\n# No Blocking Calls on Main Looper Threads\nNever invoke blocking thread synchronizations (webLatch.await(500, ...), Future.get()) on main Android UI loops or single-threaded event dispatchers. \n\n# Thread Pool Shutdown Safety\nWhen modifying worker thread loops or shared queues, ensure emergency stop/shutdown signals and loop termination criteria remain intact so thread join operations never deadlock.\n\n# Exact Argument Structure\nPass arguments exactly as expected by the API (calculateRoute({ origin, destination, travelMode }) vs calculateRoute(origin, destination, travelMode)).\n\n# Local State Mutation Only\nDo not mutate private third-party DOM properties. Do not push incomplete draft objects directly into global array states; keep transient state within local component state.\n\n# Traceback Justification Required\nEvery code or configuration edit during debugging MUST be justified by an explicit error traceback, log line, or verified root cause. If the root cause is unknown, investigate further before mutating code.\n\n# Analyze Before Retrying\nNever repeat the exact same broken test or shell command line with duplicate/conflicting arguments without analyzing and resolving why the previous command failed.\n\n# Persevere on Log Extraction\nIf a log retrieval command fails, NEVER abandon log extraction to diagnose blindly. Immediately switch to alternative tools to inspect the actual failure traceback.\n\n# Verify Signatures & Prop Names\nCheck exact variable names, component prop keys, and method signatures before passing them. Prevent NullPointerException, AttributeError, KeyError, and ReferenceError crashes by explicitly verifying object initialization and non-null states before property dereferencing (layer._path, stat.owner()).\n\n# Dynamic Layout Math\nAvoid hardcoding static pixel offsets (+ 12) or arbitrary multipliers (pill_font_size * 2.0) when computing dynamic UI layout heights; calculate exact container bounds from wrapped elements.\n"
16938
+ },
16939
+ template__system_prompts__messaging: {
16940
+ stringValue: "You are connected to a messaging system where you may receive messages from: {{- $subagent := .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled -}}\n{{- $message := .CascadeConfig.GetMessageConfig.GetEnabled -}}\n{{- if and $subagent $message }} agents, background tasks, user-queued messages\n{{- else if $subagent }} agents, background tasks\n{{- else if $message }} background tasks, user-queued messages\n{{- else }} background tasks\n{{- end }}.\n\n## Receiving Messages\n\nYou receive messages automatically at the start of each invocation. All messages are delivered in full directly into your context \u2014 no manual retrieval is needed.\n\n## Reactive Wakeup (No Polling Needed)\n\nThe system automatically resumes your execution when:\n{{- if .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled }}\n- A message arrives from a subagent or peer agent\n{{- end }}\n- A **background task** completes or sends you a notification\n{{- if .CascadeConfig.GetMessageConfig.GetEnabled }}\n- A **user-queued message** is ready to be dequeued\n{{- end }}\n\nThis means you do **NOT** need to poll in a loop while waiting for messages or updates. After launching a task that runs in the background, you may continue other work or simply stop by calling no more tools. The system will notify you when there is something to process."
16941
+ }
16942
+ }
16943
+ },
16944
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16945
+ quotaInfo: {
16946
+ remainingFraction: 0.9598632,
16947
+ resetTime: "2026-08-25T09:13:21Z"
16948
+ },
16949
+ recommended: true,
16950
+ supportedMimeTypes: {
16951
+ "application/json": true,
16952
+ "application/pdf": true,
16953
+ "application/rtf": true,
16954
+ "application/x-ipynb+json": true,
16955
+ "application/x-javascript": true,
16956
+ "application/x-python-code": true,
16957
+ "application/x-typescript": true,
16958
+ "audio/aac": true,
16959
+ "audio/flac": true,
16960
+ "audio/l16": true,
16961
+ "audio/m4a": true,
16962
+ "audio/mp3": true,
16963
+ "audio/mp4": true,
16964
+ "audio/mpeg": true,
16965
+ "audio/ogg": true,
16966
+ "audio/opus": true,
16967
+ "audio/vnd.wave": true,
16968
+ "audio/wav": true,
16969
+ "audio/wave": true,
16970
+ "audio/webm": true,
16971
+ "audio/webm;codecs=opus": true,
16972
+ "audio/x-wav": true,
16973
+ "image/heic": true,
16974
+ "image/heif": true,
16975
+ "image/jpeg": true,
16976
+ "image/png": true,
16977
+ "image/webp": true,
16978
+ "text/css": true,
16979
+ "text/csv": true,
16980
+ "text/html": true,
16981
+ "text/javascript": true,
16982
+ "text/markdown": true,
16983
+ "text/plain": true,
16984
+ "text/rtf": true,
16985
+ "text/x-python": true,
16986
+ "text/x-python-script": true,
16987
+ "text/x-typescript": true,
16988
+ "text/xml": true,
16989
+ "video/audio/s16le": true,
16990
+ "video/audio/wav": true,
16991
+ "video/jpeg2000": true,
16992
+ "video/mp4": true,
16993
+ "video/text/timestamp": true,
16994
+ "video/videoframe/jpeg2000": true,
16995
+ "video/webm": true
16996
+ },
16997
+ supportsImages: true,
16998
+ supportsThinking: true,
16999
+ supportsVideo: true,
17000
+ tagDescription: "Limited time",
17001
+ tagTitle: "Fast",
17002
+ thinkingBudget: 1e3
17003
+ },
17004
+ "gemini-3.6-flash-medium": {
17005
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17006
+ displayName: "Gemini 3.6 Flash (Medium)",
17007
+ maxOutputTokens: 65536,
17008
+ maxTokens: 1048576,
17009
+ minThinkingBudget: 32,
17010
+ model: "MODEL_PLACEHOLDER_M72",
17011
+ modelExperiments: {
17012
+ experiments: {
17013
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
17014
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
17015
+ },
17016
+ "cascade-include-ephemeral-message": {
17017
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
17018
+ },
17019
+ template__system_prompts__communication_style: {
17020
+ stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- You can render LaTeX math (KaTeX): inline with `\\(...\\)` or `$...$`, display with `\\[...\\]` or `$$...$$` placed on its own line.\n- Use math only for genuine mathematical content. Use backticks for code, identifiers, paths, flags, and shell variables.\n- `$` opens inline math, so write a literal dollar as `\\$` or wrap it in backticks. Two unescaped `$` in the same paragraph turn everything between them into math \u2014 this bites prices (`\\$100`) and shell syntax written in prose (`$HOME`, awk `$1`).\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [utils.py](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n- After launching a background task such as 'run_command', YOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: \nA) either proceed to other relevant work (if any) or, \nB) simply update the user with a short message (e.g. 'task-20 has been launched in the background. I will wait for it to complete before proceeding.') and end the turn.\nDO NOTHING ELSE.\n"
17021
+ },
17022
+ template__system_prompts__guidelines: {
17023
+ stringValue: "Follow these behavioral and workflow guidelines at all times:\n# Documentation\n- Maintain documentation integrity. Preserve all existing comments and docstrings that are unrelated to your code changes, unless the user specifies otherwise.\n\n# Obey Explicit Directives\nIf the user specifies precise quantitative filtering rules, layout boundaries, or architectural preferences, enforce them exactly as requested without alteration.\n\n# Never Guess Code Logic, Schemas, or File Paths\nNEVER infer implementation details, variable names, or file locations without inspecting the authoritative source using code search and file viewing tools.\n\n# Inspect Logs & Stack Traces Before Diagnosing Errors\nNEVER form a diagnostic hypothesis for a runtime failure, or test breakage, without reading the full, un-truncated error log. When an error occurs, your VERY FIRST ACTION must be to fetch and read the exact logs. Base your diagnosis strictly on empirical log evidence.\n\n# No Superficial Symptom Patches\nNEVER resolve errors by masking symptoms, swallowing exceptions, returning dummy fallbacks, commenting out broken assertions, or deleting failing unit tests. When a test or function fails, identify why the underlying contract was broken. If an API returns missing or null data, trace the upstream data provider instead of wrapping the call in a silent try/except or returning an empty 0-byte ArrayBuffer.\n\n# Never Declare Success Without Running Verification Commands\nNEVER claim a task is resolved, a bug is fixed, or a feature is working until you have gathered concrete, empirical runtime verification demonstrating clean success. Editing a file does not equal completing the task. You MUST run the build or test command afterwards.\n\n# Never Ignore Explicit Command Failures or Error Exit Codes\nIf a command fails, you MUST explicitly acknowledge the failure to the user or continue debugging. Never gloss over a build timeout or permission denied error by focusing only on the part of the code that compiled.\n\n# Check Feature Flags & Enforce Strict Control Flow Scoping\nWhenever modifying conditional branches, adding experimental features, or processing loops, ensure that new logic is strictly scoped and evaluated against all possible execution paths.\n\n# Preserve Existing API Contracts & Avoid Unintended Side Effects\nIf you modify a function signature, use code search to find and update every invocation site so the parameter is actually passed.\n\n# Silent Log Inspection & Professional Synthesis\nWhen background tasks (run_command async, manage_task, schedule) complete or emit log notifications, inspect the log files silently. Summarize and synthesize the exact findings in clean, professional natural language.\n\n# No Snippet Tunnel Vision\nNever infer the definition of data structures (proto, struct, class, or enum schemas) from partial file views (first 15 lines or L40-L65 snippets) or design doc text.\nIf view_file output indicates truncation or if an imported schema is referenced, you MUST adjust StartLine/EndLine or ContentOffset to inspect the complete, exact definition of the target symbols before writing code that consumes them.\n\n# Check Command Registries\nWhenever modifying core C/C++/Java command implementations (CLIENT LIST, CLIENT KILL), explicitly search for and update corresponding command definitions across all registry files (commands.def, JSON schemas, .bzl build manifests).\n\n# Audit Before Re-inventing\nSearch the codebase and recent commit history for pre-existing utility classes or decoupled architecture before writing custom helper classes from scratch.\n\n# No Blocking Calls on Main Looper Threads\nNever invoke blocking thread synchronizations (webLatch.await(500, ...), Future.get()) on main Android UI loops or single-threaded event dispatchers. \n\n# Thread Pool Shutdown Safety\nWhen modifying worker thread loops or shared queues, ensure emergency stop/shutdown signals and loop termination criteria remain intact so thread join operations never deadlock.\n\n# Exact Argument Structure\nPass arguments exactly as expected by the API (calculateRoute({ origin, destination, travelMode }) vs calculateRoute(origin, destination, travelMode)).\n\n# Local State Mutation Only\nDo not mutate private third-party DOM properties. Do not push incomplete draft objects directly into global array states; keep transient state within local component state.\n\n# Traceback Justification Required\nEvery code or configuration edit during debugging MUST be justified by an explicit error traceback, log line, or verified root cause. If the root cause is unknown, investigate further before mutating code.\n\n# Analyze Before Retrying\nNever repeat the exact same broken test or shell command line with duplicate/conflicting arguments without analyzing and resolving why the previous command failed.\n\n# Persevere on Log Extraction\nIf a log retrieval command fails, NEVER abandon log extraction to diagnose blindly. Immediately switch to alternative tools to inspect the actual failure traceback.\n\n# Verify Signatures & Prop Names\nCheck exact variable names, component prop keys, and method signatures before passing them. Prevent NullPointerException, AttributeError, KeyError, and ReferenceError crashes by explicitly verifying object initialization and non-null states before property dereferencing (layer._path, stat.owner()).\n\n# Dynamic Layout Math\nAvoid hardcoding static pixel offsets (+ 12) or arbitrary multipliers (pill_font_size * 2.0) when computing dynamic UI layout heights; calculate exact container bounds from wrapped elements.\n"
17024
+ },
17025
+ template__system_prompts__messaging: {
17026
+ stringValue: "You are connected to a messaging system where you may receive messages from: {{- $subagent := .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled -}}\n{{- $message := .CascadeConfig.GetMessageConfig.GetEnabled -}}\n{{- if and $subagent $message }} agents, background tasks, user-queued messages\n{{- else if $subagent }} agents, background tasks\n{{- else if $message }} background tasks, user-queued messages\n{{- else }} background tasks\n{{- end }}.\n\n## Receiving Messages\n\nYou receive messages automatically at the start of each invocation. All messages are delivered in full directly into your context \u2014 no manual retrieval is needed.\n\n## Reactive Wakeup (No Polling Needed)\n\nThe system automatically resumes your execution when:\n{{- if .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled }}\n- A message arrives from a subagent or peer agent\n{{- end }}\n- A **background task** completes or sends you a notification\n{{- if .CascadeConfig.GetMessageConfig.GetEnabled }}\n- A **user-queued message** is ready to be dequeued\n{{- end }}\n\nThis means you do **NOT** need to poll in a loop while waiting for messages or updates. After launching a task that runs in the background, you may continue other work or simply stop by calling no more tools. The system will notify you when there is something to process."
17027
+ }
17028
+ }
17029
+ },
17030
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
17031
+ quotaInfo: {
17032
+ remainingFraction: 0.9598632,
17033
+ resetTime: "2026-08-25T09:13:21Z"
17034
+ },
17035
+ recommended: true,
17036
+ supportedMimeTypes: {
17037
+ "application/json": true,
17038
+ "application/pdf": true,
17039
+ "application/rtf": true,
17040
+ "application/x-ipynb+json": true,
17041
+ "application/x-javascript": true,
17042
+ "application/x-python-code": true,
17043
+ "application/x-typescript": true,
17044
+ "audio/aac": true,
17045
+ "audio/flac": true,
17046
+ "audio/l16": true,
17047
+ "audio/m4a": true,
17048
+ "audio/mp3": true,
17049
+ "audio/mp4": true,
17050
+ "audio/mpeg": true,
17051
+ "audio/ogg": true,
17052
+ "audio/opus": true,
17053
+ "audio/vnd.wave": true,
17054
+ "audio/wav": true,
17055
+ "audio/wave": true,
17056
+ "audio/webm": true,
17057
+ "audio/webm;codecs=opus": true,
17058
+ "audio/x-wav": true,
17059
+ "image/heic": true,
17060
+ "image/heif": true,
17061
+ "image/jpeg": true,
17062
+ "image/png": true,
17063
+ "image/webp": true,
17064
+ "text/css": true,
17065
+ "text/csv": true,
17066
+ "text/html": true,
17067
+ "text/javascript": true,
17068
+ "text/markdown": true,
17069
+ "text/plain": true,
17070
+ "text/rtf": true,
17071
+ "text/x-python": true,
17072
+ "text/x-python-script": true,
17073
+ "text/x-typescript": true,
17074
+ "text/xml": true,
17075
+ "video/audio/s16le": true,
17076
+ "video/audio/wav": true,
17077
+ "video/jpeg2000": true,
17078
+ "video/mp4": true,
17079
+ "video/text/timestamp": true,
17080
+ "video/videoframe/jpeg2000": true,
17081
+ "video/webm": true
17082
+ },
17083
+ supportsImages: true,
17084
+ supportsThinking: true,
17085
+ supportsVideo: true,
17086
+ tagDescription: "Limited time",
17087
+ tagTitle: "Fast",
17088
+ thinkingBudget: 4e3
17089
+ },
17090
+ "gemini-3.6-flash-tiered": {
17091
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17092
+ maxOutputTokens: 65536,
17093
+ maxTokens: 1048576,
17094
+ minThinkingBudget: 32,
17095
+ model: "MODEL_PLACEHOLDER_M196",
17096
+ modelExperiments: {
17097
+ experiments: {
17098
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
17099
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
17100
+ },
17101
+ "cascade-include-ephemeral-message": {
17102
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
17103
+ },
17104
+ template__system_prompts__communication_style: {
17105
+ stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- You can render LaTeX math (KaTeX): inline with `\\(...\\)` or `$...$`, display with `\\[...\\]` or `$$...$$` placed on its own line.\n- Use math only for genuine mathematical content. Use backticks for code, identifiers, paths, flags, and shell variables.\n- `$` opens inline math, so write a literal dollar as `\\$` or wrap it in backticks. Two unescaped `$` in the same paragraph turn everything between them into math \u2014 this bites prices (`\\$100`) and shell syntax written in prose (`$HOME`, awk `$1`).\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [utils.py](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n- After launching a background task such as 'run_command', YOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: \nA) either proceed to other relevant work (if any) or, \nB) simply update the user with a short message (e.g. 'task-20 has been launched in the background. I will wait for it to complete before proceeding.') and end the turn.\nDO NOTHING ELSE.\n"
17106
+ },
17107
+ template__system_prompts__guidelines: {
17108
+ stringValue: "Follow these behavioral and workflow guidelines at all times:\n# Documentation\n- Maintain documentation integrity. Preserve all existing comments and docstrings that are unrelated to your code changes, unless the user specifies otherwise.\n\n# Obey Explicit Directives\nIf the user specifies precise quantitative filtering rules, layout boundaries, or architectural preferences, enforce them exactly as requested without alteration.\n\n# Never Guess Code Logic, Schemas, or File Paths\nNEVER infer implementation details, variable names, or file locations without inspecting the authoritative source using code search and file viewing tools.\n\n# Inspect Logs & Stack Traces Before Diagnosing Errors\nNEVER form a diagnostic hypothesis for a runtime failure, or test breakage, without reading the full, un-truncated error log. When an error occurs, your VERY FIRST ACTION must be to fetch and read the exact logs. Base your diagnosis strictly on empirical log evidence.\n\n# No Superficial Symptom Patches\nNEVER resolve errors by masking symptoms, swallowing exceptions, returning dummy fallbacks, commenting out broken assertions, or deleting failing unit tests. When a test or function fails, identify why the underlying contract was broken. If an API returns missing or null data, trace the upstream data provider instead of wrapping the call in a silent try/except or returning an empty 0-byte ArrayBuffer.\n\n# Never Declare Success Without Running Verification Commands\nNEVER claim a task is resolved, a bug is fixed, or a feature is working until you have gathered concrete, empirical runtime verification demonstrating clean success. Editing a file does not equal completing the task. You MUST run the build or test command afterwards.\n\n# Never Ignore Explicit Command Failures or Error Exit Codes\nIf a command fails, you MUST explicitly acknowledge the failure to the user or continue debugging. Never gloss over a build timeout or permission denied error by focusing only on the part of the code that compiled.\n\n# Check Feature Flags & Enforce Strict Control Flow Scoping\nWhenever modifying conditional branches, adding experimental features, or processing loops, ensure that new logic is strictly scoped and evaluated against all possible execution paths.\n\n# Preserve Existing API Contracts & Avoid Unintended Side Effects\nIf you modify a function signature, use code search to find and update every invocation site so the parameter is actually passed.\n\n# Silent Log Inspection & Professional Synthesis\nWhen background tasks (run_command async, manage_task, schedule) complete or emit log notifications, inspect the log files silently. Summarize and synthesize the exact findings in clean, professional natural language.\n\n# No Snippet Tunnel Vision\nNever infer the definition of data structures (proto, struct, class, or enum schemas) from partial file views (first 15 lines or L40-L65 snippets) or design doc text.\nIf view_file output indicates truncation or if an imported schema is referenced, you MUST adjust StartLine/EndLine or ContentOffset to inspect the complete, exact definition of the target symbols before writing code that consumes them.\n\n# Check Command Registries\nWhenever modifying core C/C++/Java command implementations (CLIENT LIST, CLIENT KILL), explicitly search for and update corresponding command definitions across all registry files (commands.def, JSON schemas, .bzl build manifests).\n\n# Audit Before Re-inventing\nSearch the codebase and recent commit history for pre-existing utility classes or decoupled architecture before writing custom helper classes from scratch.\n\n# No Blocking Calls on Main Looper Threads\nNever invoke blocking thread synchronizations (webLatch.await(500, ...), Future.get()) on main Android UI loops or single-threaded event dispatchers. \n\n# Thread Pool Shutdown Safety\nWhen modifying worker thread loops or shared queues, ensure emergency stop/shutdown signals and loop termination criteria remain intact so thread join operations never deadlock.\n\n# Exact Argument Structure\nPass arguments exactly as expected by the API (calculateRoute({ origin, destination, travelMode }) vs calculateRoute(origin, destination, travelMode)).\n\n# Local State Mutation Only\nDo not mutate private third-party DOM properties. Do not push incomplete draft objects directly into global array states; keep transient state within local component state.\n\n# Traceback Justification Required\nEvery code or configuration edit during debugging MUST be justified by an explicit error traceback, log line, or verified root cause. If the root cause is unknown, investigate further before mutating code.\n\n# Analyze Before Retrying\nNever repeat the exact same broken test or shell command line with duplicate/conflicting arguments without analyzing and resolving why the previous command failed.\n\n# Persevere on Log Extraction\nIf a log retrieval command fails, NEVER abandon log extraction to diagnose blindly. Immediately switch to alternative tools to inspect the actual failure traceback.\n\n# Verify Signatures & Prop Names\nCheck exact variable names, component prop keys, and method signatures before passing them. Prevent NullPointerException, AttributeError, KeyError, and ReferenceError crashes by explicitly verifying object initialization and non-null states before property dereferencing (layer._path, stat.owner()).\n\n# Dynamic Layout Math\nAvoid hardcoding static pixel offsets (+ 12) or arbitrary multipliers (pill_font_size * 2.0) when computing dynamic UI layout heights; calculate exact container bounds from wrapped elements.\n"
17109
+ },
17110
+ template__system_prompts__messaging: {
17111
+ stringValue: "You are connected to a messaging system where you may receive messages from: {{- $subagent := .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled -}}\n{{- $message := .CascadeConfig.GetMessageConfig.GetEnabled -}}\n{{- if and $subagent $message }} agents, background tasks, user-queued messages\n{{- else if $subagent }} agents, background tasks\n{{- else if $message }} background tasks, user-queued messages\n{{- else }} background tasks\n{{- end }}.\n\n## Receiving Messages\n\nYou receive messages automatically at the start of each invocation. All messages are delivered in full directly into your context \u2014 no manual retrieval is needed.\n\n## Reactive Wakeup (No Polling Needed)\n\nThe system automatically resumes your execution when:\n{{- if .CascadeConfig.GetPlannerConfig.GetToolConfig.GetInvokeSubagent.GetEnabled }}\n- A message arrives from a subagent or peer agent\n{{- end }}\n- A **background task** completes or sends you a notification\n{{- if .CascadeConfig.GetMessageConfig.GetEnabled }}\n- A **user-queued message** is ready to be dequeued\n{{- end }}\n\nThis means you do **NOT** need to poll in a loop while waiting for messages or updates. After launching a task that runs in the background, you may continue other work or simply stop by calling no more tools. The system will notify you when there is something to process."
17112
+ }
17113
+ }
17114
+ },
17115
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
17116
+ quotaInfo: {
17117
+ remainingFraction: 0.9598632,
17118
+ resetTime: "2026-08-25T09:13:21Z"
17119
+ },
17120
+ recommended: true,
17121
+ supportedMimeTypes: {
17122
+ "application/json": true,
17123
+ "application/pdf": true,
17124
+ "application/rtf": true,
17125
+ "application/x-ipynb+json": true,
17126
+ "application/x-javascript": true,
17127
+ "application/x-python-code": true,
17128
+ "application/x-typescript": true,
17129
+ "audio/aac": true,
17130
+ "audio/flac": true,
17131
+ "audio/l16": true,
17132
+ "audio/m4a": true,
17133
+ "audio/mp3": true,
17134
+ "audio/mp4": true,
17135
+ "audio/mpeg": true,
17136
+ "audio/ogg": true,
17137
+ "audio/opus": true,
17138
+ "audio/vnd.wave": true,
17139
+ "audio/wav": true,
17140
+ "audio/wave": true,
17141
+ "audio/webm": true,
17142
+ "audio/webm;codecs=opus": true,
17143
+ "audio/x-wav": true,
17144
+ "image/heic": true,
17145
+ "image/heif": true,
17146
+ "image/jpeg": true,
17147
+ "image/png": true,
17148
+ "image/webp": true,
17149
+ "text/css": true,
17150
+ "text/csv": true,
17151
+ "text/html": true,
17152
+ "text/javascript": true,
17153
+ "text/markdown": true,
17154
+ "text/plain": true,
17155
+ "text/rtf": true,
17156
+ "text/x-python": true,
17157
+ "text/x-python-script": true,
17158
+ "text/x-typescript": true,
17159
+ "text/xml": true,
17160
+ "video/audio/s16le": true,
17161
+ "video/audio/wav": true,
17162
+ "video/jpeg2000": true,
17163
+ "video/mp4": true,
17164
+ "video/text/timestamp": true,
17165
+ "video/videoframe/jpeg2000": true,
17166
+ "video/webm": true
17167
+ },
17168
+ supportsImages: true,
17169
+ supportsThinking: true,
17170
+ supportsVideo: true,
17171
+ thinkingBudget: -1
17172
+ },
17173
+ "gemini-3.7-flash-high": {
17174
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17175
+ displayName: "Gemini 3.7 Flash (High)",
17176
+ maxOutputTokens: 65536,
17177
+ maxTokens: 1048576,
17178
+ minThinkingBudget: 32,
17179
+ model: "MODEL_PLACEHOLDER_M298",
17180
+ modelExperiments: {
17181
+ experiments: {
17182
+ CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
17183
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
17184
+ },
17185
+ "cascade-include-ephemeral-message": {
17186
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
17187
+ },
17188
+ "task-details-suffix": {
17189
+ stringValue: "\nYOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: A) either proceed to other relevant work (if any) or, B) simply update the user with a short message (that you have launched the command and will wait for it to finish) and end the turn.\n DO NOTHING ELSE."
17190
+ }
17191
+ }
17192
+ },
17193
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
17194
+ quotaInfo: {
17195
+ remainingFraction: 0.9598632,
17196
+ resetTime: "2026-08-25T09:13:21Z"
17197
+ },
17198
+ recommended: true,
17199
+ supportedMimeTypes: {
17200
+ "application/json": true,
17201
+ "application/pdf": true,
17202
+ "application/rtf": true,
17203
+ "application/x-ipynb+json": true,
17204
+ "application/x-javascript": true,
17205
+ "application/x-python-code": true,
17206
+ "application/x-typescript": true,
17207
+ "audio/aac": true,
17208
+ "audio/flac": true,
17209
+ "audio/l16": true,
17210
+ "audio/m4a": true,
17211
+ "audio/mp3": true,
17212
+ "audio/mp4": true,
17213
+ "audio/mpeg": true,
17214
+ "audio/ogg": true,
17215
+ "audio/opus": true,
17216
+ "audio/vnd.wave": true,
17217
+ "audio/wav": true,
17218
+ "audio/wave": true,
17219
+ "audio/webm": true,
17220
+ "audio/webm;codecs=opus": true,
17221
+ "audio/x-wav": true,
17222
+ "image/heic": true,
17223
+ "image/heif": true,
17224
+ "image/jpeg": true,
17225
+ "image/png": true,
17226
+ "image/webp": true,
17227
+ "text/css": true,
17228
+ "text/csv": true,
17229
+ "text/html": true,
17230
+ "text/javascript": true,
17231
+ "text/markdown": true,
17232
+ "text/plain": true,
17233
+ "text/rtf": true,
17234
+ "text/x-python": true,
17235
+ "text/x-python-script": true,
17236
+ "text/x-typescript": true,
17237
+ "text/xml": true,
17238
+ "video/audio/s16le": true,
17239
+ "video/audio/wav": true,
17240
+ "video/jpeg2000": true,
17241
+ "video/mp4": true,
17242
+ "video/text/timestamp": true,
17243
+ "video/videoframe/jpeg2000": true,
17244
+ "video/webm": true
17245
+ },
17246
+ supportsImages: true,
17247
+ supportsThinking: true,
17248
+ supportsVideo: true,
17249
+ tagDescription: "Limited time",
17250
+ tagTitle: "Fast",
17251
+ thinkingBudget: -1
17252
+ },
17253
+ "gemini-3.7-flash-low": {
16358
17254
  apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16359
- modelProvider: "MODEL_PROVIDER_GOOGLE",
17255
+ displayName: "Gemini 3.7 Flash (Low)",
17256
+ maxOutputTokens: 65536,
17257
+ maxTokens: 1048576,
17258
+ minThinkingBudget: 32,
17259
+ model: "MODEL_PLACEHOLDER_M300",
16360
17260
  modelExperiments: {
16361
17261
  experiments: {
16362
17262
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16363
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
17263
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
17264
+ },
17265
+ "cascade-include-ephemeral-message": {
17266
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
17267
+ },
17268
+ "task-details-suffix": {
17269
+ stringValue: "\nYOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: A) either proceed to other relevant work (if any) or, B) simply update the user with a short message (that you have launched the command and will wait for it to finish) and end the turn.\n DO NOTHING ELSE."
16364
17270
  }
16365
17271
  }
16366
- }
16367
- },
16368
- "gemini-3-flash": {
16369
- displayName: "Gemini 3 Flash",
16370
- supportsImages: true,
16371
- supportsThinking: true,
16372
- thinkingBudget: -1,
16373
- minThinkingBudget: 32,
16374
- recommended: true,
16375
- maxTokens: 1048576,
16376
- maxOutputTokens: 65536,
16377
- tokenizerType: "LLAMA_WITH_SPECIAL",
16378
- quotaInfo: {
16379
- remainingFraction: 1,
16380
- resetTime: "2026-05-29T18:30:05Z"
16381
17272
  },
16382
- model: "MODEL_PLACEHOLDER_M18",
16383
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16384
17273
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16385
- supportsVideo: true,
17274
+ quotaInfo: {
17275
+ remainingFraction: 0.9598632,
17276
+ resetTime: "2026-08-25T09:13:21Z"
17277
+ },
17278
+ recommended: true,
16386
17279
  supportedMimeTypes: {
16387
- "text/csv": true,
16388
- "text/html": true,
17280
+ "application/json": true,
17281
+ "application/pdf": true,
17282
+ "application/rtf": true,
17283
+ "application/x-ipynb+json": true,
17284
+ "application/x-javascript": true,
17285
+ "application/x-python-code": true,
16389
17286
  "application/x-typescript": true,
16390
- "image/heic": true,
17287
+ "audio/aac": true,
17288
+ "audio/flac": true,
17289
+ "audio/l16": true,
17290
+ "audio/m4a": true,
17291
+ "audio/mp3": true,
17292
+ "audio/mp4": true,
17293
+ "audio/mpeg": true,
17294
+ "audio/ogg": true,
17295
+ "audio/opus": true,
17296
+ "audio/vnd.wave": true,
17297
+ "audio/wav": true,
17298
+ "audio/wave": true,
17299
+ "audio/webm": true,
16391
17300
  "audio/webm;codecs=opus": true,
16392
- "text/javascript": true,
16393
- "video/videoframe/jpeg2000": true,
16394
- "video/mp4": true,
16395
- "application/x-python-code": true,
16396
- "video/text/timestamp": true,
16397
- "video/audio/wav": true,
16398
- "video/jpeg2000": true,
17301
+ "audio/x-wav": true,
17302
+ "image/heic": true,
17303
+ "image/heif": true,
17304
+ "image/jpeg": true,
17305
+ "image/png": true,
17306
+ "image/webp": true,
16399
17307
  "text/css": true,
16400
- "video/audio/s16le": true,
16401
- "application/x-javascript": true,
16402
- "text/x-python-script": true,
17308
+ "text/csv": true,
17309
+ "text/html": true,
17310
+ "text/javascript": true,
16403
17311
  "text/markdown": true,
16404
- "image/webp": true,
17312
+ "text/plain": true,
17313
+ "text/rtf": true,
16405
17314
  "text/x-python": true,
16406
- "application/pdf": true,
16407
- "application/x-ipynb+json": true,
16408
- "image/heif": true,
16409
- "application/json": true,
17315
+ "text/x-python-script": true,
16410
17316
  "text/x-typescript": true,
16411
- "text/plain": true,
16412
- "image/png": true,
16413
- "application/rtf": true,
16414
17317
  "text/xml": true,
16415
- "image/jpeg": true,
16416
- "video/webm": true,
16417
- "text/rtf": true
17318
+ "video/audio/s16le": true,
17319
+ "video/audio/wav": true,
17320
+ "video/jpeg2000": true,
17321
+ "video/mp4": true,
17322
+ "video/text/timestamp": true,
17323
+ "video/videoframe/jpeg2000": true,
17324
+ "video/webm": true
16418
17325
  },
17326
+ supportsImages: true,
17327
+ supportsThinking: true,
17328
+ supportsVideo: true,
17329
+ tagDescription: "Limited time",
17330
+ tagTitle: "Fast",
17331
+ thinkingBudget: 1e3
17332
+ },
17333
+ "gemini-3.7-flash-medium": {
17334
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17335
+ displayName: "Gemini 3.7 Flash (Medium)",
17336
+ maxOutputTokens: 65536,
17337
+ maxTokens: 1048576,
17338
+ minThinkingBudget: 32,
17339
+ model: "MODEL_PLACEHOLDER_M299",
16419
17340
  modelExperiments: {
16420
17341
  experiments: {
16421
17342
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16422
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
17343
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16423
17344
  },
16424
- template__system_prompts__communication_style: {
16425
- stringValue: '- Keep your responses concise.\n- Provide a summary of your work when you end your turn. Ground your response in the work you did. Keep your tone professional and avoid overconfident language, bragging, or overclaiming success.\n- AVOID using superlatives such as "perfectly", "flawlessly", "100% correct", "Summary of Accomplishments" etc. to summarize your work for the user. Be humble.\n- AVOID over-the-top politeness or complimenting the user excessively.\n- Format your responses in github-style markdown.'
17345
+ "cascade-include-ephemeral-message": {
17346
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
17347
+ },
17348
+ "task-details-suffix": {
17349
+ stringValue: "\nYOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: A) either proceed to other relevant work (if any) or, B) simply update the user with a short message (that you have launched the command and will wait for it to finish) and end the turn.\n DO NOTHING ELSE."
16426
17350
  }
16427
17351
  }
16428
- }
16429
- },
16430
- "claude-sonnet-4-6": {
16431
- displayName: "Claude Sonnet 4.6 (Thinking)",
16432
- supportsImages: true,
16433
- supportsThinking: true,
16434
- thinkingBudget: 1024,
16435
- recommended: true,
16436
- maxTokens: 25e4,
16437
- maxOutputTokens: 64e3,
16438
- tokenizerType: "LLAMA_WITH_SPECIAL",
17352
+ },
17353
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16439
17354
  quotaInfo: {
16440
- remainingFraction: 0.6,
16441
- resetTime: "2026-05-29T19:43:59Z"
17355
+ remainingFraction: 0.9598632,
17356
+ resetTime: "2026-08-25T09:13:21Z"
16442
17357
  },
16443
- model: "MODEL_PLACEHOLDER_M35",
16444
- apiProvider: "API_PROVIDER_ANTHROPIC_VERTEX",
16445
- modelProvider: "MODEL_PROVIDER_ANTHROPIC",
17358
+ recommended: true,
16446
17359
  supportedMimeTypes: {
17360
+ "application/json": true,
17361
+ "application/pdf": true,
17362
+ "application/rtf": true,
17363
+ "application/x-ipynb+json": true,
17364
+ "application/x-javascript": true,
17365
+ "application/x-python-code": true,
17366
+ "application/x-typescript": true,
17367
+ "audio/aac": true,
17368
+ "audio/flac": true,
17369
+ "audio/l16": true,
17370
+ "audio/m4a": true,
17371
+ "audio/mp3": true,
17372
+ "audio/mp4": true,
17373
+ "audio/mpeg": true,
17374
+ "audio/ogg": true,
17375
+ "audio/opus": true,
17376
+ "audio/vnd.wave": true,
17377
+ "audio/wav": true,
17378
+ "audio/wave": true,
17379
+ "audio/webm": true,
17380
+ "audio/webm;codecs=opus": true,
17381
+ "audio/x-wav": true,
17382
+ "image/heic": true,
17383
+ "image/heif": true,
17384
+ "image/jpeg": true,
16447
17385
  "image/png": true,
16448
17386
  "image/webp": true,
17387
+ "text/css": true,
17388
+ "text/csv": true,
17389
+ "text/html": true,
17390
+ "text/javascript": true,
17391
+ "text/markdown": true,
17392
+ "text/plain": true,
17393
+ "text/rtf": true,
17394
+ "text/x-python": true,
17395
+ "text/x-python-script": true,
17396
+ "text/x-typescript": true,
17397
+ "text/xml": true,
17398
+ "video/audio/s16le": true,
17399
+ "video/audio/wav": true,
16449
17400
  "video/jpeg2000": true,
17401
+ "video/mp4": true,
17402
+ "video/text/timestamp": true,
16450
17403
  "video/videoframe/jpeg2000": true,
16451
- "image/heic": true,
16452
- "image/heif": true,
16453
- "image/jpeg": true
17404
+ "video/webm": true
16454
17405
  },
17406
+ supportsImages: true,
17407
+ supportsThinking: true,
17408
+ supportsVideo: true,
17409
+ tagDescription: "Limited time",
17410
+ tagTitle: "Fast",
17411
+ thinkingBudget: 4e3
17412
+ },
17413
+ "gemini-3.7-flash-tiered": {
17414
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17415
+ maxOutputTokens: 65536,
17416
+ maxTokens: 1048576,
17417
+ minThinkingBudget: 32,
17418
+ model: "MODEL_PLACEHOLDER_M301",
16455
17419
  modelExperiments: {
16456
17420
  experiments: {
16457
- template__system_prompts__planning_more_artifacts: {
16458
- stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16459
- },
16460
17421
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16461
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_UNSPECIFIED",\n "max_token_limit": "160000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
17422
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "140000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
17423
+ },
17424
+ "cascade-include-ephemeral-message": {
17425
+ stringValue: '{\n "enabled": false,\n "disabledHeuristics": ["planning_mode", "bash_command_reminder", "running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
16462
17426
  },
16463
- template__system_prompts__identity: {
16464
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
17427
+ "task-details-suffix": {
17428
+ stringValue: "\nYOU MUST TAKE ONE OF THE FOLLOWING TWO ACTIONS: A) either proceed to other relevant work (if any) or, B) simply update the user with a short message (that you have launched the command and will wait for it to finish) and end the turn.\n DO NOTHING ELSE."
16465
17429
  }
16466
17430
  }
16467
17431
  },
16468
- vertexModelId: "claude-sonnet-4-6@default"
16469
- },
16470
- "gemini-3.1-pro-low": {
16471
- displayName: "Gemini 3.1 Pro (Low)",
16472
- supportsImages: true,
16473
- supportsThinking: true,
16474
- thinkingBudget: 1001,
16475
- minThinkingBudget: 128,
16476
- recommended: true,
16477
- maxTokens: 1048576,
16478
- maxOutputTokens: 65535,
16479
- tokenizerType: "LLAMA_WITH_SPECIAL",
17432
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
16480
17433
  quotaInfo: {
16481
- remainingFraction: 1,
16482
- resetTime: "2026-05-29T18:30:05Z"
17434
+ remainingFraction: 0.9598632,
17435
+ resetTime: "2026-08-25T09:13:21Z"
16483
17436
  },
16484
- model: "MODEL_PLACEHOLDER_M36",
16485
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16486
- modelProvider: "MODEL_PROVIDER_GOOGLE",
16487
- supportsVideo: true,
17437
+ recommended: true,
16488
17438
  supportedMimeTypes: {
16489
- "text/x-typescript": true,
16490
- "audio/webm;codecs=opus": true,
16491
- "image/webp": true,
16492
17439
  "application/json": true,
17440
+ "application/pdf": true,
16493
17441
  "application/rtf": true,
16494
- "text/x-python": true,
16495
- "video/mp4": true,
16496
- "text/csv": true,
16497
- "video/text/timestamp": true,
16498
- "text/css": true,
16499
- "image/heif": true,
16500
- "application/x-typescript": true,
16501
- "text/x-python-script": true,
17442
+ "application/x-ipynb+json": true,
17443
+ "application/x-javascript": true,
16502
17444
  "application/x-python-code": true,
16503
- "text/plain": true,
16504
- "video/webm": true,
16505
- "video/audio/wav": true,
17445
+ "application/x-typescript": true,
17446
+ "audio/aac": true,
17447
+ "audio/flac": true,
17448
+ "audio/l16": true,
17449
+ "audio/m4a": true,
17450
+ "audio/mp3": true,
17451
+ "audio/mp4": true,
17452
+ "audio/mpeg": true,
17453
+ "audio/ogg": true,
17454
+ "audio/opus": true,
17455
+ "audio/vnd.wave": true,
17456
+ "audio/wav": true,
17457
+ "audio/wave": true,
17458
+ "audio/webm": true,
17459
+ "audio/webm;codecs=opus": true,
17460
+ "audio/x-wav": true,
17461
+ "image/heic": true,
17462
+ "image/heif": true,
16506
17463
  "image/jpeg": true,
16507
- "text/xml": true,
16508
- "application/x-javascript": true,
16509
- "text/javascript": true,
17464
+ "image/png": true,
17465
+ "image/webp": true,
17466
+ "text/css": true,
17467
+ "text/csv": true,
16510
17468
  "text/html": true,
16511
- "video/jpeg2000": true,
16512
- "image/heic": true,
16513
- "application/pdf": true,
16514
- "video/audio/s16le": true,
17469
+ "text/javascript": true,
16515
17470
  "text/markdown": true,
17471
+ "text/plain": true,
17472
+ "text/rtf": true,
17473
+ "text/x-python": true,
17474
+ "text/x-python-script": true,
17475
+ "text/x-typescript": true,
17476
+ "text/xml": true,
17477
+ "video/audio/s16le": true,
17478
+ "video/audio/wav": true,
17479
+ "video/jpeg2000": true,
17480
+ "video/mp4": true,
17481
+ "video/text/timestamp": true,
16516
17482
  "video/videoframe/jpeg2000": true,
16517
- "image/png": true,
16518
- "application/x-ipynb+json": true,
16519
- "text/rtf": true
17483
+ "video/webm": true
16520
17484
  },
17485
+ supportsImages: true,
17486
+ supportsThinking: true,
17487
+ supportsVideo: true,
17488
+ thinkingBudget: -1
17489
+ },
17490
+ "gemini-pro-agent": {
17491
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17492
+ displayName: "Gemini 3.1 Pro (High)",
17493
+ maxOutputTokens: 65535,
17494
+ maxTokens: 1048576,
17495
+ minThinkingBudget: 128,
17496
+ model: "MODEL_PLACEHOLDER_M16",
16521
17497
  modelExperiments: {
16522
17498
  experiments: {
16523
17499
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16524
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
17500
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SINGLE_PROMPT",\n "max_token_limit": "128000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16525
17501
  },
16526
17502
  "cascade-include-ephemeral-message": {
16527
17503
  stringValue: '{\n "enabled": true,\n "disabledHeuristics": ["running_tasks_reminder"],\n "staticMessages": [],\n "useAllowlist": false,\n "enabledHeuristics": []\n}'
@@ -16529,182 +17505,145 @@ var models_default = {
16529
17505
  template__system_prompts__communication_style: {
16530
17506
  stringValue: "- Keep your responses concise.\n- Provide a summary of your work when you end your turn.\n- Format your responses in github-style markdown.\n- If you're unsure about the user's intent, ask for clarification rather than making assumptions.\n- You MUST create clickable links for all files and code symbols (classes, types, functions, structs). Use github style markdown links with the `file://` scheme (e.g., [filename](file:///path/to/file) or [ClassName](file:///path/to/file#L10-L20)`). For Windows, use forward slashes for paths.\n\nCRITICAL INSTRUCTION 1: You may have access to a variety of tools at your disposal. Some tools may be for a specific task such as 'view_file' (for viewing contents of a file). Others may be very broadly applicable such as the ability to run a command on a terminal. Always prioritize using the most specific tool you can for the task at hand. Here are some rules: (a) NEVER run cat inside a bash command to create a new file or append to an existing file. (b) ALWAYS use grep_search instead of running grep inside a bash command unless absolutely needed. (c) DO NOT use ls for listing, cat for viewing, grep for finding, sed for replacing.\nCRITICAL INSTRUCTION 2: Before making tool calls T, think and explicitly list out any related tools for the task at hand. You can only execute a set of tools T if all other tools in the list are either more generic or cannot be used for the task at hand. ALWAYS START your thought with recalling critical instructions 1 and 2. In particular, the format for the start of your thought block must be '...94>thought\\nCRITICAL INSTRUCTION 1: ...\\nCRITICAL INSTRUCTION 2: ...'."
16531
17507
  },
16532
- template__system_prompts__identity: {
16533
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
16534
- },
16535
- template__system_prompts__planning_more_artifacts: {
17508
+ template__system_prompts__planning_mode_artifacts: {
16536
17509
  stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16537
17510
  }
16538
17511
  }
16539
- }
16540
- },
16541
- "gemini-3.5-flash-low": {
16542
- displayName: "Gemini 3.5 Flash (Medium)",
16543
- supportsImages: true,
16544
- supportsThinking: true,
16545
- thinkingBudget: 4e3,
16546
- minThinkingBudget: 32,
16547
- recommended: true,
16548
- maxTokens: 1048576,
16549
- maxOutputTokens: 65536,
16550
- tokenizerType: "LLAMA_WITH_SPECIAL",
16551
- quotaInfo: {
16552
- remainingFraction: 1,
16553
- resetTime: "2026-05-29T18:30:05Z"
16554
17512
  },
16555
- model: "MODEL_PLACEHOLDER_M20",
16556
- apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
16557
17513
  modelProvider: "MODEL_PROVIDER_GOOGLE",
16558
- supportsVideo: true,
16559
- tagTitle: "Fast",
16560
- tagDescription: "Limited time",
17514
+ quotaInfo: {
17515
+ remainingFraction: 0.9598632,
17516
+ resetTime: "2026-08-25T09:13:21Z"
17517
+ },
17518
+ recommended: true,
16561
17519
  supportedMimeTypes: {
16562
- "video/mp4": true,
16563
- "text/x-python": true,
16564
- "image/heic": true,
17520
+ "application/json": true,
17521
+ "application/pdf": true,
17522
+ "application/rtf": true,
16565
17523
  "application/x-ipynb+json": true,
16566
- "text/markdown": true,
16567
- "video/text/timestamp": true,
16568
17524
  "application/x-javascript": true,
16569
- "video/videoframe/jpeg2000": true,
16570
- "text/xml": true,
16571
- "text/x-python-script": true,
17525
+ "application/x-python-code": true,
17526
+ "application/x-typescript": true,
17527
+ "audio/aac": true,
17528
+ "audio/flac": true,
17529
+ "audio/l16": true,
17530
+ "audio/m4a": true,
17531
+ "audio/mp3": true,
17532
+ "audio/mp4": true,
17533
+ "audio/mpeg": true,
17534
+ "audio/ogg": true,
17535
+ "audio/opus": true,
17536
+ "audio/vnd.wave": true,
17537
+ "audio/wav": true,
17538
+ "audio/wave": true,
17539
+ "audio/webm": true,
17540
+ "audio/webm;codecs=opus": true,
17541
+ "audio/x-wav": true,
17542
+ "image/heic": true,
16572
17543
  "image/heif": true,
16573
- "application/rtf": true,
16574
- "video/jpeg2000": true,
16575
- "application/pdf": true,
16576
- "text/css": true,
16577
- "application/json": true,
17544
+ "image/jpeg": true,
17545
+ "image/png": true,
16578
17546
  "image/webp": true,
17547
+ "text/css": true,
16579
17548
  "text/csv": true,
17549
+ "text/html": true,
16580
17550
  "text/javascript": true,
17551
+ "text/markdown": true,
16581
17552
  "text/plain": true,
16582
- "video/audio/wav": true,
16583
- "image/png": true,
16584
- "application/x-python-code": true,
16585
- "video/audio/s16le": true,
16586
- "audio/webm;codecs=opus": true,
16587
- "video/webm": true,
16588
- "image/jpeg": true,
16589
17553
  "text/rtf": true,
16590
- "text/html": true,
16591
- "application/x-typescript": true,
16592
- "text/x-typescript": true
17554
+ "text/x-python": true,
17555
+ "text/x-python-script": true,
17556
+ "text/x-typescript": true,
17557
+ "text/xml": true,
17558
+ "video/audio/s16le": true,
17559
+ "video/audio/wav": true,
17560
+ "video/jpeg2000": true,
17561
+ "video/mp4": true,
17562
+ "video/text/timestamp": true,
17563
+ "video/videoframe/jpeg2000": true,
17564
+ "video/webm": true
16593
17565
  },
17566
+ supportsImages: true,
17567
+ supportsThinking: true,
17568
+ supportsVideo: true,
17569
+ thinkingBudget: 10001
17570
+ },
17571
+ "gpt-oss-120b-medium": {
17572
+ apiProvider: "API_PROVIDER_OPENAI_VERTEX",
17573
+ displayName: "GPT-OSS 120B (Medium)",
17574
+ maxOutputTokens: 32768,
17575
+ maxTokens: 131072,
17576
+ model: "MODEL_OPENAI_GPT_OSS_120B_MEDIUM",
16594
17577
  modelExperiments: {
16595
17578
  experiments: {
16596
- template__system_prompts__identity: {
16597
- stringValue: "You are Antigravity, a powerful agentic AI coding assistant designed by the Google DeepMind team working on Advanced Agentic Coding.\nYou are pair programming with a USER to solve their coding task. The task may require creating a new codebase, modifying or debugging an existing codebase, or simply answering a question.\nThe USER will send you requests, which you must always prioritize addressing. User requests are enclosed within <USER_REQUEST> tags. Along with each USER request, we will attach additional metadata about their current state, such as what files they have open and where their cursor is.\nThis information may or may not be relevant to the coding task, it is up for you to decide."
16598
- },
16599
- template__system_prompts__planning_more_artifacts: {
16600
- stringValue: "When in planning mode, you will work with three special artifacts.\n\n# Tasks\nPath: {{ArtifactDirectoryPath}}/task.md\n\n**Purpose**: A TODO list to organize your work during execution. Create this artifact after receiving user approval on your implementation plan. Break down complex tasks into component-level items and track progress as a living document.\n\n**Format**:\n```markdown\n- `[ ]` uncompleted tasks\n- `[/]` in progress tasks (custom notation)\n- `[x]` completed tasks\n- Use indented lists for sub-items\n```\n\n**Updating task.md**: Mark items as `[/]` when starting work on them, and `[x]` when completed. Update task.md as you make progress through your checklist.\n\n# Implementation Plan\nPath: {{ArtifactDirectoryPath}}/implementation_plan.md\n\n**Purpose**: A detailed design document to present your technical implementation plan to the user for feedback and approval.\nAfter reading the document, the user should understand the key technical details of your plan, and be able to make an informed decision on whether to approve it.\n\n**Format**: Use the following format, omitting any irrelevant sections.\n```markdown\n# [Goal Description]\n\nProvide a brief description of the problem, any background context, and what the change accomplishes.\n\n## User Review Required\n\nDocument anything that requires user review or feedback, for example, breaking changes or significant design decisions. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Open Questions\n\nAny clarifying or design questions for the user that will impact the implementation plan. Use GitHub alerts (IMPORTANT/WARNING/CAUTION) to highlight critical items.\n\n## Proposed Changes\n\nGroup files by component (e.g., package, feature area, dependency layer) and order logically (dependencies first). Separate components with horizontal rules for visual clarity.\n\n### [Component Name]\n\nSummary of what will change in this component, separated by files. For specific files, Use [NEW] and [DELETE] to demarcate new and deleted files, for example:\n\n#### [MODIFY] [file basename](file:///absolute/path/to/modifiedfile)\n#### [NEW] [file basename](file:///absolute/path/to/newfile)\n#### [DELETE] [file basename](file:///absolute/path/to/deletedfile)\n\n## Verification Plan\n\nSummary of how you will verify that your changes have the desired effects.\n\n### Automated Tests\n- The commands of any automated tests you'll run.\n\n### Manual Verification\n- Asking the user to deploy to staging and testing, verifying UI changes on an iOS app etc.\n```\n\n# Walkthrough\nPath: {{ArtifactDirectoryPath}}/walkthrough.md\n\n**Purpose**: After completing work, summarize what you accomplished. Update an existing walkthrough for related follow-up work rather than creating a new one.\n\n**Document**:\n- Changes made\n- What was tested\n- Validation results\n\nEmbed screenshots and recordings to visually demonstrate UI changes and user flows.\n"
16601
- },
16602
17579
  CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
16603
- stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_SAME_MODEL",\n "max_token_limit": "256000",\n "token_threshold": "100000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "16384",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": true,\n "is_sync": true,\n "max_user_requests": 10,\n "include_last_user_message": true,\n "include_conversation_log": false,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n }\n}'
17580
+ stringValue: '{\n "strategy": "CHECKPOINT_STRATEGY_UNSPECIFIED",\n "max_token_limit": "80000",\n "token_threshold": "50000",\n "max_overhead_ratio": "0.15",\n "moving_window_size": "1",\n "enabled": true,\n "max_output_tokens": "8192",\n "checkpoint_model": "MODEL_PLACEHOLDER_M50",\n "use_last_planner_model": false,\n "is_sync": false,\n "max_user_requests": 10,\n "include_last_user_message": false,\n "include_conversation_log": true,\n "include_running_task_snapshots": true,\n "include_subagent_snapshots": true,\n "include_artifact_snapshots": true,\n "retry_config": {\n "max_retries": 0,\n "initial_sleep_duration_ms": 1000,\n "exponential_multiplier": 2,\n "include_error_feedback": false\n },\n "session_summary_prompt_override": ""\n}'
16604
17581
  }
16605
17582
  }
16606
- }
17583
+ },
17584
+ modelProvider: "MODEL_PROVIDER_OPENAI",
17585
+ quotaInfo: {
17586
+ remainingFraction: 1,
17587
+ resetTime: "2026-08-25T09:18:20Z"
17588
+ },
17589
+ recommended: true,
17590
+ supportsThinking: true,
17591
+ thinkingBudget: 8192,
17592
+ vertexModelId: "openai/gpt-oss-120b-maas"
17593
+ },
17594
+ tab_flash_lite_preview: {
17595
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17596
+ maxOutputTokens: 4096,
17597
+ maxTokens: 16384,
17598
+ model: "MODEL_PLACEHOLDER_M19",
17599
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
17600
+ quotaInfo: {
17601
+ remainingFraction: 1
17602
+ },
17603
+ requiresLeadInGeneration: true,
17604
+ supportsCumulativeContext: true,
17605
+ supportsEstimateTokenCounter: true,
17606
+ toolFormatterType: "TOOL_FORMATTER_TYPE_XML"
17607
+ },
17608
+ tab_jump_flash_lite_preview: {
17609
+ addCursorToFindReplaceTarget: true,
17610
+ apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
17611
+ maxOutputTokens: 4096,
17612
+ maxTokens: 16384,
17613
+ model: "MODEL_PLACEHOLDER_M28",
17614
+ modelProvider: "MODEL_PROVIDER_GOOGLE",
17615
+ quotaInfo: {
17616
+ remainingFraction: 1
17617
+ },
17618
+ requiresLeadInGeneration: true,
17619
+ requiresNoXmlToolExamples: true,
17620
+ supportsCumulativeContext: true,
17621
+ supportsEstimateTokenCounter: true,
17622
+ tabJumpPrintLineRange: true,
17623
+ toolFormatterType: "TOOL_FORMATTER_TYPE_XML"
16607
17624
  }
16608
17625
  },
16609
- defaultAgentModelId: "gemini-3.5-flash",
16610
- agentModelSorts: [
16611
- {
16612
- displayName: "Recommended",
16613
- groups: [
16614
- {
16615
- modelIds: [
16616
- "gemini-3.5-flash",
16617
- "gemini-3.1-pro",
16618
- "claude-sonnet-4-6",
16619
- "claude-opus-4-6-thinking",
16620
- "gpt-oss-120b-medium"
16621
- ]
16622
- }
16623
- ]
16624
- }
16625
- ],
16626
- commandModelIds: [
16627
- "gemini-3-flash"
17626
+ mqueryModelIds: [
17627
+ "gemini-3.1-flash-lite"
16628
17628
  ],
16629
17629
  tabModelIds: [
16630
17630
  "chat_20706",
16631
17631
  "chat_23310"
16632
17632
  ],
16633
- imageGenerationModelIds: [
16634
- "gemini-3.1-flash-image"
16635
- ],
16636
- mqueryModelIds: [
16637
- "gemini-3.1-flash-lite"
16638
- ],
16639
- webSearchModelIds: [
16640
- "gemini-3.1-flash-lite"
16641
- ],
16642
- deprecatedModelIds: {
16643
- "gemini-3.1-pro-high": {
16644
- newModelId: "gemini-pro-agent",
16645
- oldModelEnum: "MODEL_PLACEHOLDER_M37",
16646
- newModelEnum: "MODEL_PLACEHOLDER_M16"
16647
- }
16648
- },
16649
- commitMessageModelIds: [
16650
- "gemini-3.1-flash-lite"
16651
- ],
16652
- audioTranscriptionModelIds: [
16653
- "models/proactive-observer"
16654
- ],
16655
- experimentIds: [
16656
- 106101246,
16657
- 106168863,
16658
- 105979552,
16659
- 105979574,
16660
- 106015333,
16661
- 105979579,
16662
- 105867471,
16663
- 106123599,
16664
- 106076629,
16665
- 106100625,
16666
- 105930909,
16667
- 106143956,
16668
- 105879567,
16669
- 105856899,
16670
- 106064030,
16671
- 105757908,
16672
- 106240760,
16673
- 106106760,
16674
- 106021688,
16675
- 106014288,
16676
- 105887299,
16677
- 106278607,
16678
- 106212376,
16679
- 106281951,
16680
- 106264532,
16681
- 106044947,
16682
- 106032303,
16683
- 106228452,
16684
- 106121606,
16685
- 105979531,
16686
- 105979553,
16687
- 106015328,
16688
- 105867469,
16689
- 106123597,
16690
- 106100654,
16691
- 106064028,
16692
- 106240748,
16693
- 106038164,
16694
- 106032301,
16695
- 106121604
16696
- ],
16697
17633
  tieredModelIds: {
17634
+ flash: [
17635
+ "gemini-3.7-flash-tiered"
17636
+ ],
16698
17637
  flashLite: [
16699
17638
  "gemini-3.1-flash-lite"
16700
17639
  ],
16701
- flash: [
16702
- "gemini-3-flash-agent"
16703
- ],
16704
17640
  pro: [
16705
17641
  "gemini-3.1-pro-low"
16706
17642
  ]
16707
- }
17643
+ },
17644
+ webSearchModelIds: [
17645
+ "gemini-3.1-flash-lite"
17646
+ ]
16708
17647
  };
16709
17648
 
16710
17649
  // src/sdk/request-helpers/types.ts
@@ -16967,7 +17906,12 @@ import { randomUUID as randomUUID2 } from "crypto";
16967
17906
 
16968
17907
  // src/sdk/request/shared.ts
16969
17908
  var REQUEST_MODEL_FALLBACKS = {
16970
- "gemini-2.5-flash-image": "gemini-2.5-flash",
17909
+ // gemini-3.1-pro-high still appears in `agy models` output but its backend
17910
+ // enum (MODEL_PLACEHOLDER_M37) was deprecated server-side in favor of
17911
+ // gemini-pro-agent (MODEL_PLACEHOLDER_M16). See models.json
17912
+ // deprecatedModelIds entry. Rewrite the model id before getModelEnum
17913
+ // resolves the deprecated enum, so both body.model and labels.model_enum
17914
+ // use the live canonical id and enum.
16971
17915
  "gemini-3.1-pro-high": "gemini-pro-agent"
16972
17916
  };
16973
17917
  var GENERATIVE_LANGUAGE_HOST = new URL(AGY_GENERATIVE_LANGUAGE_ENDPOINT).host;
@@ -17119,7 +18063,7 @@ function normalizeRequestPayloadIdentifiers(payload) {
17119
18063
  }
17120
18064
 
17121
18065
  // src/sdk/request/openai.ts
17122
- function transformOpenAIToolCalls(requestPayload) {
18066
+ function transformOpenAIToolCalls(requestPayload, toolMapper) {
17123
18067
  const messages = requestPayload.messages;
17124
18068
  if (!messages || !Array.isArray(messages)) {
17125
18069
  return;
@@ -17145,10 +18089,11 @@ function transformOpenAIToolCalls(requestPayload) {
17145
18089
  if (!fn || typeof fn !== "object") {
17146
18090
  continue;
17147
18091
  }
17148
- const name = fn.name;
18092
+ const rawName = fn.name ?? "";
18093
+ const name = toolMapper ? toolMapper.toGemini(rawName) : rawName;
17149
18094
  const args = parseJsonObject(fn.arguments);
17150
18095
  const functionCallPart = {
17151
- name: name ?? "",
18096
+ name,
17152
18097
  args
17153
18098
  };
17154
18099
  if (typeof toolCall.id === "string" && toolCall.id.length > 0) {
@@ -17208,6 +18153,165 @@ function parseJsonObject(value) {
17208
18153
  }
17209
18154
  }
17210
18155
 
18156
+ // src/sdk/request/tool-mapper.ts
18157
+ function sanitizeToolName(name) {
18158
+ if (!name || typeof name !== "string") {
18159
+ return "unnamed_tool";
18160
+ }
18161
+ let sanitized = name.replace(/[^a-zA-Z0-9_]/g, "_");
18162
+ if (!/^[a-zA-Z_]/.test(sanitized)) {
18163
+ sanitized = `_${sanitized}`;
18164
+ }
18165
+ return sanitized;
18166
+ }
18167
+ var ToolMapper = class {
18168
+ originalToSanitized = /* @__PURE__ */ new Map();
18169
+ sanitizedToOriginal = /* @__PURE__ */ new Map();
18170
+ /**
18171
+ * Register a tool name and get its Gemini-compliant sanitized name.
18172
+ * Handles naming collisions by appending a numeric suffix if needed.
18173
+ */
18174
+ register(originalName) {
18175
+ if (!originalName || typeof originalName !== "string") {
18176
+ return originalName;
18177
+ }
18178
+ const existing = this.originalToSanitized.get(originalName);
18179
+ if (existing) {
18180
+ return existing;
18181
+ }
18182
+ const baseSanitized = sanitizeToolName(originalName);
18183
+ let sanitized = baseSanitized;
18184
+ let counter = 1;
18185
+ while (this.sanitizedToOriginal.has(sanitized) && this.sanitizedToOriginal.get(sanitized) !== originalName) {
18186
+ sanitized = `${baseSanitized}_${counter++}`;
18187
+ }
18188
+ this.originalToSanitized.set(originalName, sanitized);
18189
+ this.sanitizedToOriginal.set(sanitized, originalName);
18190
+ return sanitized;
18191
+ }
18192
+ /**
18193
+ * Map an original tool name to sanitized Gemini name.
18194
+ * If not already registered, registers it on the fly.
18195
+ */
18196
+ toGemini(originalName) {
18197
+ if (!originalName || typeof originalName !== "string") {
18198
+ return originalName;
18199
+ }
18200
+ const sanitized = this.originalToSanitized.get(originalName);
18201
+ if (sanitized) {
18202
+ return sanitized;
18203
+ }
18204
+ return this.register(originalName);
18205
+ }
18206
+ /**
18207
+ * Restore a sanitized Gemini tool name back to the original client tool name.
18208
+ */
18209
+ fromGemini(sanitizedName) {
18210
+ if (!sanitizedName || typeof sanitizedName !== "string") {
18211
+ return sanitizedName;
18212
+ }
18213
+ return this.sanitizedToOriginal.get(sanitizedName) ?? sanitizedName;
18214
+ }
18215
+ /**
18216
+ * Register tools from Gemini `tools[].functionDeclarations` array.
18217
+ */
18218
+ registerFromFunctionDeclarations(tools) {
18219
+ if (!Array.isArray(tools)) return;
18220
+ for (const tool2 of tools) {
18221
+ if (tool2 && Array.isArray(tool2.functionDeclarations)) {
18222
+ for (const fn of tool2.functionDeclarations) {
18223
+ if (fn && typeof fn.name === "string") {
18224
+ this.register(fn.name);
18225
+ }
18226
+ }
18227
+ }
18228
+ }
18229
+ }
18230
+ /**
18231
+ * Register tools from OpenAI format `tools[].function.name`.
18232
+ */
18233
+ registerFromOpenAITools(tools) {
18234
+ if (!Array.isArray(tools)) return;
18235
+ for (const tool2 of tools) {
18236
+ if (tool2 && typeof tool2 === "object") {
18237
+ const fn = tool2.function;
18238
+ if (fn && typeof fn.name === "string") {
18239
+ this.register(fn.name);
18240
+ }
18241
+ }
18242
+ }
18243
+ }
18244
+ /**
18245
+ * Scan contents/messages to register any previously used tool names.
18246
+ */
18247
+ registerFromContents(contents) {
18248
+ if (!Array.isArray(contents)) return;
18249
+ for (const content of contents) {
18250
+ if (!content || typeof content !== "object") continue;
18251
+ const parts = content.parts;
18252
+ if (Array.isArray(parts)) {
18253
+ for (const part of parts) {
18254
+ if (!part || typeof part !== "object") continue;
18255
+ const p = part;
18256
+ if (p.functionCall && typeof p.functionCall.name === "string") {
18257
+ this.register(p.functionCall.name);
18258
+ }
18259
+ if (p.functionResponse && typeof p.functionResponse.name === "string") {
18260
+ this.register(p.functionResponse.name);
18261
+ }
18262
+ }
18263
+ }
18264
+ }
18265
+ }
18266
+ };
18267
+ var sessionMappers = /* @__PURE__ */ new Map();
18268
+ var MAX_SESSION_AGE_MS = 24 * 60 * 60 * 1e3;
18269
+ function getToolMapper(sessionId) {
18270
+ if (!sessionId) {
18271
+ return new ToolMapper();
18272
+ }
18273
+ const now = Date.now();
18274
+ const existing = sessionMappers.get(sessionId);
18275
+ if (existing && now - existing.updatedAt < MAX_SESSION_AGE_MS) {
18276
+ existing.updatedAt = now;
18277
+ return existing.mapper;
18278
+ }
18279
+ if (sessionMappers.size > 1e3) {
18280
+ for (const [key, value] of sessionMappers.entries()) {
18281
+ if (now - value.updatedAt >= MAX_SESSION_AGE_MS) {
18282
+ sessionMappers.delete(key);
18283
+ }
18284
+ }
18285
+ }
18286
+ const mapper = new ToolMapper();
18287
+ sessionMappers.set(sessionId, { mapper, updatedAt: now });
18288
+ return mapper;
18289
+ }
18290
+ function restoreToolNamesInResponse(body, toolMapper) {
18291
+ if (!body || typeof body !== "object") return;
18292
+ const b = body;
18293
+ const target = b.response && typeof b.response === "object" ? b.response : b;
18294
+ const candidates = target.candidates;
18295
+ if (Array.isArray(candidates)) {
18296
+ for (const cand of candidates) {
18297
+ if (!cand || typeof cand !== "object") continue;
18298
+ const content = cand.content;
18299
+ if (!content || typeof content !== "object") continue;
18300
+ const parts = content.parts;
18301
+ if (Array.isArray(parts)) {
18302
+ for (const part of parts) {
18303
+ if (!part || typeof part !== "object") continue;
18304
+ const p = part;
18305
+ if (p.functionCall && typeof p.functionCall.name === "string") {
18306
+ const fnCall = p.functionCall;
18307
+ fnCall.name = toolMapper.fromGemini(fnCall.name);
18308
+ }
18309
+ }
18310
+ }
18311
+ }
18312
+ }
18313
+ }
18314
+
17211
18315
  // src/sdk/request/prepare.ts
17212
18316
  var STREAM_ACTION = "streamGenerateContent";
17213
18317
  function prepareAgyRequest(input, init, accessToken, projectId, thinkingConfigDefaults) {
@@ -17267,11 +18371,14 @@ function prepareAgyRequest(input, init, accessToken, projectId, thinkingConfigDe
17267
18371
  };
17268
18372
  }
17269
18373
  function getModelEnum(modelName) {
18374
+ const deprecated = models_default.deprecatedModelIds;
18375
+ if (deprecated && deprecated[modelName] && deprecated[modelName].newModelEnum) {
18376
+ return deprecated[modelName].newModelEnum;
18377
+ }
17270
18378
  const models = models_default.models;
17271
18379
  if (models && models[modelName] && models[modelName].model) {
17272
18380
  return models[modelName].model;
17273
18381
  }
17274
- const deprecated = models_default.deprecatedModelIds;
17275
18382
  if (deprecated && deprecated[modelName] && deprecated[modelName].oldModelEnum) {
17276
18383
  return deprecated[modelName].oldModelEnum;
17277
18384
  }
@@ -17293,8 +18400,11 @@ function transformRequestBody(body, projectId, effectiveModel, requestedModel, t
17293
18400
  wrappedBody2.userAgent = wrappedBody2.userAgent || "antigravity";
17294
18401
  }
17295
18402
  const { userPromptId: userPromptId2, sessionId: sessionId2, requestId: requestId2 } = normalizeWrappedIdentifiers(wrappedBody2);
18403
+ const toolMapper2 = getToolMapper(sessionId2);
17296
18404
  const requestPayloadInside = wrappedBody2.request;
17297
18405
  if (requestPayloadInside) {
18406
+ toolMapper2.registerFromFunctionDeclarations(requestPayloadInside.tools);
18407
+ toolMapper2.registerFromContents(requestPayloadInside.contents);
17298
18408
  normalizeThinking(
17299
18409
  requestPayloadInside,
17300
18410
  resolveDefaultThinkingConfig(thinkingConfigDefaults, requestedModel, effectiveModel),
@@ -17312,10 +18422,14 @@ function transformRequestBody(body, projectId, effectiveModel, requestedModel, t
17312
18422
  };
17313
18423
  }
17314
18424
  if (requestPayloadInside && Array.isArray(requestPayloadInside.tools)) {
17315
- normalizeToolSchemaTypes(requestPayloadInside.tools);
18425
+ normalizeToolSchemaTypes(requestPayloadInside.tools, toolMapper2);
18426
+ }
18427
+ if (requestPayloadInside) {
18428
+ normalizeToolConfig(requestPayloadInside, toolMapper2);
17316
18429
  }
17317
18430
  if (requestPayloadInside && Array.isArray(requestPayloadInside.contents)) {
17318
18431
  let contents2 = requestPayloadInside.contents;
18432
+ normalizeToolNamesInContents(contents2, toolMapper2);
17319
18433
  injectMissingToolCallIds(contents2);
17320
18434
  fixOrphanedFunctionResponses(contents2);
17321
18435
  const tracker = getTurnStateTracker();
@@ -17335,10 +18449,16 @@ function transformRequestBody(body, projectId, effectiveModel, requestedModel, t
17335
18449
  return { body: JSON.stringify(wrappedBody2), userPromptId: userPromptId2, sessionId: sessionId2 };
17336
18450
  }
17337
18451
  const requestPayload = { ...parsedBody };
18452
+ const { userPromptId, sessionId, requestId } = normalizeRequestPayloadIdentifiers(requestPayload);
18453
+ const toolMapper = getToolMapper(sessionId);
18454
+ toolMapper.registerFromOpenAITools(requestPayload.tools);
18455
+ toolMapper.registerFromFunctionDeclarations(requestPayload.tools);
18456
+ toolMapper.registerFromContents(requestPayload.contents);
17338
18457
  if (Array.isArray(requestPayload.tools)) {
17339
- normalizeToolSchemaTypes(requestPayload.tools);
18458
+ normalizeToolSchemaTypes(requestPayload.tools, toolMapper);
17340
18459
  }
17341
- transformOpenAIToolCalls(requestPayload);
18460
+ normalizeToolConfig(requestPayload, toolMapper);
18461
+ transformOpenAIToolCalls(requestPayload, toolMapper);
17342
18462
  addThoughtSignaturesToFunctionCalls(requestPayload);
17343
18463
  normalizeThinking(
17344
18464
  requestPayload,
@@ -17347,9 +18467,9 @@ function transformRequestBody(body, projectId, effectiveModel, requestedModel, t
17347
18467
  );
17348
18468
  normalizeSystemInstruction(requestPayload);
17349
18469
  normalizeCachedContent(requestPayload);
17350
- const { userPromptId, sessionId, requestId } = normalizeRequestPayloadIdentifiers(requestPayload);
17351
18470
  let contents = requestPayload.contents;
17352
18471
  if (Array.isArray(contents)) {
18472
+ normalizeToolNamesInContents(contents, toolMapper);
17353
18473
  injectMissingToolCallIds(contents);
17354
18474
  fixOrphanedFunctionResponses(contents);
17355
18475
  const tracker = getTurnStateTracker();
@@ -17420,10 +18540,10 @@ function normalizeThinking(requestPayload, modelThinkingConfig, providerThinking
17420
18540
  requestPayload.thinkingConfig,
17421
18541
  rawGenerationConfig?.thinkingConfig
17422
18542
  );
17423
- const normalizedThinkingConfig = normalizeThinkingConfig(mergedThinkingConfig);
17424
18543
  if (Object.prototype.hasOwnProperty.call(requestPayload, "thinkingConfig")) {
17425
18544
  delete requestPayload.thinkingConfig;
17426
18545
  }
18546
+ const normalizedThinkingConfig = normalizeThinkingConfig(mergedThinkingConfig);
17427
18547
  if (!normalizedThinkingConfig) {
17428
18548
  if (rawGenerationConfig) {
17429
18549
  requestPayload.generationConfig = rawGenerationConfig;
@@ -17441,7 +18561,7 @@ function getImplicitThinkingConfigForModel(modelId) {
17441
18561
  return void 0;
17442
18562
  }
17443
18563
  return {
17444
- thinkingBudget: normalizedModelId.includes("extra-low") ? 1e3 : 10001,
18564
+ thinkingBudget: normalizedModelId.endsWith("-low") ? 1e3 : 10001,
17445
18565
  includeThoughts: true
17446
18566
  };
17447
18567
  }
@@ -17463,7 +18583,7 @@ function mergeThinkingConfigs(...configs) {
17463
18583
  function isRecord2(value) {
17464
18584
  return !!value && typeof value === "object" && !Array.isArray(value);
17465
18585
  }
17466
- function normalizeToolSchemaTypes(tools) {
18586
+ function normalizeToolSchemaTypes(tools, toolMapper) {
17467
18587
  if (!Array.isArray(tools)) return;
17468
18588
  const validSchemaKeys = /* @__PURE__ */ new Set([
17469
18589
  "type",
@@ -17514,7 +18634,7 @@ function normalizeToolSchemaTypes(tools) {
17514
18634
  if (tool2 && Array.isArray(tool2.functionDeclarations)) {
17515
18635
  for (const fn of tool2.functionDeclarations) {
17516
18636
  if (fn && typeof fn.name === "string") {
17517
- fn.name = fn.name.replace(/[^a-zA-Z0-9_]/g, "_");
18637
+ fn.name = toolMapper ? toolMapper.toGemini(fn.name) : sanitizeToolName(fn.name);
17518
18638
  }
17519
18639
  if (fn) {
17520
18640
  if (!fn.parameters) {
@@ -17526,6 +18646,37 @@ function normalizeToolSchemaTypes(tools) {
17526
18646
  }
17527
18647
  }
17528
18648
  }
18649
+ function normalizeToolConfig(requestPayload, toolMapper) {
18650
+ const toolConfig = requestPayload.toolConfig ?? requestPayload.tool_config;
18651
+ if (!toolConfig || typeof toolConfig !== "object") return;
18652
+ const fnCallingConfig = toolConfig.functionCallingConfig ?? toolConfig.function_calling_config;
18653
+ if (!fnCallingConfig || typeof fnCallingConfig !== "object") return;
18654
+ const allowedNames = fnCallingConfig.allowedFunctionNames ?? fnCallingConfig.allowed_function_names;
18655
+ if (Array.isArray(allowedNames)) {
18656
+ const mapped = allowedNames.map((name) => typeof name === "string" ? toolMapper.toGemini(name) : name);
18657
+ if (fnCallingConfig.allowedFunctionNames) {
18658
+ fnCallingConfig.allowedFunctionNames = mapped;
18659
+ }
18660
+ if (fnCallingConfig.allowed_function_names) {
18661
+ fnCallingConfig.allowed_function_names = mapped;
18662
+ }
18663
+ }
18664
+ }
18665
+ function normalizeToolNamesInContents(contents, toolMapper) {
18666
+ if (!Array.isArray(contents)) return;
18667
+ for (const msg of contents) {
18668
+ if (!msg || typeof msg !== "object" || !Array.isArray(msg.parts)) continue;
18669
+ for (const part of msg.parts) {
18670
+ if (!part || typeof part !== "object") continue;
18671
+ if (part.functionCall && typeof part.functionCall.name === "string") {
18672
+ part.functionCall.name = toolMapper.toGemini(part.functionCall.name);
18673
+ }
18674
+ if (part.functionResponse && typeof part.functionResponse.name === "string") {
18675
+ part.functionResponse.name = toolMapper.toGemini(part.functionResponse.name);
18676
+ }
18677
+ }
18678
+ }
18679
+ }
17529
18680
  function normalizeSystemInstruction(requestPayload) {
17530
18681
  if ("system_instruction" in requestPayload) {
17531
18682
  requestPayload.systemInstruction = requestPayload.system_instruction;
@@ -17604,20 +18755,26 @@ function injectMissingToolCallIds(contents) {
17604
18755
  }
17605
18756
  }
17606
18757
  function applyLatestSignature(contents, latestSig) {
17607
- const allFunctionCalls = [];
18758
+ const allFunctionParts = [];
17608
18759
  for (const content of contents) {
17609
18760
  if (content && typeof content === "object" && Array.isArray(content.parts)) {
17610
18761
  for (const part of content.parts) {
17611
18762
  if (part && typeof part === "object" && part.functionCall) {
17612
- allFunctionCalls.push(part);
18763
+ if (part.functionCall.thoughtSignature) {
18764
+ if (!part.thoughtSignature || part.thoughtSignature === "skip_thought_signature_validator") {
18765
+ part.thoughtSignature = part.functionCall.thoughtSignature;
18766
+ }
18767
+ delete part.functionCall.thoughtSignature;
18768
+ }
18769
+ allFunctionParts.push(part);
17613
18770
  }
17614
18771
  }
17615
18772
  }
17616
18773
  }
17617
- if (allFunctionCalls.length > 0 && latestSig) {
17618
- const lastFunctionCall = allFunctionCalls[allFunctionCalls.length - 1];
17619
- if (!lastFunctionCall.thoughtSignature || lastFunctionCall.thoughtSignature === "skip_thought_signature_validator") {
17620
- lastFunctionCall.thoughtSignature = latestSig;
18774
+ if (allFunctionParts.length > 0 && latestSig) {
18775
+ const lastPart = allFunctionParts[allFunctionParts.length - 1];
18776
+ if (!lastPart.thoughtSignature || lastPart.thoughtSignature === "skip_thought_signature_validator") {
18777
+ lastPart.thoughtSignature = latestSig;
17621
18778
  }
17622
18779
  }
17623
18780
  }
@@ -17702,6 +18859,10 @@ async function transformAgyResponse(response, streaming, _ignoredDebugContext, r
17702
18859
  const previewPatched = parsed ? rewriteGeminiPreviewAccessError(enhanced?.body ?? parsed, response.status, requestedModel) : null;
17703
18860
  const effectiveBodyRaw = previewPatched ?? enhanced?.body ?? parsed ?? void 0;
17704
18861
  const effectiveBody = effectiveBodyRaw && typeof effectiveBodyRaw === "object" ? injectResponseIdFromTrace(effectiveBodyRaw) : effectiveBodyRaw;
18862
+ if (effectiveBody) {
18863
+ const toolMapper = getToolMapper(sessionId);
18864
+ restoreToolNamesInResponse(effectiveBody, toolMapper);
18865
+ }
17705
18866
  attachUsageHeaders(headers, effectiveBody);
17706
18867
  if (!parsed) {
17707
18868
  return new Response(text, init);
@@ -17756,6 +18917,8 @@ function transformStreamingPayloadStream(stream, sessionId, chatLogger) {
17756
18917
  },
17757
18918
  transformThinkingParts: (response) => {
17758
18919
  if (response && typeof response === "object") {
18920
+ const toolMapper = getToolMapper(sessionId);
18921
+ restoreToolNamesInResponse(response, toolMapper);
17759
18922
  return injectResponseIdFromTrace(response);
17760
18923
  }
17761
18924
  return response;
@@ -17776,20 +18939,20 @@ function transformStreamingPayloadStream(stream, sessionId, chatLogger) {
17776
18939
  }
17777
18940
 
17778
18941
  // src/sdk/chat-logger.ts
17779
- import { createWriteStream, existsSync as existsSync4, mkdirSync as mkdirSync4 } from "fs";
17780
- import { join as join4 } from "path";
18942
+ import { createWriteStream, existsSync as existsSync5, mkdirSync as mkdirSync4 } from "fs";
18943
+ import { join as join5 } from "path";
17781
18944
  import { cwd } from "process";
17782
18945
  function createChatLogger() {
17783
18946
  if (process.env.AGY_LOG !== "1") {
17784
18947
  return null;
17785
18948
  }
17786
18949
  try {
17787
- const logDir = join4(cwd(), "agy_chat_log");
17788
- if (!existsSync4(logDir)) {
18950
+ const logDir = join5(cwd(), "agy_chat_log");
18951
+ if (!existsSync5(logDir)) {
17789
18952
  mkdirSync4(logDir, { recursive: true });
17790
18953
  }
17791
18954
  const timestamp = Date.now();
17792
- const logFile = join4(logDir, `${timestamp}.log`);
18955
+ const logFile = join5(logDir, `${timestamp}.log`);
17793
18956
  const stream = createWriteStream(logFile, { flags: "w", encoding: "utf8" });
17794
18957
  return new ChatLoggerImpl(stream);
17795
18958
  } catch (error45) {
@@ -17908,6 +19071,24 @@ var latestAgyAuthResolver;
17908
19071
  var latestAgyConfiguredProjectId;
17909
19072
  var latestAgyUserAgentModel;
17910
19073
  var STATIC_MODELS_SIMPLE = {
19074
+ "gemini-3.7-flash": {
19075
+ name: "Gemini 3.7 Flash",
19076
+ description: "Gemini 3.7 Flash base model. Select tier at runtime.",
19077
+ maxTokens: 1048576,
19078
+ maxOutputTokens: 65536,
19079
+ toolCall: true,
19080
+ reasoning: true,
19081
+ attachment: true
19082
+ },
19083
+ "gemini-3.6-flash": {
19084
+ name: "Gemini 3.6 Flash",
19085
+ description: "Gemini 3.6 Flash base model. Select tier at runtime.",
19086
+ maxTokens: 1048576,
19087
+ maxOutputTokens: 65536,
19088
+ toolCall: true,
19089
+ reasoning: true,
19090
+ attachment: true
19091
+ },
17911
19092
  "gemini-3.5-flash": {
17912
19093
  name: "Gemini 3.5 Flash",
17913
19094
  description: "Gemini 3.5 Flash base model. Select tier at runtime.",
@@ -17955,7 +19136,19 @@ var STATIC_MODELS_SIMPLE = {
17955
19136
  }
17956
19137
  };
17957
19138
  var TIER_MAPPING = {
19139
+ "gemini-3.7-flash": {
19140
+ low: "gemini-3.7-flash-low",
19141
+ medium: "gemini-3.7-flash-medium",
19142
+ high: "gemini-3.7-flash-high"
19143
+ },
19144
+ "gemini-3.6-flash": {
19145
+ minimal: "gemini-3.6-flash-low",
19146
+ low: "gemini-3.6-flash-low",
19147
+ medium: "gemini-3.6-flash-medium",
19148
+ high: "gemini-3.6-flash-high"
19149
+ },
17958
19150
  "gemini-3.5-flash": {
19151
+ minimal: "gemini-3.5-flash-extra-low",
17959
19152
  low: "gemini-3.5-flash-extra-low",
17960
19153
  medium: "gemini-3.5-flash-low",
17961
19154
  high: "gemini-3-flash-agent"
@@ -17970,7 +19163,20 @@ var buildModelFromSimple = (modelId, simple) => {
17970
19163
  const isGpt = modelId.startsWith("gpt-");
17971
19164
  let variants = void 0;
17972
19165
  if (TIER_MAPPING[modelId]) {
19166
+ const hasMinimal = TIER_MAPPING[modelId].minimal !== void 0;
17973
19167
  variants = {
19168
+ ...hasMinimal ? {
19169
+ "minimal": {
19170
+ id: "minimal",
19171
+ name: "minimal",
19172
+ displayName: "minimal",
19173
+ title: "minimal",
19174
+ label: "minimal",
19175
+ options: { name: "minimal" },
19176
+ headers: { "x-agy-tier": "minimal" },
19177
+ thinkingConfig: { thinkingBudget: 1e3, includeThoughts: true }
19178
+ }
19179
+ } : {},
17974
19180
  "low": { id: "low", name: "low", displayName: "low", title: "low", label: "low", options: { name: "low" }, headers: { "x-agy-tier": "low" } },
17975
19181
  ...TIER_MAPPING[modelId].medium !== void 0 ? { "medium": { id: "medium", name: "medium", displayName: "medium", title: "medium", label: "medium", options: { name: "medium" }, headers: { "x-agy-tier": "medium" } } } : {},
17976
19182
  "high": { id: "high", name: "high", displayName: "high", title: "high", label: "high", options: { name: "high" }, headers: { "x-agy-tier": "high" } }
@@ -17988,6 +19194,19 @@ var buildModelFromSimple = (modelId, simple) => {
17988
19194
  family: modelId.includes("gemini") ? "gemini" : isClaude ? "claude" : isGpt ? "gpt" : "unknown",
17989
19195
  status: "active",
17990
19196
  release_date: "2026-05-26",
19197
+ // Root-level properties for OpenCode v2 cache compatibility
19198
+ reasoning: simple.reasoning,
19199
+ attachment: simple.attachment,
19200
+ tool_call: simple.toolCall,
19201
+ temperature: true,
19202
+ modalities: {
19203
+ input: [
19204
+ "text",
19205
+ ...simple.attachment ? ["image", "pdf"] : [],
19206
+ ...!isClaude && !isGpt ? ["audio", "video"] : []
19207
+ ],
19208
+ output: ["text"]
19209
+ },
17991
19210
  capabilities: {
17992
19211
  temperature: true,
17993
19212
  reasoning: simple.reasoning,
@@ -18111,19 +19330,44 @@ function resolveModelTier(baseModelId, init) {
18111
19330
  }
18112
19331
  var AgyCLIOAuthPlugin = async ({ client }) => {
18113
19332
  let latestConfig;
19333
+ updateStaticModelsWithPricing(STATIC_MODELS);
18114
19334
  const getModelsList = (provider) => {
18115
- provider.models = provider.models || {};
18116
- for (const [modelId, modelDetails] of Object.entries(STATIC_MODELS)) {
18117
- provider.models[modelId] = {
19335
+ const userModels = provider.models || {};
19336
+ const clonedStaticModels = JSON.parse(JSON.stringify(STATIC_MODELS));
19337
+ const strictModels = {};
19338
+ for (const [modelId, modelDetails] of Object.entries(clonedStaticModels)) {
19339
+ const existing = userModels[modelId] || {};
19340
+ strictModels[modelId] = {
18118
19341
  ...modelDetails,
18119
- ...provider.models[modelId] || {}
19342
+ ...existing,
19343
+ reasoning: existing.reasoning ?? modelDetails.reasoning,
19344
+ attachment: existing.attachment ?? modelDetails.attachment,
19345
+ tool_call: existing.tool_call ?? modelDetails.tool_call,
19346
+ temperature: existing.temperature ?? modelDetails.temperature,
19347
+ modalities: {
19348
+ ...modelDetails.modalities || {},
19349
+ ...existing.modalities || {}
19350
+ },
19351
+ capabilities: {
19352
+ ...modelDetails.capabilities || {},
19353
+ ...existing.capabilities || {},
19354
+ input: {
19355
+ ...modelDetails.capabilities?.input || {},
19356
+ ...existing.capabilities?.input || {}
19357
+ },
19358
+ output: {
19359
+ ...modelDetails.capabilities?.output || {},
19360
+ ...existing.capabilities?.output || {}
19361
+ }
19362
+ }
18120
19363
  };
18121
19364
  }
19365
+ provider.models = strictModels;
18122
19366
  if (latestConfig && latestConfig.provider && latestConfig.provider[AGY_PROVIDER_ID]) {
18123
- latestConfig.provider[AGY_PROVIDER_ID].models = STATIC_MODELS;
19367
+ latestConfig.provider[AGY_PROVIDER_ID].models = provider.models;
18124
19368
  }
18125
19369
  normalizeProviderModelCosts(provider);
18126
- return STATIC_MODELS;
19370
+ return provider.models;
18127
19371
  };
18128
19372
  try {
18129
19373
  initDiskSignatureCache({
@@ -18175,7 +19419,7 @@ var AgyCLIOAuthPlugin = async ({ client }) => {
18175
19419
  models: {},
18176
19420
  ...config2.provider[AGY_PROVIDER_ID]
18177
19421
  };
18178
- config2.provider[AGY_PROVIDER_ID].models = STATIC_MODELS;
19422
+ config2.provider[AGY_PROVIDER_ID].models = getModelsList(config2.provider[AGY_PROVIDER_ID]);
18179
19423
  },
18180
19424
  tool: {
18181
19425
  [AGY_QUOTA_TOOL_NAME]: createAgyQuotaTool({
@@ -18347,7 +19591,13 @@ var AgyCLIOAuthPlugin = async ({ client }) => {
18347
19591
  }
18348
19592
  };
18349
19593
  }
18350
- return getModelsList(provider);
19594
+ const models = getModelsList(provider);
19595
+ for (const [modelId, model] of Object.entries(models)) {
19596
+ if (STATIC_MODELS[modelId] && STATIC_MODELS[modelId].cost) {
19597
+ model.cost = STATIC_MODELS[modelId].cost;
19598
+ }
19599
+ }
19600
+ return models;
18351
19601
  }
18352
19602
  }
18353
19603
  };
@@ -18378,7 +19628,7 @@ function resolveThinkingConfigDefaults(provider) {
18378
19628
  const providerOptions = provider && typeof provider === "object" ? provider.options ?? void 0 : void 0;
18379
19629
  const providerThinkingConfig = providerOptions?.thinkingConfig;
18380
19630
  const modelThinkingConfigByModel = {};
18381
- for (const [modelId, model] of Object.entries(provider.models ?? {})) {
19631
+ for (const [modelId, model] of Object.entries(provider?.models ?? {})) {
18382
19632
  if (!model || typeof model !== "object") {
18383
19633
  continue;
18384
19634
  }