@percygfx/opencode-antigravity-auth 0.0.0-stage → 2.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 (296) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +876 -3
  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/rpc.d.ts +176 -0
  8. package/dist/rpc.d.ts.map +1 -0
  9. package/dist/rpc.js +91 -0
  10. package/dist/rpc.js.map +1 -0
  11. package/dist/server.d.ts +3 -0
  12. package/dist/server.d.ts.map +1 -0
  13. package/dist/server.js +5 -0
  14. package/dist/server.js.map +1 -0
  15. package/dist/src/antigravity/oauth.d.ts +31 -0
  16. package/dist/src/antigravity/oauth.d.ts.map +1 -0
  17. package/dist/src/antigravity/oauth.js +171 -0
  18. package/dist/src/antigravity/oauth.js.map +1 -0
  19. package/dist/src/constants.d.ts +148 -0
  20. package/dist/src/constants.d.ts.map +1 -0
  21. package/dist/src/constants.js +233 -0
  22. package/dist/src/constants.js.map +1 -0
  23. package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
  24. package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
  25. package/dist/src/hooks/auto-update-checker/cache.js +71 -0
  26. package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
  27. package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
  28. package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
  29. package/dist/src/hooks/auto-update-checker/checker.js +234 -0
  30. package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/constants.d.ts +11 -0
  32. package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/constants.js +26 -0
  34. package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
  35. package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
  36. package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
  37. package/dist/src/hooks/auto-update-checker/index.js +122 -0
  38. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  39. package/dist/src/hooks/auto-update-checker/logging.d.ts +3 -0
  40. package/dist/src/hooks/auto-update-checker/logging.d.ts.map +1 -0
  41. package/dist/src/hooks/auto-update-checker/logging.js +9 -0
  42. package/dist/src/hooks/auto-update-checker/logging.js.map +1 -0
  43. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  44. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  45. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  46. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  47. package/dist/src/opencode-v2/accounts.d.ts +24 -0
  48. package/dist/src/opencode-v2/accounts.d.ts.map +1 -0
  49. package/dist/src/opencode-v2/accounts.js +109 -0
  50. package/dist/src/opencode-v2/accounts.js.map +1 -0
  51. package/dist/src/opencode-v2/catalog.d.ts +31 -0
  52. package/dist/src/opencode-v2/catalog.d.ts.map +1 -0
  53. package/dist/src/opencode-v2/catalog.js +68 -0
  54. package/dist/src/opencode-v2/catalog.js.map +1 -0
  55. package/dist/src/opencode-v2/client-shim.d.ts +9 -0
  56. package/dist/src/opencode-v2/client-shim.d.ts.map +1 -0
  57. package/dist/src/opencode-v2/client-shim.js +42 -0
  58. package/dist/src/opencode-v2/client-shim.js.map +1 -0
  59. package/dist/src/opencode-v2/clipboard.d.ts +7 -0
  60. package/dist/src/opencode-v2/clipboard.d.ts.map +1 -0
  61. package/dist/src/opencode-v2/clipboard.js +54 -0
  62. package/dist/src/opencode-v2/clipboard.js.map +1 -0
  63. package/dist/src/opencode-v2/index.d.ts +5 -0
  64. package/dist/src/opencode-v2/index.d.ts.map +1 -0
  65. package/dist/src/opencode-v2/index.js +4 -0
  66. package/dist/src/opencode-v2/index.js.map +1 -0
  67. package/dist/src/opencode-v2/plugin.d.ts +23 -0
  68. package/dist/src/opencode-v2/plugin.d.ts.map +1 -0
  69. package/dist/src/opencode-v2/plugin.js +401 -0
  70. package/dist/src/opencode-v2/plugin.js.map +1 -0
  71. package/dist/src/opencode-v2/proxy.d.ts +23 -0
  72. package/dist/src/opencode-v2/proxy.d.ts.map +1 -0
  73. package/dist/src/opencode-v2/proxy.js +148 -0
  74. package/dist/src/opencode-v2/proxy.js.map +1 -0
  75. package/dist/src/opencode-v2/quota-format.d.ts +19 -0
  76. package/dist/src/opencode-v2/quota-format.d.ts.map +1 -0
  77. package/dist/src/opencode-v2/quota-format.js +71 -0
  78. package/dist/src/opencode-v2/quota-format.js.map +1 -0
  79. package/dist/src/opencode-v2/quota.d.ts +18 -0
  80. package/dist/src/opencode-v2/quota.d.ts.map +1 -0
  81. package/dist/src/opencode-v2/quota.js +118 -0
  82. package/dist/src/opencode-v2/quota.js.map +1 -0
  83. package/dist/src/opencode-v2/sign-in-attempts.d.ts +52 -0
  84. package/dist/src/opencode-v2/sign-in-attempts.d.ts.map +1 -0
  85. package/dist/src/opencode-v2/sign-in-attempts.js +81 -0
  86. package/dist/src/opencode-v2/sign-in-attempts.js.map +1 -0
  87. package/dist/src/plugin/accounts.d.ts +179 -0
  88. package/dist/src/plugin/accounts.d.ts.map +1 -0
  89. package/dist/src/plugin/accounts.js +1004 -0
  90. package/dist/src/plugin/accounts.js.map +1 -0
  91. package/dist/src/plugin/auth.d.ts +21 -0
  92. package/dist/src/plugin/auth.d.ts.map +1 -0
  93. package/dist/src/plugin/auth.js +46 -0
  94. package/dist/src/plugin/auth.js.map +1 -0
  95. package/dist/src/plugin/cache/index.d.ts +5 -0
  96. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  97. package/dist/src/plugin/cache/index.js +5 -0
  98. package/dist/src/plugin/cache/index.js.map +1 -0
  99. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  100. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  101. package/dist/src/plugin/cache/signature-cache.js +375 -0
  102. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  103. package/dist/src/plugin/cache.d.ts +44 -0
  104. package/dist/src/plugin/cache.d.ts.map +1 -0
  105. package/dist/src/plugin/cache.js +200 -0
  106. package/dist/src/plugin/cache.js.map +1 -0
  107. package/dist/src/plugin/cli.d.ts +26 -0
  108. package/dist/src/plugin/cli.d.ts.map +1 -0
  109. package/dist/src/plugin/cli.js +119 -0
  110. package/dist/src/plugin/cli.js.map +1 -0
  111. package/dist/src/plugin/config/index.d.ts +16 -0
  112. package/dist/src/plugin/config/index.d.ts.map +1 -0
  113. package/dist/src/plugin/config/index.js +16 -0
  114. package/dist/src/plugin/config/index.js.map +1 -0
  115. package/dist/src/plugin/config/loader.d.ts +36 -0
  116. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  117. package/dist/src/plugin/config/loader.js +140 -0
  118. package/dist/src/plugin/config/loader.js.map +1 -0
  119. package/dist/src/plugin/config/models.d.ts +41 -0
  120. package/dist/src/plugin/config/models.d.ts.map +1 -0
  121. package/dist/src/plugin/config/models.js +46 -0
  122. package/dist/src/plugin/config/models.js.map +1 -0
  123. package/dist/src/plugin/config/schema.d.ts +135 -0
  124. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  125. package/dist/src/plugin/config/schema.js +438 -0
  126. package/dist/src/plugin/config/schema.js.map +1 -0
  127. package/dist/src/plugin/config/updater.d.ts +55 -0
  128. package/dist/src/plugin/config/updater.d.ts.map +1 -0
  129. package/dist/src/plugin/config/updater.js +125 -0
  130. package/dist/src/plugin/config/updater.js.map +1 -0
  131. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  132. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  133. package/dist/src/plugin/core/streaming/index.js +3 -0
  134. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  135. package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
  136. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  137. package/dist/src/plugin/core/streaming/transformer.js +271 -0
  138. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  139. package/dist/src/plugin/core/streaming/types.d.ts +27 -0
  140. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  141. package/dist/src/plugin/core/streaming/types.js +1 -0
  142. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  143. package/dist/src/plugin/debug.d.ts +94 -0
  144. package/dist/src/plugin/debug.d.ts.map +1 -0
  145. package/dist/src/plugin/debug.js +382 -0
  146. package/dist/src/plugin/debug.js.map +1 -0
  147. package/dist/src/plugin/errors.d.ts +28 -0
  148. package/dist/src/plugin/errors.d.ts.map +1 -0
  149. package/dist/src/plugin/errors.js +42 -0
  150. package/dist/src/plugin/errors.js.map +1 -0
  151. package/dist/src/plugin/fingerprint.d.ts +70 -0
  152. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  153. package/dist/src/plugin/fingerprint.js +138 -0
  154. package/dist/src/plugin/fingerprint.js.map +1 -0
  155. package/dist/src/plugin/image-saver.d.ts +25 -0
  156. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  157. package/dist/src/plugin/image-saver.js +86 -0
  158. package/dist/src/plugin/image-saver.js.map +1 -0
  159. package/dist/src/plugin/logger.d.ts +36 -0
  160. package/dist/src/plugin/logger.d.ts.map +1 -0
  161. package/dist/src/plugin/logger.js +71 -0
  162. package/dist/src/plugin/logger.js.map +1 -0
  163. package/dist/src/plugin/logging-utils.d.ts +23 -0
  164. package/dist/src/plugin/logging-utils.d.ts.map +1 -0
  165. package/dist/src/plugin/logging-utils.js +92 -0
  166. package/dist/src/plugin/logging-utils.js.map +1 -0
  167. package/dist/src/plugin/model-discovery.d.ts +16 -0
  168. package/dist/src/plugin/model-discovery.d.ts.map +1 -0
  169. package/dist/src/plugin/model-discovery.js +50 -0
  170. package/dist/src/plugin/model-discovery.js.map +1 -0
  171. package/dist/src/plugin/model-registry.d.ts +92 -0
  172. package/dist/src/plugin/model-registry.d.ts.map +1 -0
  173. package/dist/src/plugin/model-registry.js +248 -0
  174. package/dist/src/plugin/model-registry.js.map +1 -0
  175. package/dist/src/plugin/project.d.ts +33 -0
  176. package/dist/src/plugin/project.d.ts.map +1 -0
  177. package/dist/src/plugin/project.js +234 -0
  178. package/dist/src/plugin/project.js.map +1 -0
  179. package/dist/src/plugin/quota.d.ts +58 -0
  180. package/dist/src/plugin/quota.d.ts.map +1 -0
  181. package/dist/src/plugin/quota.js +296 -0
  182. package/dist/src/plugin/quota.js.map +1 -0
  183. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  184. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  185. package/dist/src/plugin/recovery/constants.js +43 -0
  186. package/dist/src/plugin/recovery/constants.js.map +1 -0
  187. package/dist/src/plugin/recovery/index.d.ts +12 -0
  188. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  189. package/dist/src/plugin/recovery/index.js +12 -0
  190. package/dist/src/plugin/recovery/index.js.map +1 -0
  191. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  192. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  193. package/dist/src/plugin/recovery/storage.js +354 -0
  194. package/dist/src/plugin/recovery/storage.js.map +1 -0
  195. package/dist/src/plugin/recovery/types.d.ts +116 -0
  196. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  197. package/dist/src/plugin/recovery/types.js +6 -0
  198. package/dist/src/plugin/recovery/types.js.map +1 -0
  199. package/dist/src/plugin/recovery.d.ts +61 -0
  200. package/dist/src/plugin/recovery.d.ts.map +1 -0
  201. package/dist/src/plugin/recovery.js +381 -0
  202. package/dist/src/plugin/recovery.js.map +1 -0
  203. package/dist/src/plugin/refresh-queue.d.ts +100 -0
  204. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  205. package/dist/src/plugin/refresh-queue.js +247 -0
  206. package/dist/src/plugin/refresh-queue.js.map +1 -0
  207. package/dist/src/plugin/request-helpers.d.ts +282 -0
  208. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  209. package/dist/src/plugin/request-helpers.js +2343 -0
  210. package/dist/src/plugin/request-helpers.js.map +1 -0
  211. package/dist/src/plugin/request.d.ts +95 -0
  212. package/dist/src/plugin/request.d.ts.map +1 -0
  213. package/dist/src/plugin/request.js +1500 -0
  214. package/dist/src/plugin/request.js.map +1 -0
  215. package/dist/src/plugin/rotation.d.ts +169 -0
  216. package/dist/src/plugin/rotation.d.ts.map +1 -0
  217. package/dist/src/plugin/rotation.js +328 -0
  218. package/dist/src/plugin/rotation.js.map +1 -0
  219. package/dist/src/plugin/search.d.ts +32 -0
  220. package/dist/src/plugin/search.d.ts.map +1 -0
  221. package/dist/src/plugin/search.js +195 -0
  222. package/dist/src/plugin/search.js.map +1 -0
  223. package/dist/src/plugin/server.d.ts +23 -0
  224. package/dist/src/plugin/server.d.ts.map +1 -0
  225. package/dist/src/plugin/server.js +324 -0
  226. package/dist/src/plugin/server.js.map +1 -0
  227. package/dist/src/plugin/storage.d.ts +155 -0
  228. package/dist/src/plugin/storage.d.ts.map +1 -0
  229. package/dist/src/plugin/storage.js +650 -0
  230. package/dist/src/plugin/storage.js.map +1 -0
  231. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  232. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  233. package/dist/src/plugin/stores/signature-store.js +25 -0
  234. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  235. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  236. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  237. package/dist/src/plugin/thinking-recovery.js +316 -0
  238. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  239. package/dist/src/plugin/token.d.ts +19 -0
  240. package/dist/src/plugin/token.d.ts.map +1 -0
  241. package/dist/src/plugin/token.js +128 -0
  242. package/dist/src/plugin/token.js.map +1 -0
  243. package/dist/src/plugin/transform/claude.d.ts +80 -0
  244. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  245. package/dist/src/plugin/transform/claude.js +265 -0
  246. package/dist/src/plugin/transform/claude.js.map +1 -0
  247. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
  248. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  249. package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
  250. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  251. package/dist/src/plugin/transform/gemini.d.ts +100 -0
  252. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  253. package/dist/src/plugin/transform/gemini.js +446 -0
  254. package/dist/src/plugin/transform/gemini.js.map +1 -0
  255. package/dist/src/plugin/transform/index.d.ts +15 -0
  256. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  257. package/dist/src/plugin/transform/index.js +14 -0
  258. package/dist/src/plugin/transform/index.js.map +1 -0
  259. package/dist/src/plugin/transform/model-resolver.d.ts +99 -0
  260. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  261. package/dist/src/plugin/transform/model-resolver.js +340 -0
  262. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  263. package/dist/src/plugin/transform/types.d.ts +111 -0
  264. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  265. package/dist/src/plugin/transform/types.js +1 -0
  266. package/dist/src/plugin/transform/types.js.map +1 -0
  267. package/dist/src/plugin/types.d.ts +97 -0
  268. package/dist/src/plugin/types.d.ts.map +1 -0
  269. package/dist/src/plugin/types.js +1 -0
  270. package/dist/src/plugin/types.js.map +1 -0
  271. package/dist/src/plugin/ui/ansi.d.ts +32 -0
  272. package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
  273. package/dist/src/plugin/ui/ansi.js +52 -0
  274. package/dist/src/plugin/ui/ansi.js.map +1 -0
  275. package/dist/src/plugin/ui/auth-menu.d.ts +33 -0
  276. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
  277. package/dist/src/plugin/ui/auth-menu.js +110 -0
  278. package/dist/src/plugin/ui/auth-menu.js.map +1 -0
  279. package/dist/src/plugin/ui/confirm.d.ts +2 -0
  280. package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
  281. package/dist/src/plugin/ui/confirm.js +15 -0
  282. package/dist/src/plugin/ui/confirm.js.map +1 -0
  283. package/dist/src/plugin/ui/select.d.ts +23 -0
  284. package/dist/src/plugin/ui/select.d.ts.map +1 -0
  285. package/dist/src/plugin/ui/select.js +254 -0
  286. package/dist/src/plugin/ui/select.js.map +1 -0
  287. package/dist/src/plugin/version.d.ts +19 -0
  288. package/dist/src/plugin/version.d.ts.map +1 -0
  289. package/dist/src/plugin/version.js +80 -0
  290. package/dist/src/plugin/version.js.map +1 -0
  291. package/dist/src/plugin.d.ts +45 -0
  292. package/dist/src/plugin.d.ts.map +1 -0
  293. package/dist/src/plugin.js +2817 -0
  294. package/dist/src/plugin.js.map +1 -0
  295. package/dist/tui.js +420 -0
  296. package/package.json +98 -5
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Antigravity model registry.
3
+ *
4
+ * The models this plugin offers come from Antigravity itself: `fetchAvailableModels` returns a
5
+ * "Recommended" list with display names, limits and capabilities. The registry turns that list
6
+ * into catalog entries (one entry per model, Low/Medium/High tiers as variants) and answers which
7
+ * upstream model ID and User-Agent a request needs. New models therefore appear, and retired ones
8
+ * disappear, without code changes.
9
+ *
10
+ * Until a discovery has run (before sign-in, offline), a built-in snapshot is used. The latest
11
+ * discovery is cached on disk so later starts have it immediately.
12
+ */
13
+ export type ModelTier = "minimal" | "low" | "medium" | "high";
14
+ export type ModelVendor = "google" | "anthropic" | "openai" | "other";
15
+ /** One entry of `fetchAvailableModels().models`, reduced to what the registry uses. */
16
+ export interface AvailableModelInfo {
17
+ displayName?: string;
18
+ modelProvider?: string;
19
+ supportsImages?: boolean;
20
+ supportsThinking?: boolean;
21
+ maxTokens?: number;
22
+ maxOutputTokens?: number;
23
+ tagTitle?: string;
24
+ tagDescription?: string;
25
+ }
26
+ /** The parts of a `fetchAvailableModels` response the registry reads. */
27
+ export interface AvailableModelsResponse {
28
+ models?: Record<string, AvailableModelInfo | undefined>;
29
+ agentModelSorts?: Array<{
30
+ groups?: Array<{
31
+ modelIds?: string[];
32
+ }>;
33
+ }>;
34
+ }
35
+ export interface RegistryVariant {
36
+ tier: ModelTier;
37
+ upstreamId: string;
38
+ /** Only served to the current Antigravity client (hub User-Agent). */
39
+ hubOnly: boolean;
40
+ }
41
+ export interface RegistryModel {
42
+ /** Catalog ID without the `antigravity-` prefix, e.g. `gemini-3.8-flash`, `claude-opus-4-6-thinking`. */
43
+ id: string;
44
+ /** Display name without the tier, e.g. `Gemini 3.8 Flash`. */
45
+ name: string;
46
+ vendor: ModelVendor;
47
+ /** Upstream ID used when no tier is requested (Antigravity's first-listed tier). */
48
+ upstreamId: string;
49
+ hubOnly: boolean;
50
+ /** Tiers that map to their own upstream IDs; empty for single-ID models. */
51
+ variants: RegistryVariant[];
52
+ supportsImages: boolean;
53
+ supportsThinking: boolean;
54
+ contextLimit: number;
55
+ outputLimit: number;
56
+ /** Antigravity's notice, e.g. "Leaving Soon: Start using Gemini 3.8 Flash". */
57
+ notice?: string;
58
+ leavingSoon: boolean;
59
+ }
60
+ export interface UpstreamModelResolution {
61
+ model: RegistryModel;
62
+ upstreamId: string;
63
+ tier?: ModelTier;
64
+ hubOnly: boolean;
65
+ }
66
+ /**
67
+ * Builds registry models from a `fetchAvailableModels` response made with the hub User-Agent.
68
+ * `legacyIds` are the model IDs the legacy User-Agent sees; IDs missing from it need the hub UA.
69
+ *
70
+ * Entries named "<Name> (Low|Medium|High)" that share a name become one model with variants.
71
+ * A name that appears with a single tier (e.g. "GPT-OSS 120B (Medium)") stays a plain model.
72
+ */
73
+ export declare function buildRegistryModels(hubResponse: AvailableModelsResponse, legacyIds?: ReadonlySet<string>): RegistryModel[];
74
+ export declare function builtinRegistryModels(): RegistryModel[];
75
+ export declare function getRegistryCachePath(): string;
76
+ /** The models currently offered: the last discovery (memory, then disk cache) or the snapshot. */
77
+ export declare function getRegistryModels(): RegistryModel[];
78
+ /** When the current list was discovered, or undefined for the built-in snapshot. */
79
+ export declare function getRegistryFetchedAt(): number | undefined;
80
+ /** Replaces the current list with a fresh discovery and caches it on disk. */
81
+ export declare function setRegistryModels(models: RegistryModel[], fetchedAt?: number): void;
82
+ /** Test hook: forget the in-memory state so the next read starts over. */
83
+ export declare function resetRegistryForTests(models?: RegistryModel[]): void;
84
+ /**
85
+ * Maps a requested model (catalog ID, with or without `antigravity-`, or an upstream ID) and an
86
+ * optional tier to the upstream model ID to send. Returns undefined for models the registry does
87
+ * not know, which keep the pipeline's own name handling.
88
+ */
89
+ export declare function resolveUpstreamModel(requestedModel: string, tier?: string): UpstreamModelResolution | undefined;
90
+ /** True when the upstream ID is only served to the current Antigravity client. */
91
+ export declare function requiresHubUserAgent(upstreamId: string): boolean;
92
+ //# sourceMappingURL=model-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-registry.d.ts","sourceRoot":"","sources":["../../../src/plugin/model-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAKtE,uFAAuF;AACvF,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,SAAS,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,yGAAyG;IACzG,EAAE,EAAE,MAAM,CAAC;IACX,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;IACpB,oFAAoF;IACpF,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAgCD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,uBAAuB,EACpC,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAC9B,aAAa,EAAE,CAsDjB;AAuBD,wBAAgB,qBAAqB,IAAI,aAAa,EAAE,CAWvD;AAsBD,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAuBD,kGAAkG;AAClG,wBAAgB,iBAAiB,IAAI,aAAa,EAAE,CAKnD;AAED,oFAAoF;AACpF,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAGzD;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,SAAS,SAAa,GAAG,IAAI,CAYvF;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,GAAG,IAAI,CAEpE;AAWD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAwB/G;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAOhE"}
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Antigravity model registry.
3
+ *
4
+ * The models this plugin offers come from Antigravity itself: `fetchAvailableModels` returns a
5
+ * "Recommended" list with display names, limits and capabilities. The registry turns that list
6
+ * into catalog entries (one entry per model, Low/Medium/High tiers as variants) and answers which
7
+ * upstream model ID and User-Agent a request needs. New models therefore appear, and retired ones
8
+ * disappear, without code changes.
9
+ *
10
+ * Until a discovery has run (before sign-in, offline), a built-in snapshot is used. The latest
11
+ * discovery is cached on disk so later starts have it immediately.
12
+ */
13
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
14
+ import { homedir } from "node:os";
15
+ import { dirname, join } from "node:path";
16
+ import { createLogger } from "./logger";
17
+ const log = createLogger("model-registry");
18
+ const TIER_ORDER = ["minimal", "low", "medium", "high"];
19
+ const TIER_SUFFIX = /^(.*\S)\s+\((minimal|low|medium|high)\)$/i;
20
+ const FALLBACK_CONTEXT = 200_000;
21
+ const FALLBACK_OUTPUT = 32_000;
22
+ function vendorOf(modelProvider, id) {
23
+ const provider = (modelProvider ?? "").toUpperCase();
24
+ if (provider.includes("GOOGLE") || id.startsWith("gemini"))
25
+ return "google";
26
+ if (provider.includes("ANTHROPIC") || id.startsWith("claude"))
27
+ return "anthropic";
28
+ if (provider.includes("OPENAI") || id.startsWith("gpt"))
29
+ return "openai";
30
+ return "other";
31
+ }
32
+ function slugify(name) {
33
+ return name
34
+ .toLowerCase()
35
+ .replace(/[^a-z0-9.]+/g, "-")
36
+ .replace(/^-+|-+$/g, "");
37
+ }
38
+ function recommendedIds(response) {
39
+ const ids = [];
40
+ for (const sort of response.agentModelSorts ?? []) {
41
+ for (const group of sort.groups ?? []) {
42
+ for (const id of group.modelIds ?? []) {
43
+ if (!ids.includes(id))
44
+ ids.push(id);
45
+ }
46
+ }
47
+ }
48
+ return ids;
49
+ }
50
+ /**
51
+ * Builds registry models from a `fetchAvailableModels` response made with the hub User-Agent.
52
+ * `legacyIds` are the model IDs the legacy User-Agent sees; IDs missing from it need the hub UA.
53
+ *
54
+ * Entries named "<Name> (Low|Medium|High)" that share a name become one model with variants.
55
+ * A name that appears with a single tier (e.g. "GPT-OSS 120B (Medium)") stays a plain model.
56
+ */
57
+ export function buildRegistryModels(hubResponse, legacyIds) {
58
+ const groups = new Map();
59
+ for (const upstreamId of recommendedIds(hubResponse)) {
60
+ const info = hubResponse.models?.[upstreamId];
61
+ if (!info)
62
+ continue;
63
+ const displayName = info.displayName?.trim() || upstreamId;
64
+ const match = TIER_SUFFIX.exec(displayName);
65
+ const base = match?.[1] ?? displayName;
66
+ const tier = match?.[2]?.toLowerCase();
67
+ const members = groups.get(base) ?? [];
68
+ members.push({ upstreamId, tier, info });
69
+ groups.set(base, members);
70
+ }
71
+ const isHubOnly = (upstreamId) => (legacyIds ? !legacyIds.has(upstreamId) : false);
72
+ const models = [];
73
+ for (const [base, members] of groups) {
74
+ const tiered = members.length > 1 && members.every((member) => member.tier);
75
+ const first = members[0];
76
+ const info = first.info;
77
+ const notice = [info.tagTitle, info.tagDescription].filter(Boolean).join(": ") || undefined;
78
+ const variants = tiered
79
+ ? members
80
+ .map((member) => ({
81
+ tier: member.tier,
82
+ upstreamId: member.upstreamId,
83
+ hubOnly: isHubOnly(member.upstreamId),
84
+ }))
85
+ .sort((a, b) => TIER_ORDER.indexOf(a.tier) - TIER_ORDER.indexOf(b.tier))
86
+ : [];
87
+ for (const member of tiered ? [first] : members) {
88
+ const memberInfo = member.info;
89
+ models.push({
90
+ id: tiered ? slugify(base) : member.upstreamId,
91
+ name: tiered ? base : memberInfo.displayName?.trim() || member.upstreamId,
92
+ vendor: vendorOf(memberInfo.modelProvider, member.upstreamId),
93
+ upstreamId: member.upstreamId,
94
+ hubOnly: isHubOnly(member.upstreamId),
95
+ variants,
96
+ supportsImages: Boolean(memberInfo.supportsImages),
97
+ supportsThinking: Boolean(memberInfo.supportsThinking),
98
+ contextLimit: memberInfo.maxTokens ?? FALLBACK_CONTEXT,
99
+ outputLimit: memberInfo.maxOutputTokens ?? FALLBACK_OUTPUT,
100
+ notice,
101
+ leavingSoon: /leaving soon|will be removed|no longer be available/i.test(notice ?? ""),
102
+ });
103
+ }
104
+ }
105
+ return models;
106
+ }
107
+ /**
108
+ * Snapshot of Antigravity's Recommended list (hub User-Agent), taken 2026-10-13. Used until the
109
+ * first discovery succeeds. Refresh it with `node scripts/list-models.mjs --json`.
110
+ */
111
+ const BUILTIN_SNAPSHOT = [
112
+ { id: "gemini-3.8-flash-high", displayName: "Gemini 3.8 Flash (High)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, hubOnly: true },
113
+ { id: "gemini-3.8-flash-medium", displayName: "Gemini 3.8 Flash (Medium)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, hubOnly: true },
114
+ { id: "gemini-3.8-flash-low", displayName: "Gemini 3.8 Flash (Low)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, hubOnly: true },
115
+ { id: "gemini-3.7-flash-high", displayName: "Gemini 3.7 Flash (High)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, hubOnly: true, tagTitle: "Leaving Soon", tagDescription: "Start using Gemini 3.8 Flash, our best Flash model." },
116
+ { id: "gemini-3.7-flash-medium", displayName: "Gemini 3.7 Flash (Medium)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, hubOnly: true, tagTitle: "Leaving Soon", tagDescription: "Start using Gemini 3.8 Flash, our best Flash model." },
117
+ { id: "gemini-3.7-flash-low", displayName: "Gemini 3.7 Flash (Low)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, hubOnly: true, tagTitle: "Leaving Soon", tagDescription: "Start using Gemini 3.8 Flash, our best Flash model." },
118
+ { id: "gemini-3.6-flash-high", displayName: "Gemini 3.6 Flash (High)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, tagTitle: "Leaving Soon", tagDescription: "Start using Gemini 3.8 Flash, our best Flash model." },
119
+ { id: "gemini-3.6-flash-medium", displayName: "Gemini 3.6 Flash (Medium)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, tagTitle: "Leaving Soon", tagDescription: "Start using Gemini 3.8 Flash, our best Flash model." },
120
+ { id: "gemini-3.6-flash-low", displayName: "Gemini 3.6 Flash (Low)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, tagTitle: "Leaving Soon", tagDescription: "Start using Gemini 3.8 Flash, our best Flash model." },
121
+ { id: "gemini-pro-agent", displayName: "Gemini 3.1 Pro (High)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, tagTitle: "Leaving Soon", tagDescription: "Use Gemini 3.8 Flash! As a newer model, it delivers more intelligence at 2x the speed for 70% less cost than Gemini 3.1 Pro." },
122
+ { id: "gemini-3.1-pro-low", displayName: "Gemini 3.1 Pro (Low)", modelProvider: "MODEL_PROVIDER_GOOGLE", supportsImages: true, supportsThinking: true, maxTokens: 1048576, maxOutputTokens: 65536, tagTitle: "Leaving Soon", tagDescription: "Use Gemini 3.8 Flash! As a newer model, it delivers more intelligence at 2x the speed for 70% less cost than Gemini 3.1 Pro." },
123
+ { id: "claude-sonnet-4-6", displayName: "Claude Sonnet 4.6 (Thinking)", modelProvider: "MODEL_PROVIDER_ANTHROPIC", supportsImages: true, supportsThinking: true, maxTokens: 250000, maxOutputTokens: 64000, tagTitle: "Notice", tagDescription: "Sonnet 5.5 is now available on paid Pro and Ultra plans. Third-party model access will no longer be available on your current plan starting on November 2, 2026." },
124
+ { id: "claude-opus-4-6-thinking", displayName: "Claude Opus 4.6 (Thinking)", modelProvider: "MODEL_PROVIDER_ANTHROPIC", supportsImages: true, supportsThinking: true, maxTokens: 250000, maxOutputTokens: 64000, tagTitle: "Notice", tagDescription: "Opus 5.5 is now available on paid Pro and Ultra plans. Third-party model access will no longer be available on your current plan starting on November 2, 2026." },
125
+ { id: "gpt-oss-120b-medium", displayName: "GPT-OSS 120B (Medium)", modelProvider: "MODEL_PROVIDER_OPENAI", supportsImages: false, supportsThinking: true, maxTokens: 131072, maxOutputTokens: 32768, tagTitle: "Notice", tagDescription: "GPT-OSS will be removed from Antigravity on November 2, 2026." },
126
+ ];
127
+ export function builtinRegistryModels() {
128
+ const models = {};
129
+ const legacyIds = new Set();
130
+ for (const { id, hubOnly, ...info } of BUILTIN_SNAPSHOT) {
131
+ models[id] = info;
132
+ if (!hubOnly)
133
+ legacyIds.add(id);
134
+ }
135
+ return buildRegistryModels({ models, agentModelSorts: [{ groups: [{ modelIds: BUILTIN_SNAPSHOT.map((entry) => entry.id) }] }] }, legacyIds);
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Current registry state (process-wide) and its on-disk cache
139
+ // ---------------------------------------------------------------------------
140
+ const CACHE_FILENAME = "antigravity-models.json";
141
+ const CACHE_VERSION = 1;
142
+ let current;
143
+ function configDir() {
144
+ if (process.env.OPENCODE_CONFIG_DIR)
145
+ return process.env.OPENCODE_CONFIG_DIR;
146
+ return join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "opencode");
147
+ }
148
+ export function getRegistryCachePath() {
149
+ return join(configDir(), CACHE_FILENAME);
150
+ }
151
+ function isRegistryModel(value) {
152
+ if (!value || typeof value !== "object")
153
+ return false;
154
+ const model = value;
155
+ return typeof model.id === "string" && typeof model.upstreamId === "string" && Array.isArray(model.variants);
156
+ }
157
+ function readCache() {
158
+ const path = getRegistryCachePath();
159
+ if (!existsSync(path))
160
+ return undefined;
161
+ try {
162
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
163
+ if (parsed.version !== CACHE_VERSION || !Array.isArray(parsed.models))
164
+ return undefined;
165
+ const models = parsed.models.filter(isRegistryModel);
166
+ if (models.length === 0)
167
+ return undefined;
168
+ return { models, fetchedAt: typeof parsed.fetchedAt === "number" ? parsed.fetchedAt : 0 };
169
+ }
170
+ catch (error) {
171
+ log.warn("ignoring unreadable model cache", { path, error: String(error) });
172
+ return undefined;
173
+ }
174
+ }
175
+ /** The models currently offered: the last discovery (memory, then disk cache) or the snapshot. */
176
+ export function getRegistryModels() {
177
+ if (!current) {
178
+ current = readCache() ?? { models: builtinRegistryModels() };
179
+ }
180
+ return current.models;
181
+ }
182
+ /** When the current list was discovered, or undefined for the built-in snapshot. */
183
+ export function getRegistryFetchedAt() {
184
+ getRegistryModels();
185
+ return current?.fetchedAt;
186
+ }
187
+ /** Replaces the current list with a fresh discovery and caches it on disk. */
188
+ export function setRegistryModels(models, fetchedAt = Date.now()) {
189
+ if (models.length === 0)
190
+ return;
191
+ current = { models, fetchedAt };
192
+ const path = getRegistryCachePath();
193
+ try {
194
+ mkdirSync(dirname(path), { recursive: true });
195
+ const temp = `${path}.${process.pid}.tmp`;
196
+ writeFileSync(temp, `${JSON.stringify({ version: CACHE_VERSION, fetchedAt, models }, null, 2)}\n`);
197
+ renameSync(temp, path);
198
+ }
199
+ catch (error) {
200
+ log.warn("could not write model cache", { path, error: String(error) });
201
+ }
202
+ }
203
+ /** Test hook: forget the in-memory state so the next read starts over. */
204
+ export function resetRegistryForTests(models) {
205
+ current = models ? { models } : undefined;
206
+ }
207
+ // ---------------------------------------------------------------------------
208
+ // Lookups used by the request pipeline
209
+ // ---------------------------------------------------------------------------
210
+ function normalizeTier(value) {
211
+ const lower = value?.toLowerCase();
212
+ return TIER_ORDER.find((tier) => tier === lower);
213
+ }
214
+ /**
215
+ * Maps a requested model (catalog ID, with or without `antigravity-`, or an upstream ID) and an
216
+ * optional tier to the upstream model ID to send. Returns undefined for models the registry does
217
+ * not know, which keep the pipeline's own name handling.
218
+ */
219
+ export function resolveUpstreamModel(requestedModel, tier) {
220
+ const name = requestedModel.replace(/^antigravity-/i, "").toLowerCase();
221
+ const requestedTier = normalizeTier(tier);
222
+ for (const model of getRegistryModels()) {
223
+ if (model.id.toLowerCase() === name) {
224
+ if (model.variants.length === 0) {
225
+ return { model, upstreamId: model.upstreamId, hubOnly: model.hubOnly };
226
+ }
227
+ const variant = model.variants.find((entry) => entry.tier === requestedTier) ??
228
+ model.variants.find((entry) => entry.upstreamId === model.upstreamId) ??
229
+ model.variants[0];
230
+ return { model, upstreamId: variant.upstreamId, tier: variant.tier, hubOnly: variant.hubOnly };
231
+ }
232
+ const variant = model.variants.find((entry) => entry.upstreamId.toLowerCase() === name);
233
+ if (variant) {
234
+ return { model, upstreamId: variant.upstreamId, tier: variant.tier, hubOnly: variant.hubOnly };
235
+ }
236
+ if (model.variants.length === 0 && model.upstreamId.toLowerCase() === name) {
237
+ return { model, upstreamId: model.upstreamId, hubOnly: model.hubOnly };
238
+ }
239
+ }
240
+ return undefined;
241
+ }
242
+ /** True when the upstream ID is only served to the current Antigravity client. */
243
+ export function requiresHubUserAgent(upstreamId) {
244
+ const lower = upstreamId.toLowerCase();
245
+ return getRegistryModels().some((model) => (model.variants.length === 0 && model.hubOnly && model.upstreamId.toLowerCase() === lower) ||
246
+ model.variants.some((variant) => variant.hubOnly && variant.upstreamId.toLowerCase() === lower));
247
+ }
248
+ //# sourceMappingURL=model-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-registry.js","sourceRoot":"","sources":["../../../src/plugin/model-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { OAuthAuthDetails, ProjectContextResult } from "./types";
2
+ interface AntigravityUserTier {
3
+ id?: string;
4
+ isDefault?: boolean;
5
+ userDefinedCloudaicompanionProject?: boolean;
6
+ }
7
+ interface LoadCodeAssistPayload {
8
+ cloudaicompanionProject?: string | {
9
+ id?: string;
10
+ };
11
+ currentTier?: {
12
+ id?: string;
13
+ };
14
+ allowedTiers?: AntigravityUserTier[];
15
+ }
16
+ /**
17
+ * Clears cached project context results and pending promises, globally or for a refresh key.
18
+ */
19
+ export declare function invalidateProjectContextCache(refresh?: string): void;
20
+ /**
21
+ * Loads managed project information for the given access token and optional project.
22
+ */
23
+ export declare function loadManagedProject(accessToken: string, projectId?: string): Promise<LoadCodeAssistPayload | null>;
24
+ /**
25
+ * Onboards a managed project for the user, optionally retrying until completion.
26
+ */
27
+ export declare function onboardManagedProject(accessToken: string, tierId: string, projectId?: string, attempts?: number, delayMs?: number): Promise<string | undefined>;
28
+ /**
29
+ * Resolves an effective project ID for the current auth state, caching results per refresh token.
30
+ */
31
+ export declare function ensureProjectContext(auth: OAuthAuthDetails): Promise<ProjectContextResult>;
32
+ export {};
33
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../../src/plugin/project.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAatE,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,kCAAkC,CAAC,EAAE,OAAO,CAAC;CAC9C;AAED,UAAU,qBAAqB;IAC7B,uBAAuB,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,WAAW,CAAC,EAAE;QACZ,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACtC;AAuED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAQpE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAuCvC;AAGD;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,SAAK,EACb,OAAO,SAAO,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CA6C7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA+FhG"}
@@ -0,0 +1,234 @@
1
+ import { getAntigravityHeaders, ANTIGRAVITY_ENDPOINT_FALLBACKS, ANTIGRAVITY_LOAD_ENDPOINTS, ANTIGRAVITY_DEFAULT_PROJECT_ID, } from "../constants";
2
+ import { formatRefreshParts, parseRefreshParts } from "./auth";
3
+ import { createLogger } from "./logger";
4
+ const log = createLogger("project");
5
+ const projectContextResultCache = new Map();
6
+ const projectContextPendingCache = new Map();
7
+ const CODE_ASSIST_METADATA = {
8
+ ideType: "ANTIGRAVITY",
9
+ platform: process.platform === "win32" ? "WINDOWS" : "MACOS",
10
+ pluginType: "GEMINI",
11
+ };
12
+ function buildMetadata(projectId) {
13
+ const metadata = {
14
+ ideType: CODE_ASSIST_METADATA.ideType,
15
+ platform: CODE_ASSIST_METADATA.platform,
16
+ pluginType: CODE_ASSIST_METADATA.pluginType,
17
+ };
18
+ if (projectId) {
19
+ metadata.duetProject = projectId;
20
+ }
21
+ return metadata;
22
+ }
23
+ /**
24
+ * Selects the default tier ID from the allowed tiers list.
25
+ */
26
+ function getDefaultTierId(allowedTiers) {
27
+ if (!allowedTiers || allowedTiers.length === 0) {
28
+ return undefined;
29
+ }
30
+ for (const tier of allowedTiers) {
31
+ if (tier?.isDefault) {
32
+ return tier.id;
33
+ }
34
+ }
35
+ return allowedTiers[0]?.id;
36
+ }
37
+ /**
38
+ * Promise-based delay utility.
39
+ */
40
+ function wait(ms) {
41
+ return new Promise(function (resolve) {
42
+ setTimeout(resolve, ms);
43
+ });
44
+ }
45
+ /**
46
+ * Extracts the cloudaicompanion project id from loadCodeAssist responses.
47
+ */
48
+ function extractManagedProjectId(payload) {
49
+ if (!payload) {
50
+ return undefined;
51
+ }
52
+ if (typeof payload.cloudaicompanionProject === "string") {
53
+ return payload.cloudaicompanionProject;
54
+ }
55
+ if (payload.cloudaicompanionProject && typeof payload.cloudaicompanionProject.id === "string") {
56
+ return payload.cloudaicompanionProject.id;
57
+ }
58
+ return undefined;
59
+ }
60
+ /**
61
+ * Generates a cache key for project context based on refresh token.
62
+ */
63
+ function getCacheKey(auth) {
64
+ const refresh = auth.refresh?.trim();
65
+ return refresh ? refresh : undefined;
66
+ }
67
+ /**
68
+ * Clears cached project context results and pending promises, globally or for a refresh key.
69
+ */
70
+ export function invalidateProjectContextCache(refresh) {
71
+ if (!refresh) {
72
+ projectContextPendingCache.clear();
73
+ projectContextResultCache.clear();
74
+ return;
75
+ }
76
+ projectContextPendingCache.delete(refresh);
77
+ projectContextResultCache.delete(refresh);
78
+ }
79
+ /**
80
+ * Loads managed project information for the given access token and optional project.
81
+ */
82
+ export async function loadManagedProject(accessToken, projectId) {
83
+ const metadata = buildMetadata(projectId);
84
+ const requestBody = { metadata };
85
+ const loadHeaders = {
86
+ "Content-Type": "application/json",
87
+ Authorization: `Bearer ${accessToken}`,
88
+ "User-Agent": "google-api-nodejs-client/9.15.1",
89
+ "X-Goog-Api-Client": "google-cloud-sdk vscode_cloudshelleditor/0.1",
90
+ "Client-Metadata": getAntigravityHeaders()["Client-Metadata"],
91
+ };
92
+ const loadEndpoints = Array.from(new Set([...ANTIGRAVITY_LOAD_ENDPOINTS, ...ANTIGRAVITY_ENDPOINT_FALLBACKS]));
93
+ for (const baseEndpoint of loadEndpoints) {
94
+ try {
95
+ const response = await fetch(`${baseEndpoint}/v1internal:loadCodeAssist`, {
96
+ method: "POST",
97
+ headers: loadHeaders,
98
+ body: JSON.stringify(requestBody),
99
+ });
100
+ if (!response.ok) {
101
+ continue;
102
+ }
103
+ return (await response.json());
104
+ }
105
+ catch (error) {
106
+ log.debug("Failed to load managed project", { endpoint: baseEndpoint, error: String(error) });
107
+ continue;
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Onboards a managed project for the user, optionally retrying until completion.
114
+ */
115
+ export async function onboardManagedProject(accessToken, tierId, projectId, attempts = 10, delayMs = 5000) {
116
+ const metadata = buildMetadata(projectId);
117
+ const requestBody = {
118
+ tierId,
119
+ metadata,
120
+ };
121
+ for (const baseEndpoint of ANTIGRAVITY_ENDPOINT_FALLBACKS) {
122
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
123
+ try {
124
+ const response = await fetch(`${baseEndpoint}/v1internal:onboardUser`, {
125
+ method: "POST",
126
+ headers: {
127
+ "Content-Type": "application/json",
128
+ Authorization: `Bearer ${accessToken}`,
129
+ ...getAntigravityHeaders(),
130
+ },
131
+ body: JSON.stringify(requestBody),
132
+ });
133
+ if (!response.ok) {
134
+ break;
135
+ }
136
+ const payload = (await response.json());
137
+ const managedProjectId = payload.response?.cloudaicompanionProject?.id;
138
+ if (payload.done && managedProjectId) {
139
+ return managedProjectId;
140
+ }
141
+ if (payload.done && projectId) {
142
+ return projectId;
143
+ }
144
+ }
145
+ catch (error) {
146
+ log.debug("Failed to onboard managed project", { endpoint: baseEndpoint, error: String(error) });
147
+ break;
148
+ }
149
+ await wait(delayMs);
150
+ }
151
+ }
152
+ return undefined;
153
+ }
154
+ /**
155
+ * Resolves an effective project ID for the current auth state, caching results per refresh token.
156
+ */
157
+ export async function ensureProjectContext(auth) {
158
+ const accessToken = auth.access;
159
+ if (!accessToken) {
160
+ return { auth, effectiveProjectId: "" };
161
+ }
162
+ const cacheKey = getCacheKey(auth);
163
+ if (cacheKey) {
164
+ const cached = projectContextResultCache.get(cacheKey);
165
+ if (cached) {
166
+ return cached;
167
+ }
168
+ const pending = projectContextPendingCache.get(cacheKey);
169
+ if (pending) {
170
+ return pending;
171
+ }
172
+ }
173
+ const resolveContext = async () => {
174
+ const parts = parseRefreshParts(auth.refresh);
175
+ if (parts.managedProjectId) {
176
+ return { auth, effectiveProjectId: parts.managedProjectId };
177
+ }
178
+ const fallbackProjectId = ANTIGRAVITY_DEFAULT_PROJECT_ID;
179
+ const persistManagedProject = async (managedProjectId) => {
180
+ const updatedAuth = {
181
+ ...auth,
182
+ refresh: formatRefreshParts({
183
+ refreshToken: parts.refreshToken,
184
+ projectId: parts.projectId,
185
+ managedProjectId,
186
+ }),
187
+ };
188
+ return { auth: updatedAuth, effectiveProjectId: managedProjectId };
189
+ };
190
+ // Try to resolve a managed project from Antigravity if possible.
191
+ const loadPayload = await loadManagedProject(accessToken, parts.projectId ?? fallbackProjectId);
192
+ const resolvedManagedProjectId = extractManagedProjectId(loadPayload);
193
+ if (resolvedManagedProjectId) {
194
+ return persistManagedProject(resolvedManagedProjectId);
195
+ }
196
+ // No managed project found - try to auto-provision one via onboarding.
197
+ // This handles accounts that were added before managed project provisioning was required.
198
+ const tierId = getDefaultTierId(loadPayload?.allowedTiers) ?? "FREE";
199
+ log.debug("Auto-provisioning managed project", { tierId, projectId: parts.projectId });
200
+ const provisionedProjectId = await onboardManagedProject(accessToken, tierId, parts.projectId);
201
+ if (provisionedProjectId) {
202
+ log.debug("Successfully provisioned managed project", { provisionedProjectId });
203
+ return persistManagedProject(provisionedProjectId);
204
+ }
205
+ log.warn("Failed to provision managed project - account may not work correctly", {
206
+ hasProjectId: !!parts.projectId,
207
+ });
208
+ if (parts.projectId) {
209
+ return { auth, effectiveProjectId: parts.projectId };
210
+ }
211
+ // No project id present in auth; fall back to the hardcoded id for requests.
212
+ return { auth, effectiveProjectId: fallbackProjectId };
213
+ };
214
+ if (!cacheKey) {
215
+ return resolveContext();
216
+ }
217
+ const promise = resolveContext()
218
+ .then((result) => {
219
+ const nextKey = getCacheKey(result.auth) ?? cacheKey;
220
+ projectContextPendingCache.delete(cacheKey);
221
+ projectContextResultCache.set(nextKey, result);
222
+ if (nextKey !== cacheKey) {
223
+ projectContextResultCache.delete(cacheKey);
224
+ }
225
+ return result;
226
+ })
227
+ .catch((error) => {
228
+ projectContextPendingCache.delete(cacheKey);
229
+ throw error;
230
+ });
231
+ projectContextPendingCache.set(cacheKey, promise);
232
+ return promise;
233
+ }
234
+ //# sourceMappingURL=project.js.map