@benjamolina/opencode-antigravity-guard 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +773 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/antigravity/oauth.d.ts +31 -0
  8. package/dist/src/antigravity/oauth.d.ts.map +1 -0
  9. package/dist/src/antigravity/oauth.js +171 -0
  10. package/dist/src/antigravity/oauth.js.map +1 -0
  11. package/dist/src/constants.d.ts +139 -0
  12. package/dist/src/constants.d.ts.map +1 -0
  13. package/dist/src/constants.js +220 -0
  14. package/dist/src/constants.js.map +1 -0
  15. package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
  16. package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
  17. package/dist/src/hooks/auto-update-checker/cache.js +71 -0
  18. package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
  19. package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
  20. package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
  21. package/dist/src/hooks/auto-update-checker/checker.js +234 -0
  22. package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
  23. package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
  24. package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
  25. package/dist/src/hooks/auto-update-checker/constants.js +23 -0
  26. package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
  27. package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
  28. package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
  29. package/dist/src/hooks/auto-update-checker/index.js +122 -0
  30. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/logging.d.ts +3 -0
  32. package/dist/src/hooks/auto-update-checker/logging.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/logging.js +9 -0
  34. package/dist/src/hooks/auto-update-checker/logging.js.map +1 -0
  35. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  36. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  37. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  38. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  39. package/dist/src/plugin/accounts.d.ts +180 -0
  40. package/dist/src/plugin/accounts.d.ts.map +1 -0
  41. package/dist/src/plugin/accounts.js +1045 -0
  42. package/dist/src/plugin/accounts.js.map +1 -0
  43. package/dist/src/plugin/api-key.d.ts +90 -0
  44. package/dist/src/plugin/api-key.d.ts.map +1 -0
  45. package/dist/src/plugin/api-key.js +544 -0
  46. package/dist/src/plugin/api-key.js.map +1 -0
  47. package/dist/src/plugin/auth.d.ts +21 -0
  48. package/dist/src/plugin/auth.d.ts.map +1 -0
  49. package/dist/src/plugin/auth.js +46 -0
  50. package/dist/src/plugin/auth.js.map +1 -0
  51. package/dist/src/plugin/cache/index.d.ts +5 -0
  52. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  53. package/dist/src/plugin/cache/index.js +5 -0
  54. package/dist/src/plugin/cache/index.js.map +1 -0
  55. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  56. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  57. package/dist/src/plugin/cache/signature-cache.js +375 -0
  58. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  59. package/dist/src/plugin/cache.d.ts +44 -0
  60. package/dist/src/plugin/cache.d.ts.map +1 -0
  61. package/dist/src/plugin/cache.js +200 -0
  62. package/dist/src/plugin/cache.js.map +1 -0
  63. package/dist/src/plugin/cli.d.ts +31 -0
  64. package/dist/src/plugin/cli.d.ts.map +1 -0
  65. package/dist/src/plugin/cli.js +135 -0
  66. package/dist/src/plugin/cli.js.map +1 -0
  67. package/dist/src/plugin/config/index.d.ts +16 -0
  68. package/dist/src/plugin/config/index.d.ts.map +1 -0
  69. package/dist/src/plugin/config/index.js +16 -0
  70. package/dist/src/plugin/config/index.js.map +1 -0
  71. package/dist/src/plugin/config/loader.d.ts +36 -0
  72. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  73. package/dist/src/plugin/config/loader.js +140 -0
  74. package/dist/src/plugin/config/loader.js.map +1 -0
  75. package/dist/src/plugin/config/models.d.ts +43 -0
  76. package/dist/src/plugin/config/models.d.ts.map +1 -0
  77. package/dist/src/plugin/config/models.js +176 -0
  78. package/dist/src/plugin/config/models.js.map +1 -0
  79. package/dist/src/plugin/config/schema.d.ts +177 -0
  80. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  81. package/dist/src/plugin/config/schema.js +507 -0
  82. package/dist/src/plugin/config/schema.js.map +1 -0
  83. package/dist/src/plugin/config/updater.d.ts +55 -0
  84. package/dist/src/plugin/config/updater.d.ts.map +1 -0
  85. package/dist/src/plugin/config/updater.js +125 -0
  86. package/dist/src/plugin/config/updater.js.map +1 -0
  87. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  88. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  89. package/dist/src/plugin/core/streaming/index.js +3 -0
  90. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  91. package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
  92. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  93. package/dist/src/plugin/core/streaming/transformer.js +271 -0
  94. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  95. package/dist/src/plugin/core/streaming/types.d.ts +27 -0
  96. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  97. package/dist/src/plugin/core/streaming/types.js +1 -0
  98. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  99. package/dist/src/plugin/debug.d.ts +99 -0
  100. package/dist/src/plugin/debug.d.ts.map +1 -0
  101. package/dist/src/plugin/debug.js +400 -0
  102. package/dist/src/plugin/debug.js.map +1 -0
  103. package/dist/src/plugin/errors.d.ts +28 -0
  104. package/dist/src/plugin/errors.d.ts.map +1 -0
  105. package/dist/src/plugin/errors.js +42 -0
  106. package/dist/src/plugin/errors.js.map +1 -0
  107. package/dist/src/plugin/fingerprint.d.ts +70 -0
  108. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  109. package/dist/src/plugin/fingerprint.js +138 -0
  110. package/dist/src/plugin/fingerprint.js.map +1 -0
  111. package/dist/src/plugin/image-saver.d.ts +25 -0
  112. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  113. package/dist/src/plugin/image-saver.js +86 -0
  114. package/dist/src/plugin/image-saver.js.map +1 -0
  115. package/dist/src/plugin/logger.d.ts +36 -0
  116. package/dist/src/plugin/logger.d.ts.map +1 -0
  117. package/dist/src/plugin/logger.js +71 -0
  118. package/dist/src/plugin/logger.js.map +1 -0
  119. package/dist/src/plugin/logging-utils.d.ts +23 -0
  120. package/dist/src/plugin/logging-utils.d.ts.map +1 -0
  121. package/dist/src/plugin/logging-utils.js +92 -0
  122. package/dist/src/plugin/logging-utils.js.map +1 -0
  123. package/dist/src/plugin/project.d.ts +33 -0
  124. package/dist/src/plugin/project.d.ts.map +1 -0
  125. package/dist/src/plugin/project.js +234 -0
  126. package/dist/src/plugin/project.js.map +1 -0
  127. package/dist/src/plugin/quota.d.ts +59 -0
  128. package/dist/src/plugin/quota.d.ts.map +1 -0
  129. package/dist/src/plugin/quota.js +295 -0
  130. package/dist/src/plugin/quota.js.map +1 -0
  131. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  132. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  133. package/dist/src/plugin/recovery/constants.js +43 -0
  134. package/dist/src/plugin/recovery/constants.js.map +1 -0
  135. package/dist/src/plugin/recovery/index.d.ts +12 -0
  136. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  137. package/dist/src/plugin/recovery/index.js +12 -0
  138. package/dist/src/plugin/recovery/index.js.map +1 -0
  139. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  140. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  141. package/dist/src/plugin/recovery/storage.js +354 -0
  142. package/dist/src/plugin/recovery/storage.js.map +1 -0
  143. package/dist/src/plugin/recovery/types.d.ts +116 -0
  144. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  145. package/dist/src/plugin/recovery/types.js +6 -0
  146. package/dist/src/plugin/recovery/types.js.map +1 -0
  147. package/dist/src/plugin/recovery.d.ts +61 -0
  148. package/dist/src/plugin/recovery.d.ts.map +1 -0
  149. package/dist/src/plugin/recovery.js +381 -0
  150. package/dist/src/plugin/recovery.js.map +1 -0
  151. package/dist/src/plugin/refresh-queue.d.ts +100 -0
  152. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  153. package/dist/src/plugin/refresh-queue.js +247 -0
  154. package/dist/src/plugin/refresh-queue.js.map +1 -0
  155. package/dist/src/plugin/request-helpers.d.ts +270 -0
  156. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  157. package/dist/src/plugin/request-helpers.js +2384 -0
  158. package/dist/src/plugin/request-helpers.js.map +1 -0
  159. package/dist/src/plugin/request.d.ts +116 -0
  160. package/dist/src/plugin/request.d.ts.map +1 -0
  161. package/dist/src/plugin/request.js +1626 -0
  162. package/dist/src/plugin/request.js.map +1 -0
  163. package/dist/src/plugin/rotation.d.ts +169 -0
  164. package/dist/src/plugin/rotation.d.ts.map +1 -0
  165. package/dist/src/plugin/rotation.js +328 -0
  166. package/dist/src/plugin/rotation.js.map +1 -0
  167. package/dist/src/plugin/search.d.ts +32 -0
  168. package/dist/src/plugin/search.d.ts.map +1 -0
  169. package/dist/src/plugin/search.js +195 -0
  170. package/dist/src/plugin/search.js.map +1 -0
  171. package/dist/src/plugin/server.d.ts +23 -0
  172. package/dist/src/plugin/server.d.ts.map +1 -0
  173. package/dist/src/plugin/server.js +324 -0
  174. package/dist/src/plugin/server.js.map +1 -0
  175. package/dist/src/plugin/storage.d.ts +137 -0
  176. package/dist/src/plugin/storage.d.ts.map +1 -0
  177. package/dist/src/plugin/storage.js +637 -0
  178. package/dist/src/plugin/storage.js.map +1 -0
  179. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  180. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  181. package/dist/src/plugin/stores/signature-store.js +25 -0
  182. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  183. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  184. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  185. package/dist/src/plugin/thinking-recovery.js +316 -0
  186. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  187. package/dist/src/plugin/token.d.ts +19 -0
  188. package/dist/src/plugin/token.d.ts.map +1 -0
  189. package/dist/src/plugin/token.js +128 -0
  190. package/dist/src/plugin/token.js.map +1 -0
  191. package/dist/src/plugin/transform/claude.d.ts +80 -0
  192. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  193. package/dist/src/plugin/transform/claude.js +265 -0
  194. package/dist/src/plugin/transform/claude.js.map +1 -0
  195. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
  196. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  197. package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
  198. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  199. package/dist/src/plugin/transform/gemini.d.ts +100 -0
  200. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  201. package/dist/src/plugin/transform/gemini.js +482 -0
  202. package/dist/src/plugin/transform/gemini.js.map +1 -0
  203. package/dist/src/plugin/transform/index.d.ts +15 -0
  204. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  205. package/dist/src/plugin/transform/index.js +14 -0
  206. package/dist/src/plugin/transform/index.js.map +1 -0
  207. package/dist/src/plugin/transform/model-resolver.d.ts +96 -0
  208. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  209. package/dist/src/plugin/transform/model-resolver.js +444 -0
  210. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  211. package/dist/src/plugin/transform/types.d.ts +111 -0
  212. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  213. package/dist/src/plugin/transform/types.js +1 -0
  214. package/dist/src/plugin/transform/types.js.map +1 -0
  215. package/dist/src/plugin/types.d.ts +105 -0
  216. package/dist/src/plugin/types.d.ts.map +1 -0
  217. package/dist/src/plugin/types.js +1 -0
  218. package/dist/src/plugin/types.js.map +1 -0
  219. package/dist/src/plugin/ui/ansi.d.ts +32 -0
  220. package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
  221. package/dist/src/plugin/ui/ansi.js +52 -0
  222. package/dist/src/plugin/ui/ansi.js.map +1 -0
  223. package/dist/src/plugin/ui/auth-menu.d.ts +33 -0
  224. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
  225. package/dist/src/plugin/ui/auth-menu.js +110 -0
  226. package/dist/src/plugin/ui/auth-menu.js.map +1 -0
  227. package/dist/src/plugin/ui/confirm.d.ts +2 -0
  228. package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
  229. package/dist/src/plugin/ui/confirm.js +15 -0
  230. package/dist/src/plugin/ui/confirm.js.map +1 -0
  231. package/dist/src/plugin/ui/select.d.ts +23 -0
  232. package/dist/src/plugin/ui/select.d.ts.map +1 -0
  233. package/dist/src/plugin/ui/select.js +254 -0
  234. package/dist/src/plugin/ui/select.js.map +1 -0
  235. package/dist/src/plugin/version.d.ts +19 -0
  236. package/dist/src/plugin/version.d.ts.map +1 -0
  237. package/dist/src/plugin/version.js +80 -0
  238. package/dist/src/plugin/version.js.map +1 -0
  239. package/dist/src/plugin.d.ts +50 -0
  240. package/dist/src/plugin.d.ts.map +1 -0
  241. package/dist/src/plugin.js +3378 -0
  242. package/dist/src/plugin.js.map +1 -0
  243. package/package.json +70 -0
@@ -0,0 +1,544 @@
1
+ import { extractVariantThinkingConfig } from "./request-helpers.js";
2
+ import { applyGeminiTransforms, isGemini3Model, mapAntigravityModelToPublicApi, resolveModelForHeaderStyle } from "./transform/index.js";
3
+ const rateLimitedUntilByKey = new Map();
4
+ let cursor = 0;
5
+ const GEMINI_MODELS_LIST_TIMEOUT_MS = 10000;
6
+ const GEMINI_MODELS_LIST_MAX_PAGES = 20;
7
+ export function resetAgySdkCredentialStateForTests() {
8
+ rateLimitedUntilByKey.clear();
9
+ cursor = 0;
10
+ }
11
+ async function requestBodyText(request) {
12
+ if (!request.body)
13
+ return undefined;
14
+ try {
15
+ return await request.clone().text();
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ function splitEnvList(value) {
22
+ if (!value)
23
+ return [];
24
+ return value
25
+ .split(",")
26
+ .map((part) => part.trim())
27
+ .filter(Boolean);
28
+ }
29
+ function dedupeCredentials(credentials) {
30
+ const seen = new Set();
31
+ const result = [];
32
+ for (const credential of credentials) {
33
+ if (seen.has(credential.apiKey))
34
+ continue;
35
+ seen.add(credential.apiKey);
36
+ result.push(credential);
37
+ }
38
+ return result;
39
+ }
40
+ export function getAgySdkCredentials(config, auth) {
41
+ if (!config.agy_sdk.enabled)
42
+ return [];
43
+ const credentials = [];
44
+ if (auth?.key?.trim()) {
45
+ credentials.push({ label: "opencode api key", apiKey: auth.key.trim() });
46
+ }
47
+ for (const project of config.agy_sdk.cloud_projects) {
48
+ if (project.enabled === false)
49
+ continue;
50
+ credentials.push({
51
+ label: project.label?.trim() || project.project_id?.trim() || "cloud project",
52
+ apiKey: project.api_key.trim(),
53
+ projectId: project.project_id?.trim() || undefined,
54
+ });
55
+ }
56
+ const envKeys = splitEnvList(process.env.OPENCODE_ANTIGRAVITY_API_KEYS);
57
+ const envCandidates = [
58
+ process.env.GEMINI_API_KEY,
59
+ process.env.GOOGLE_API_KEY,
60
+ ...envKeys,
61
+ ]
62
+ .map((apiKey) => apiKey?.trim())
63
+ .filter((apiKey) => Boolean(apiKey));
64
+ for (const apiKey of envCandidates) {
65
+ credentials.push({ label: "environment", apiKey });
66
+ }
67
+ return dedupeCredentials(credentials);
68
+ }
69
+ export function selectAgySdkCredential(credentials) {
70
+ if (credentials.length === 0)
71
+ return null;
72
+ const now = Date.now();
73
+ for (let attempts = 0; attempts < credentials.length; attempts += 1) {
74
+ const index = cursor % credentials.length;
75
+ cursor += 1;
76
+ const credential = credentials[index];
77
+ if (!credential)
78
+ continue;
79
+ const limitedUntil = rateLimitedUntilByKey.get(credential.apiKey) ?? 0;
80
+ if (limitedUntil <= now) {
81
+ return credential;
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ export function markAgySdkCredentialRateLimited(credential, retryAfterMs) {
87
+ rateLimitedUntilByKey.set(credential.apiKey, Date.now() + Math.max(1000, retryAfterMs));
88
+ }
89
+ function retryAfterMsFromResponse(response, fallbackMs) {
90
+ const retryAfter = response.headers.get("retry-after");
91
+ if (!retryAfter)
92
+ return fallbackMs;
93
+ const parsed = Number.parseInt(retryAfter, 10);
94
+ if (Number.isFinite(parsed) && parsed > 0) {
95
+ return parsed * 1000;
96
+ }
97
+ return fallbackMs;
98
+ }
99
+ export function isApiKeyAuth(auth) {
100
+ if (!auth || typeof auth !== "object")
101
+ return false;
102
+ const candidate = auth;
103
+ return (candidate.type === "api" || candidate.type === "api_key") && typeof candidate.key === "string";
104
+ }
105
+ /**
106
+ * Classifies a model as servable by the public Gemini API via the api-key path,
107
+ * either natively or via translation in `prepareAgySdkGeminiRequest`.
108
+ *
109
+ * Strips the optional `antigravity-` prefix and any tier suffix (-minimal/-low/
110
+ * -medium/-high), then checks:
111
+ * - Claude models: never servable on the public API → returns false.
112
+ * - Has an explicit translation (e.g. `gemini-3.1-pro` → `gemini-3.1-pro-preview`)
113
+ * via `mapAntigravityModelToPublicApi` → routable.
114
+ * - Stripped id is NOT in the Antigravity-only denylist → assumed public-API
115
+ * native (covers `antigravity-gemini-3.5-flash` → `gemini-3.5-flash`, which
116
+ * the public API serves bare).
117
+ *
118
+ * Shared by `isAgySdkSupportedRequest` (positive gate) and
119
+ * `isAntigravityOnlyGenerativeLanguageRequest` (negative gate / synthetic-404 trigger).
120
+ */
121
+ function canRouteAsPublicGeminiApiModel(model) {
122
+ const m = model.toLowerCase();
123
+ if (m.includes("claude"))
124
+ return false;
125
+ const isAntigravityPrefixed = m.startsWith("antigravity-");
126
+ const stripped = m.replace(/^antigravity-/, "").replace(/-(minimal|low|medium|high)$/, "");
127
+ // Explicit translation (e.g. gemini-3.1-pro → gemini-3.1-pro-preview) → routable.
128
+ if (mapAntigravityModelToPublicApi(stripped))
129
+ return true;
130
+ // For `antigravity-` prefixed inputs without a known mapping, require the
131
+ // stripped id to look like a Gemini-family id. Unknown antigravity-* ids
132
+ // (typos, hypotheticals) fall through to `isAntigravityOnlyGenerativeLanguageRequest`
133
+ // which short-circuits with the synthetic OAuth re-auth guidance — better UX
134
+ // than raw-forwarding to the public Gemini API and surfacing Google's 404.
135
+ if (isAntigravityPrefixed) {
136
+ return /^gemini-/.test(stripped) && !ANTIGRAVITY_ONLY_BARE_GEMINI_IDS.has(stripped);
137
+ }
138
+ // Bare (non-prefixed) inputs not in the Antigravity-only denylist are
139
+ // assumed to be public-API natives (e.g. gemini-3.5-flash, gemini-2.5-pro).
140
+ return !ANTIGRAVITY_ONLY_BARE_GEMINI_IDS.has(stripped);
141
+ }
142
+ /**
143
+ * Returns true when the request can be routed to the public Gemini API
144
+ * (`generativelanguage.googleapis.com`) via the api-key path — either natively
145
+ * or via translation in `prepareAgySdkGeminiRequest`.
146
+ *
147
+ * Antigravity-only models with no public-API equivalent (Claude ids, unmapped
148
+ * antigravity- prefixed non-Gemini ids) are excluded: the caller should stay on
149
+ * the OAuth Antigravity path or short-circuit with a synthetic error.
150
+ */
151
+ export function isAgySdkSupportedRequest(urlString) {
152
+ let url;
153
+ try {
154
+ url = new URL(urlString);
155
+ }
156
+ catch {
157
+ return false;
158
+ }
159
+ if (url.hostname !== "generativelanguage.googleapis.com")
160
+ return false;
161
+ const model = extractGeminiModelFromUrl(url.toString());
162
+ if (!model || !model.toLowerCase().includes("gemini"))
163
+ return false;
164
+ return canRouteAsPublicGeminiApiModel(model);
165
+ }
166
+ /**
167
+ * Returns true when the URL targets `generativelanguage.googleapis.com` with an
168
+ * Antigravity-only model that CANNOT be served by the public Gemini API even
169
+ * with translation — Claude ids and unmapped antigravity- prefixed non-Gemini ids.
170
+ *
171
+ * Translatable Antigravity-only Gemini ids (e.g. `antigravity-gemini-3.1-pro`,
172
+ * bare `gemini-3.1-pro`) and Antigravity-prefixed public-API natives (e.g.
173
+ * `antigravity-gemini-3.5-flash` → `gemini-3.5-flash`) return false here —
174
+ * `prepareAgySdkGeminiRequest` rewrites them to the public-API equivalent.
175
+ *
176
+ * Use this in API-key-only auth paths to short-circuit with a helpful synthetic
177
+ * error (via `createAntigravityOnlyModelErrorResponse`) instead of forwarding to
178
+ * the public Gemini API where it would 404.
179
+ */
180
+ export function isAntigravityOnlyGenerativeLanguageRequest(urlString) {
181
+ let url;
182
+ try {
183
+ url = new URL(urlString);
184
+ }
185
+ catch {
186
+ return false;
187
+ }
188
+ if (url.hostname !== "generativelanguage.googleapis.com")
189
+ return false;
190
+ const model = extractGeminiModelFromUrl(url.toString());
191
+ if (!model)
192
+ return false;
193
+ return isLikelyAntigravityOnlyModel(model) && !canRouteAsPublicGeminiApiModel(model);
194
+ }
195
+ /**
196
+ * Extracts the requested model id from a `generativelanguage.googleapis.com`
197
+ * URL (e.g. `.../v1beta/models/gemini-3.1-pro:generateContent` -> `gemini-3.1-pro`).
198
+ * Returns `undefined` when the URL is malformed or doesn't match the model path.
199
+ */
200
+ export function extractRequestedGeminiModel(urlString) {
201
+ return extractGeminiModelFromUrl(urlString);
202
+ }
203
+ /**
204
+ * Public Gemini API models commonly available on `generativelanguage.googleapis.com/v1beta`.
205
+ * Used to suggest alternatives when an Antigravity-only model is requested through
206
+ * the API-key path. Kept short and stable; the live registry has more, but these
207
+ * are the high-signal choices for the error hint.
208
+ *
209
+ * Source: GET https://generativelanguage.googleapis.com/v1beta/models (May 2026).
210
+ */
211
+ const PUBLIC_GEMINI_API_MODEL_SUGGESTIONS = [
212
+ "gemini-2.5-pro",
213
+ "gemini-2.5-flash",
214
+ "gemini-3.1-pro-preview",
215
+ "gemini-3.1-flash-lite",
216
+ "gemini-3.5-flash",
217
+ ];
218
+ /**
219
+ * Bare Gemini ids that the Antigravity Code Assist backend serves but the public
220
+ * Gemini API does NOT expose. Cross-checked against
221
+ * `GET https://generativelanguage.googleapis.com/v1beta/models` (May 2026).
222
+ *
223
+ * The public registry DOES include `-preview` / `-lite` / `-image` / `-tts` variants,
224
+ * and notably `gemini-3.5-flash` as a bare id, so this list stays explicit rather
225
+ * than pattern-based to avoid false positives.
226
+ */
227
+ const ANTIGRAVITY_ONLY_BARE_GEMINI_IDS = new Set([
228
+ "gemini-3-pro",
229
+ "gemini-3-flash",
230
+ "gemini-3.1-pro",
231
+ "gemini-3.1-flash",
232
+ ]);
233
+ /**
234
+ * Classifies models that the Antigravity Code Assist backend serves but the public
235
+ * Gemini API (v1beta on `generativelanguage.googleapis.com`) does not.
236
+ *
237
+ * Anything with the `antigravity-` prefix or any Claude model is OAuth-only by
238
+ * construction. For Gemini ids we use an explicit denylist (see
239
+ * `ANTIGRAVITY_ONLY_BARE_GEMINI_IDS`).
240
+ */
241
+ export function isLikelyAntigravityOnlyModel(model) {
242
+ const m = model.toLowerCase();
243
+ if (m.startsWith("antigravity-"))
244
+ return true;
245
+ if (m.includes("claude"))
246
+ return true;
247
+ return ANTIGRAVITY_ONLY_BARE_GEMINI_IDS.has(m);
248
+ }
249
+ /**
250
+ * Builds the human-facing guidance message used by both
251
+ * `enhanceAgySdkErrorResponse` (post-hoc, after a public-API 404) and
252
+ * `createAntigravityOnlyModelErrorResponse` (pre-flight, before the round trip).
253
+ *
254
+ * When `originalMessage` is omitted, the trailing "(Underlying Gemini API error: ...)"
255
+ * line is dropped so synthetic errors don't pretend to have a real upstream cause.
256
+ */
257
+ function buildAntigravityModelGuidanceMessage(requestedModel, originalMessage) {
258
+ const suggestions = PUBLIC_GEMINI_API_MODEL_SUGGESTIONS.join(", ");
259
+ const antigravityOnly = isLikelyAntigravityOnlyModel(requestedModel);
260
+ const lines = [
261
+ `Model '${requestedModel}' was sent to the public Gemini API (v1beta) and rejected as NOT_FOUND.`,
262
+ ];
263
+ if (antigravityOnly) {
264
+ lines.push("", "This model id is served by the Antigravity Code Assist backend, not the public Gemini API.", "The plugin's API-key path forwarded the request unchanged because either:", " • opencode's 'google' provider is in API-key mode (no OAuth session), or", " • all OAuth Antigravity accounts were rate-limited and `agy_sdk.api_key_fallback` kicked in.", "", "To reach this model, re-authenticate with OAuth:", " opencode auth logout google", " opencode auth login # choose Google → OAuth with Google (Antigravity)");
265
+ }
266
+ else {
267
+ lines.push("", "The model id was forwarded to the public Gemini API verbatim. Double-check the spelling,", "or pick a model that's actually published on v1beta.");
268
+ }
269
+ lines.push("", `Public-API models known to work: ${suggestions}.`);
270
+ if (originalMessage) {
271
+ lines.push("", `(Underlying Gemini API error: ${originalMessage})`);
272
+ }
273
+ return lines.join("\n");
274
+ }
275
+ /**
276
+ * When the public Gemini API returns 404 NOT_FOUND for a model, rewrite the
277
+ * response body with actionable guidance. Without this, users see a bare
278
+ * "models/X is not found for API version v1beta" from Google and have no
279
+ * indication that the plugin routed their request through the API-key path
280
+ * because (a) opencode is in API-key mode for the google provider, or
281
+ * (b) all OAuth accounts were rate-limited and `api_key_fallback` kicked in.
282
+ *
283
+ * The rewritten body preserves the JSON error envelope so `@ai-sdk/google` still
284
+ * surfaces it as a normal `AI_APICallError` — only the human-facing message changes.
285
+ */
286
+ export async function enhanceAgySdkErrorResponse(response, requestedModel) {
287
+ if (response.status !== 404 || !requestedModel)
288
+ return response;
289
+ // NB: Gemini's `streamGenerateContent?alt=sse` returns 404 errors with a JSON
290
+ // body but `Content-Type: text/event-stream`, so we can't gate on content-type.
291
+ // Parse the body as JSON unconditionally; bail if it doesn't look like the
292
+ // expected `{ error: { message } }` envelope.
293
+ let body;
294
+ try {
295
+ body = JSON.parse(await response.clone().text());
296
+ }
297
+ catch {
298
+ return response;
299
+ }
300
+ const originalMessage = body.error?.message ?? "";
301
+ const looksLikeModelNotFound = /not (?:found|supported)/i.test(originalMessage) &&
302
+ originalMessage.toLowerCase().includes("model");
303
+ if (!looksLikeModelNotFound)
304
+ return response;
305
+ const enhanced = {
306
+ error: {
307
+ code: body.error?.code ?? 404,
308
+ message: buildAntigravityModelGuidanceMessage(requestedModel, originalMessage),
309
+ status: body.error?.status ?? "NOT_FOUND",
310
+ },
311
+ };
312
+ const headers = new Headers(response.headers);
313
+ headers.delete("content-length");
314
+ // Body is now JSON regardless of the original (`text/event-stream` on SSE 404s);
315
+ // normalize content-type so downstream parsers don't try to read it as a stream.
316
+ headers.set("content-type", "application/json");
317
+ return new Response(JSON.stringify(enhanced), {
318
+ status: response.status,
319
+ statusText: response.statusText,
320
+ headers,
321
+ });
322
+ }
323
+ /**
324
+ * Synthesizes the same 404 guidance produced by `enhanceAgySdkErrorResponse`,
325
+ * but pre-flight — before any request is sent to the public Gemini API.
326
+ *
327
+ * Use this in API-key-only auth paths when the requested model is identified by
328
+ * `isLikelyAntigravityOnlyModel`: the round trip would deterministically 404,
329
+ * so we short-circuit with the same Gemini-shaped error envelope. The shape
330
+ * matches `enhanceAgySdkErrorResponse` so `@ai-sdk/google` raises a normal
331
+ * `AI_APICallError` carrying the actionable message.
332
+ */
333
+ export function createAntigravityOnlyModelErrorResponse(requestedModel) {
334
+ const body = {
335
+ error: {
336
+ code: 404,
337
+ message: buildAntigravityModelGuidanceMessage(requestedModel),
338
+ status: "NOT_FOUND",
339
+ },
340
+ };
341
+ return new Response(JSON.stringify(body), {
342
+ status: 404,
343
+ statusText: "Not Found",
344
+ headers: { "content-type": "application/json" },
345
+ });
346
+ }
347
+ function extractGeminiModelFromUrl(urlString) {
348
+ try {
349
+ const url = new URL(urlString);
350
+ return url.pathname.match(/\/models\/([^:]+):(\w+)/)?.[1];
351
+ }
352
+ catch {
353
+ return undefined;
354
+ }
355
+ }
356
+ function isRecord(value) {
357
+ return !!value && typeof value === "object" && !Array.isArray(value);
358
+ }
359
+ function toThinkingTier(value) {
360
+ if (value === "low" || value === "medium" || value === "high")
361
+ return value;
362
+ return undefined;
363
+ }
364
+ function thinkingLevelFromBudget(budget) {
365
+ if (budget <= 8192)
366
+ return "low";
367
+ if (budget <= 16384)
368
+ return "medium";
369
+ return "high";
370
+ }
371
+ function mergeExtraBody(payload) {
372
+ const extraBody = isRecord(payload.extra_body)
373
+ ? payload.extra_body
374
+ : isRecord(payload.extraBody)
375
+ ? payload.extraBody
376
+ : undefined;
377
+ if (!extraBody)
378
+ return undefined;
379
+ if (isRecord(extraBody.generationConfig)) {
380
+ const generationConfig = isRecord(payload.generationConfig) ? payload.generationConfig : {};
381
+ for (const [key, value] of Object.entries(extraBody.generationConfig)) {
382
+ if (!(key in generationConfig)) {
383
+ generationConfig[key] = value;
384
+ }
385
+ }
386
+ payload.generationConfig = generationConfig;
387
+ }
388
+ for (const [key, value] of Object.entries(extraBody)) {
389
+ if (!(key in payload)) {
390
+ payload[key] = value;
391
+ }
392
+ }
393
+ return extraBody;
394
+ }
395
+ function applyAgySdkGeminiBodyTransforms(payload, model, thinkingLevel) {
396
+ const generationConfig = isRecord(payload.generationConfig)
397
+ ? payload.generationConfig
398
+ : {};
399
+ const extraBody = mergeExtraBody(payload);
400
+ const variantConfig = extractVariantThinkingConfig(isRecord(payload.providerOptions) ? payload.providerOptions : undefined, generationConfig);
401
+ const extraThinkingConfig = isRecord(extraBody?.thinkingConfig) ? extraBody.thinkingConfig : undefined;
402
+ const existingThinkingConfig = isRecord(generationConfig.thinkingConfig)
403
+ ? generationConfig.thinkingConfig
404
+ : extraThinkingConfig
405
+ ? { ...extraThinkingConfig }
406
+ : {};
407
+ if (isGemini3Model(model)) {
408
+ const resolvedLevel = variantConfig?.thinkingLevel
409
+ ?? (typeof existingThinkingConfig.thinkingLevel === "string" ? existingThinkingConfig.thinkingLevel : undefined)
410
+ ?? (variantConfig?.thinkingBudget !== undefined ? thinkingLevelFromBudget(variantConfig.thinkingBudget) : undefined)
411
+ ?? thinkingLevel
412
+ ?? "low";
413
+ existingThinkingConfig.thinkingLevel = resolvedLevel;
414
+ if (variantConfig?.includeThoughts !== undefined) {
415
+ existingThinkingConfig.includeThoughts = variantConfig.includeThoughts;
416
+ }
417
+ else if (typeof existingThinkingConfig.includeThoughts !== "boolean") {
418
+ existingThinkingConfig.includeThoughts = true;
419
+ }
420
+ }
421
+ else if (variantConfig?.thinkingBudget !== undefined || typeof existingThinkingConfig.thinkingBudget === "number") {
422
+ existingThinkingConfig.thinkingBudget = variantConfig?.thinkingBudget ?? existingThinkingConfig.thinkingBudget;
423
+ if (variantConfig?.includeThoughts !== undefined) {
424
+ existingThinkingConfig.includeThoughts = variantConfig.includeThoughts;
425
+ }
426
+ else if (typeof existingThinkingConfig.includeThoughts !== "boolean") {
427
+ existingThinkingConfig.includeThoughts = true;
428
+ }
429
+ }
430
+ if (Object.keys(existingThinkingConfig).length > 0) {
431
+ generationConfig.thinkingConfig = existingThinkingConfig;
432
+ payload.generationConfig = generationConfig;
433
+ }
434
+ if (Array.isArray(payload.tools) || variantConfig?.googleSearch) {
435
+ applyGeminiTransforms(payload, {
436
+ model,
437
+ tierThinkingLevel: toThinkingTier(typeof generationConfig.thinkingConfig === "object"
438
+ && generationConfig.thinkingConfig
439
+ && "thinkingLevel" in generationConfig.thinkingConfig
440
+ ? String(generationConfig.thinkingConfig.thinkingLevel)
441
+ : undefined),
442
+ googleSearch: variantConfig?.googleSearch,
443
+ });
444
+ }
445
+ delete payload.model;
446
+ delete payload.providerOptions;
447
+ delete payload.extra_body;
448
+ delete payload.extraBody;
449
+ delete payload.thinkingConfig;
450
+ delete payload.thinking;
451
+ }
452
+ export async function prepareAgySdkGeminiRequest(input, init, credential) {
453
+ const requestInput = typeof input === "string" ? undefined : input;
454
+ const urlString = requestInput?.url ?? input.toString();
455
+ const url = new URL(urlString);
456
+ const match = url.pathname.match(/\/models\/([^:]+):(\w+)/);
457
+ const rawModel = match?.[1] ?? undefined;
458
+ const action = match?.[2] ?? undefined;
459
+ const resolved = rawModel ? resolveModelForHeaderStyle(rawModel, "agy-sdk") : undefined;
460
+ if (resolved && action) {
461
+ url.pathname = url.pathname.replace(`/models/${rawModel}:${action}`, `/models/${resolved.actualModel}:${action}`);
462
+ }
463
+ url.searchParams.delete("key");
464
+ const headers = new Headers(init?.headers ?? requestInput?.headers ?? {});
465
+ headers.delete("Authorization");
466
+ headers.delete("x-api-key");
467
+ headers.set("x-goog-api-key", credential.apiKey);
468
+ headers.delete("x-goog-user-project");
469
+ const requestTextBody = init?.body === undefined && requestInput ? await requestBodyText(requestInput) : undefined;
470
+ const originalBody = init?.body ?? requestTextBody ?? requestInput?.body ?? undefined;
471
+ let body = originalBody;
472
+ if (typeof body === "string" && body.trim()) {
473
+ try {
474
+ const payload = JSON.parse(body);
475
+ applyAgySdkGeminiBodyTransforms(payload, resolved?.actualModel ?? rawModel ?? "", resolved?.thinkingLevel);
476
+ body = JSON.stringify(payload);
477
+ }
478
+ catch {
479
+ body = originalBody;
480
+ }
481
+ }
482
+ return {
483
+ request: url.toString(),
484
+ init: {
485
+ method: requestInput?.method,
486
+ ...init,
487
+ headers,
488
+ body,
489
+ },
490
+ model: resolved?.actualModel ?? rawModel,
491
+ };
492
+ }
493
+ async function fetchGeminiModelsPage(url, credential) {
494
+ const controller = new AbortController();
495
+ const timeout = setTimeout(() => controller.abort(), GEMINI_MODELS_LIST_TIMEOUT_MS);
496
+ try {
497
+ return await fetch(url, {
498
+ signal: controller.signal,
499
+ headers: {
500
+ "x-goog-api-key": credential.apiKey,
501
+ },
502
+ });
503
+ }
504
+ finally {
505
+ clearTimeout(timeout);
506
+ }
507
+ }
508
+ export async function fetchWithAgySdkCredential(input, init, credential, fallbackRetryAfterMs) {
509
+ const prepared = await prepareAgySdkGeminiRequest(input, init, credential);
510
+ const response = await fetch(prepared.request, prepared.init);
511
+ if (response.status === 429 || response.status === 503 || response.status === 529) {
512
+ markAgySdkCredentialRateLimited(credential, retryAfterMsFromResponse(response, fallbackRetryAfterMs));
513
+ }
514
+ return enhanceAgySdkErrorResponse(response, prepared.model);
515
+ }
516
+ export async function fetchGeminiApiModels(credential) {
517
+ const models = [];
518
+ let pageToken;
519
+ const seenPageTokens = new Set();
520
+ for (let page = 0; page < GEMINI_MODELS_LIST_MAX_PAGES; page += 1) {
521
+ const url = new URL("https://generativelanguage.googleapis.com/v1beta/models");
522
+ url.searchParams.set("pageSize", "1000");
523
+ if (pageToken) {
524
+ if (seenPageTokens.has(pageToken)) {
525
+ throw new Error(`Gemini models.list returned repeated page token for ${credential.label}`);
526
+ }
527
+ seenPageTokens.add(pageToken);
528
+ url.searchParams.set("pageToken", pageToken);
529
+ }
530
+ const response = await fetchGeminiModelsPage(url.toString(), credential);
531
+ if (!response.ok) {
532
+ const body = await response.text().catch(() => "");
533
+ const snippet = body.trim().slice(0, 200);
534
+ throw new Error(`Gemini models.list failed for ${credential.label}: ${response.status}${snippet ? ` ${snippet}` : ""}`);
535
+ }
536
+ const payload = (await response.json());
537
+ models.push(...(payload.models ?? []));
538
+ pageToken = payload.nextPageToken;
539
+ if (!pageToken)
540
+ return models;
541
+ }
542
+ throw new Error(`Gemini models.list exceeded ${GEMINI_MODELS_LIST_MAX_PAGES} pages for ${credential.label}`);
543
+ }
544
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../../src/plugin/api-key.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AuthDetails, OAuthAuthDetails, RefreshParts } from "./types";
2
+ export declare function isOAuthAuth(auth: AuthDetails): auth is OAuthAuthDetails;
3
+ /**
4
+ * Splits a packed refresh string into its constituent refresh token and project IDs.
5
+ */
6
+ export declare function parseRefreshParts(refresh: string): RefreshParts;
7
+ /**
8
+ * Serializes refresh token parts into the stored string format.
9
+ */
10
+ export declare function formatRefreshParts(parts: RefreshParts): string;
11
+ /**
12
+ * Determines whether an access token is expired or missing, with buffer for clock skew.
13
+ */
14
+ export declare function accessTokenExpired(auth: OAuthAuthDetails): boolean;
15
+ /**
16
+ * Calculates absolute expiry timestamp based on a duration.
17
+ * @param requestTimeMs The local time when the request was initiated
18
+ * @param expiresInSeconds The duration returned by the server
19
+ */
20
+ export declare function calculateTokenExpiry(requestTimeMs: number, expiresInSeconds: unknown): number;
21
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/plugin/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAI3E,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,gBAAgB,CAEvE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAO/D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAI9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAKlE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,GAAG,MAAM,CAO7F"}
@@ -0,0 +1,46 @@
1
+ const ACCESS_TOKEN_EXPIRY_BUFFER_MS = 60 * 1000;
2
+ export function isOAuthAuth(auth) {
3
+ return auth.type === "oauth";
4
+ }
5
+ /**
6
+ * Splits a packed refresh string into its constituent refresh token and project IDs.
7
+ */
8
+ export function parseRefreshParts(refresh) {
9
+ const [refreshToken = "", projectId = "", managedProjectId = ""] = (refresh ?? "").split("|");
10
+ return {
11
+ refreshToken,
12
+ projectId: projectId || undefined,
13
+ managedProjectId: managedProjectId || undefined,
14
+ };
15
+ }
16
+ /**
17
+ * Serializes refresh token parts into the stored string format.
18
+ */
19
+ export function formatRefreshParts(parts) {
20
+ const projectSegment = parts.projectId ?? "";
21
+ const base = `${parts.refreshToken}|${projectSegment}`;
22
+ return parts.managedProjectId ? `${base}|${parts.managedProjectId}` : base;
23
+ }
24
+ /**
25
+ * Determines whether an access token is expired or missing, with buffer for clock skew.
26
+ */
27
+ export function accessTokenExpired(auth) {
28
+ if (!auth.access || typeof auth.expires !== "number") {
29
+ return true;
30
+ }
31
+ return auth.expires <= Date.now() + ACCESS_TOKEN_EXPIRY_BUFFER_MS;
32
+ }
33
+ /**
34
+ * Calculates absolute expiry timestamp based on a duration.
35
+ * @param requestTimeMs The local time when the request was initiated
36
+ * @param expiresInSeconds The duration returned by the server
37
+ */
38
+ export function calculateTokenExpiry(requestTimeMs, expiresInSeconds) {
39
+ const seconds = typeof expiresInSeconds === "number" ? expiresInSeconds : 3600;
40
+ // Safety check for bad data - if it's not a positive number, treat as immediately expired
41
+ if (isNaN(seconds) || seconds <= 0) {
42
+ return requestTimeMs;
43
+ }
44
+ return requestTimeMs + seconds * 1000;
45
+ }
46
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/plugin/auth.ts"],"names":[],"mappings":"AAEA,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAC;AAEhD,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,CAAC,YAAY,GAAG,EAAE,EAAE,SAAS,GAAG,EAAE,EAAE,gBAAgB,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9F,OAAO;QACL,YAAY;QACZ,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,gBAAgB,EAAE,gBAAgB,IAAI,SAAS;KAChD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,KAAK,CAAC,YAAY,IAAI,cAAc,EAAE,CAAC;IACvD,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAsB;IACvD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,6BAA6B,CAAC;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAqB,EAAE,gBAAyB;IACnF,MAAM,OAAO,GAAG,OAAO,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,0FAA0F;IAC1F,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,OAAO,aAAa,GAAG,OAAO,GAAG,IAAI,CAAC;AACxC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Cache module for opencode-antigravity-auth plugin.
3
+ */
4
+ export { SignatureCache, createSignatureCache, } from "./signature-cache";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugin/cache/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,cAAc,EACd,oBAAoB,GACrB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Cache module for opencode-antigravity-auth plugin.
3
+ */
4
+ export { SignatureCache, createSignatureCache, } from "./signature-cache.js";
5
+ //# sourceMappingURL=index.js.map