@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,650 @@
1
+ import { promises as fs } from "node:fs";
2
+ import { existsSync, readFileSync, writeFileSync, appendFileSync, mkdirSync, renameSync, copyFileSync, unlinkSync, } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { homedir } from "node:os";
5
+ import { createHash, randomBytes } from "node:crypto";
6
+ import lockfile from "proper-lockfile";
7
+ import { createLogger } from "./logger";
8
+ const log = createLogger("storage");
9
+ /**
10
+ * Files/directories that should be gitignored in the config directory.
11
+ * These contain sensitive data or machine-specific state.
12
+ */
13
+ export const GITIGNORE_ENTRIES = [
14
+ ".gitignore",
15
+ "antigravity-accounts.json",
16
+ "antigravity-accounts.json.*.tmp",
17
+ "antigravity-signature-cache.json",
18
+ "antigravity-logs/",
19
+ ];
20
+ /**
21
+ * Ensures a .gitignore file exists in the config directory with entries
22
+ * for sensitive files. Creates the file if missing, or appends missing
23
+ * entries if it already exists.
24
+ */
25
+ export async function ensureGitignore(configDir) {
26
+ const gitignorePath = join(configDir, ".gitignore");
27
+ try {
28
+ let content;
29
+ let existingLines = [];
30
+ try {
31
+ content = await fs.readFile(gitignorePath, "utf-8");
32
+ existingLines = content.split("\n").map((line) => line.trim());
33
+ }
34
+ catch (error) {
35
+ if (error.code !== "ENOENT") {
36
+ return;
37
+ }
38
+ content = "";
39
+ }
40
+ const missingEntries = GITIGNORE_ENTRIES.filter((entry) => !existingLines.includes(entry));
41
+ if (missingEntries.length === 0) {
42
+ return;
43
+ }
44
+ if (content === "") {
45
+ await fs.writeFile(gitignorePath, missingEntries.join("\n") + "\n", "utf-8");
46
+ log.info("Created .gitignore in config directory");
47
+ }
48
+ else {
49
+ const suffix = content.endsWith("\n") ? "" : "\n";
50
+ await fs.appendFile(gitignorePath, suffix + missingEntries.join("\n") + "\n", "utf-8");
51
+ log.info("Updated .gitignore with missing entries", {
52
+ added: missingEntries,
53
+ });
54
+ }
55
+ }
56
+ catch {
57
+ // Non-critical feature
58
+ }
59
+ }
60
+ /**
61
+ * Synchronous version of ensureGitignore for use in sync code paths.
62
+ */
63
+ export function ensureGitignoreSync(configDir) {
64
+ const gitignorePath = join(configDir, ".gitignore");
65
+ try {
66
+ let content;
67
+ let existingLines = [];
68
+ if (existsSync(gitignorePath)) {
69
+ content = readFileSync(gitignorePath, "utf-8");
70
+ existingLines = content.split("\n").map((line) => line.trim());
71
+ }
72
+ else {
73
+ content = "";
74
+ }
75
+ const missingEntries = GITIGNORE_ENTRIES.filter((entry) => !existingLines.includes(entry));
76
+ if (missingEntries.length === 0) {
77
+ return;
78
+ }
79
+ if (content === "") {
80
+ writeFileSync(gitignorePath, missingEntries.join("\n") + "\n", "utf-8");
81
+ log.info("Created .gitignore in config directory");
82
+ }
83
+ else {
84
+ const suffix = content.endsWith("\n") ? "" : "\n";
85
+ appendFileSync(gitignorePath, suffix + missingEntries.join("\n") + "\n", "utf-8");
86
+ log.info("Updated .gitignore with missing entries", {
87
+ added: missingEntries,
88
+ });
89
+ }
90
+ }
91
+ catch {
92
+ // Non-critical feature
93
+ }
94
+ }
95
+ /**
96
+ * Gets the legacy Windows config directory (%APPDATA%\opencode).
97
+ * Used for migration from older plugin versions.
98
+ */
99
+ function getLegacyWindowsConfigDir() {
100
+ return join(process.env.APPDATA || join(homedir(), "AppData", "Roaming"), "opencode");
101
+ }
102
+ /**
103
+ * Gets the config directory path, with the following precedence:
104
+ * 1. OPENCODE_CONFIG_DIR env var (if set)
105
+ * 2. ~/.config/opencode (all platforms, including Windows)
106
+ *
107
+ * On Windows, also checks for legacy %APPDATA%\opencode path for migration.
108
+ */
109
+ function getConfigDir() {
110
+ // 1. Check for explicit override via env var
111
+ if (process.env.OPENCODE_CONFIG_DIR) {
112
+ return process.env.OPENCODE_CONFIG_DIR;
113
+ }
114
+ // 2. Use ~/.config/opencode on all platforms (including Windows)
115
+ const xdgConfig = process.env.XDG_CONFIG_HOME || join(homedir(), ".config");
116
+ return join(xdgConfig, "opencode");
117
+ }
118
+ /**
119
+ * Migrates config from legacy Windows location to the new path.
120
+ * Moves the file if legacy exists and new doesn't.
121
+ * Returns true if migration was performed.
122
+ */
123
+ function migrateLegacyWindowsConfig() {
124
+ if (process.platform !== "win32") {
125
+ return false;
126
+ }
127
+ const newPath = join(getConfigDir(), "antigravity-accounts.json");
128
+ const legacyPath = join(getLegacyWindowsConfigDir(), "antigravity-accounts.json");
129
+ // Only migrate if legacy exists and new doesn't
130
+ if (!existsSync(legacyPath) || existsSync(newPath)) {
131
+ return false;
132
+ }
133
+ try {
134
+ // Ensure new config directory exists
135
+ const newConfigDir = getConfigDir();
136
+ mkdirSync(newConfigDir, { recursive: true });
137
+ // Try rename first (atomic, but fails across filesystems)
138
+ try {
139
+ renameSync(legacyPath, newPath);
140
+ log.info("Migrated Windows config via rename", { from: legacyPath, to: newPath });
141
+ }
142
+ catch {
143
+ // Fallback: copy then delete (for cross-filesystem moves)
144
+ copyFileSync(legacyPath, newPath);
145
+ unlinkSync(legacyPath);
146
+ log.info("Migrated Windows config via copy+delete", { from: legacyPath, to: newPath });
147
+ }
148
+ return true;
149
+ }
150
+ catch (error) {
151
+ log.warn("Failed to migrate legacy Windows config, will use legacy path", {
152
+ legacyPath,
153
+ newPath,
154
+ error: String(error),
155
+ });
156
+ return false;
157
+ }
158
+ }
159
+ /**
160
+ * Gets the storage path, migrating from legacy Windows location if needed.
161
+ * On Windows, attempts to move legacy config to new path for alignment.
162
+ */
163
+ function getStoragePathWithMigration() {
164
+ const newPath = join(getConfigDir(), "antigravity-accounts.json");
165
+ // On Windows, attempt to migrate legacy config to new location
166
+ if (process.platform === "win32") {
167
+ migrateLegacyWindowsConfig();
168
+ // If migration failed and legacy still exists, fall back to it
169
+ if (!existsSync(newPath)) {
170
+ const legacyPath = join(getLegacyWindowsConfigDir(), "antigravity-accounts.json");
171
+ if (existsSync(legacyPath)) {
172
+ log.info("Using legacy Windows config path (migration failed)", {
173
+ legacyPath,
174
+ newPath,
175
+ });
176
+ return legacyPath;
177
+ }
178
+ }
179
+ }
180
+ return newPath;
181
+ }
182
+ export function getStoragePath() {
183
+ return getStoragePathWithMigration();
184
+ }
185
+ /**
186
+ * Gets the config directory path. Exported for use by other modules.
187
+ */
188
+ export { getConfigDir };
189
+ const LOCK_OPTIONS = {
190
+ stale: 10000,
191
+ retries: {
192
+ retries: 5,
193
+ minTimeout: 100,
194
+ maxTimeout: 1000,
195
+ factor: 2,
196
+ },
197
+ };
198
+ /**
199
+ * Ensures the file has secure permissions (0600) on POSIX systems.
200
+ * This is a best-effort operation and ignores errors on Windows/unsupported FS.
201
+ */
202
+ async function ensureSecurePermissions(path) {
203
+ try {
204
+ await fs.chmod(path, 0o600);
205
+ }
206
+ catch {
207
+ // Ignore errors (e.g. Windows, file doesn't exist, FS doesn't support chmod)
208
+ }
209
+ }
210
+ async function ensureFileExists(path) {
211
+ try {
212
+ await fs.access(path);
213
+ }
214
+ catch {
215
+ await fs.mkdir(dirname(path), { recursive: true });
216
+ await fs.writeFile(path, JSON.stringify({ version: 4, accounts: [], activeIndex: 0 }, null, 2), { encoding: "utf-8", mode: 0o600 });
217
+ }
218
+ }
219
+ async function withFileLock(path, fn) {
220
+ await ensureFileExists(path);
221
+ let release = null;
222
+ try {
223
+ release = await lockfile.lock(path, LOCK_OPTIONS);
224
+ return await fn();
225
+ }
226
+ finally {
227
+ if (release) {
228
+ try {
229
+ await release();
230
+ }
231
+ catch (unlockError) {
232
+ log.warn("Failed to release lock", { error: String(unlockError) });
233
+ }
234
+ }
235
+ }
236
+ }
237
+ /** Fingerprint of a refresh token, so retired tokens can be recognized without storing them. */
238
+ export function hashRefreshToken(refreshToken) {
239
+ return createHash("sha256").update(refreshToken).digest("hex").slice(0, 32);
240
+ }
241
+ const MAX_RETIRED_TOKEN_HASHES = 200;
242
+ function mergeRetired(...lists) {
243
+ const merged = [...new Set(lists.flatMap((list) => list ?? []))];
244
+ return merged.slice(-MAX_RETIRED_TOKEN_HASHES);
245
+ }
246
+ function withoutRetired(accounts, retired) {
247
+ if (retired.length === 0)
248
+ return accounts;
249
+ const set = new Set(retired);
250
+ return accounts.filter((account) => !set.has(hashRefreshToken(account.refreshToken)));
251
+ }
252
+ function mergeAccountStorage(existing, incoming, unretiredHashes = []) {
253
+ const unretired = new Set(unretiredHashes);
254
+ const retired = mergeRetired(existing.retiredTokenHashes, incoming.retiredTokenHashes).filter((hash) => !unretired.has(hash));
255
+ const retiredSet = new Set(retired);
256
+ const isRetired = (acc) => retiredSet.has(hashRefreshToken(acc.refreshToken));
257
+ // Merge in place, so positions (activeIndex, activeIndexByFamily) keep pointing at the same accounts.
258
+ const merged = [...existing.accounts];
259
+ const indexByToken = new Map(merged.map((acc, index) => [acc.refreshToken, index]));
260
+ const indexByEmail = new Map(merged.flatMap((acc, index) => (acc.email ? [[acc.email, index]] : [])));
261
+ for (const acc of incoming.accounts) {
262
+ if (!acc.refreshToken || isRetired(acc))
263
+ continue;
264
+ let index = indexByToken.get(acc.refreshToken);
265
+ if (index === undefined && acc.email) {
266
+ // The same Google account under another token (re-authentication): take over its slot when
267
+ // the stored token is retired or older; otherwise the email dedupe below keeps the newer one.
268
+ const sameEmail = indexByEmail.get(acc.email);
269
+ const stored = sameEmail === undefined ? undefined : merged[sameEmail];
270
+ if (stored && (isRetired(stored) || (acc.lastUsed || 0) >= (stored.lastUsed || 0)))
271
+ index = sameEmail;
272
+ }
273
+ if (index === undefined) {
274
+ indexByToken.set(acc.refreshToken, merged.length);
275
+ if (acc.email)
276
+ indexByEmail.set(acc.email, merged.length);
277
+ merged.push(acc);
278
+ continue;
279
+ }
280
+ const existingAcc = merged[index];
281
+ merged[index] = {
282
+ ...existingAcc,
283
+ ...acc,
284
+ // Preserve manually configured projectId/managedProjectId if not in incoming
285
+ projectId: acc.projectId ?? existingAcc.projectId,
286
+ managedProjectId: acc.managedProjectId ?? existingAcc.managedProjectId,
287
+ rateLimitResetTimes: {
288
+ ...existingAcc.rateLimitResetTimes,
289
+ ...acc.rateLimitResetTimes,
290
+ },
291
+ lastUsed: Math.max(existingAcc.lastUsed || 0, acc.lastUsed || 0),
292
+ };
293
+ indexByToken.set(acc.refreshToken, index);
294
+ }
295
+ return {
296
+ version: 4,
297
+ // Same Google account under two tokens (one replaced but not retired): keep the newest.
298
+ accounts: deduplicateAccountsByEmail(merged.filter((acc) => !isRetired(acc))),
299
+ activeIndex: incoming.activeIndex,
300
+ activeIndexByFamily: incoming.activeIndexByFamily,
301
+ ...(retired.length > 0 ? { retiredTokenHashes: retired } : {}),
302
+ };
303
+ }
304
+ export function deduplicateAccountsByEmail(accounts) {
305
+ const emailToNewestIndex = new Map();
306
+ const indicesToKeep = new Set();
307
+ // First pass: find the newest account for each email (by lastUsed, then addedAt)
308
+ for (let i = 0; i < accounts.length; i++) {
309
+ const acc = accounts[i];
310
+ if (!acc)
311
+ continue;
312
+ if (!acc.email) {
313
+ // No email - keep this account (can't deduplicate without email)
314
+ indicesToKeep.add(i);
315
+ continue;
316
+ }
317
+ const existingIndex = emailToNewestIndex.get(acc.email);
318
+ if (existingIndex === undefined) {
319
+ emailToNewestIndex.set(acc.email, i);
320
+ continue;
321
+ }
322
+ // Compare to find which is newer
323
+ const existing = accounts[existingIndex];
324
+ if (!existing) {
325
+ emailToNewestIndex.set(acc.email, i);
326
+ continue;
327
+ }
328
+ // Prefer higher lastUsed, then higher addedAt
329
+ // Compare fields separately to avoid integer overflow with large timestamps
330
+ const currLastUsed = acc.lastUsed || 0;
331
+ const existLastUsed = existing.lastUsed || 0;
332
+ const currAddedAt = acc.addedAt || 0;
333
+ const existAddedAt = existing.addedAt || 0;
334
+ const isNewer = currLastUsed > existLastUsed ||
335
+ (currLastUsed === existLastUsed && currAddedAt > existAddedAt);
336
+ if (isNewer) {
337
+ emailToNewestIndex.set(acc.email, i);
338
+ }
339
+ }
340
+ // Add all the newest email-based indices to the keep set
341
+ for (const idx of emailToNewestIndex.values()) {
342
+ indicesToKeep.add(idx);
343
+ }
344
+ // Build the deduplicated list, preserving original order for kept items
345
+ const result = [];
346
+ for (let i = 0; i < accounts.length; i++) {
347
+ if (indicesToKeep.has(i)) {
348
+ const acc = accounts[i];
349
+ if (acc) {
350
+ result.push(acc);
351
+ }
352
+ }
353
+ }
354
+ return result;
355
+ }
356
+ function migrateV1ToV2(v1) {
357
+ return {
358
+ version: 2,
359
+ accounts: v1.accounts.map((acc) => {
360
+ const rateLimitResetTimes = {};
361
+ if (acc.isRateLimited &&
362
+ acc.rateLimitResetTime &&
363
+ acc.rateLimitResetTime > Date.now()) {
364
+ rateLimitResetTimes.claude = acc.rateLimitResetTime;
365
+ rateLimitResetTimes.gemini = acc.rateLimitResetTime;
366
+ }
367
+ return {
368
+ email: acc.email,
369
+ refreshToken: acc.refreshToken,
370
+ projectId: acc.projectId,
371
+ managedProjectId: acc.managedProjectId,
372
+ addedAt: acc.addedAt,
373
+ lastUsed: acc.lastUsed,
374
+ lastSwitchReason: acc.lastSwitchReason,
375
+ rateLimitResetTimes: Object.keys(rateLimitResetTimes).length > 0
376
+ ? rateLimitResetTimes
377
+ : undefined,
378
+ };
379
+ }),
380
+ activeIndex: v1.activeIndex,
381
+ };
382
+ }
383
+ export function migrateV2ToV3(v2) {
384
+ return {
385
+ version: 3,
386
+ accounts: v2.accounts.map((acc) => {
387
+ const rateLimitResetTimes = {};
388
+ if (acc.rateLimitResetTimes?.claude &&
389
+ acc.rateLimitResetTimes.claude > Date.now()) {
390
+ rateLimitResetTimes.claude = acc.rateLimitResetTimes.claude;
391
+ }
392
+ if (acc.rateLimitResetTimes?.gemini &&
393
+ acc.rateLimitResetTimes.gemini > Date.now()) {
394
+ rateLimitResetTimes["gemini-antigravity"] =
395
+ acc.rateLimitResetTimes.gemini;
396
+ }
397
+ return {
398
+ email: acc.email,
399
+ refreshToken: acc.refreshToken,
400
+ projectId: acc.projectId,
401
+ managedProjectId: acc.managedProjectId,
402
+ addedAt: acc.addedAt,
403
+ lastUsed: acc.lastUsed,
404
+ lastSwitchReason: acc.lastSwitchReason,
405
+ rateLimitResetTimes: Object.keys(rateLimitResetTimes).length > 0
406
+ ? rateLimitResetTimes
407
+ : undefined,
408
+ };
409
+ }),
410
+ activeIndex: v2.activeIndex,
411
+ };
412
+ }
413
+ export function migrateV3ToV4(v3) {
414
+ return {
415
+ version: 4,
416
+ accounts: v3.accounts.map((acc) => ({
417
+ ...acc,
418
+ fingerprint: undefined,
419
+ fingerprintHistory: undefined,
420
+ })),
421
+ activeIndex: v3.activeIndex,
422
+ activeIndexByFamily: v3.activeIndexByFamily,
423
+ };
424
+ }
425
+ export async function loadAccounts() {
426
+ try {
427
+ const path = getStoragePath();
428
+ // Ensure permissions are correct on load (fixes existing files)
429
+ await ensureSecurePermissions(path);
430
+ const content = await fs.readFile(path, "utf-8");
431
+ const data = JSON.parse(content);
432
+ if (!Array.isArray(data.accounts)) {
433
+ log.warn("Invalid storage format, ignoring");
434
+ return null;
435
+ }
436
+ let storage;
437
+ if (data.version === 1) {
438
+ log.info("Migrating account storage from v1 to v4");
439
+ const v2 = migrateV1ToV2(data);
440
+ const v3 = migrateV2ToV3(v2);
441
+ storage = migrateV3ToV4(v3);
442
+ try {
443
+ await saveAccounts(storage);
444
+ log.info("Migration to v4 complete");
445
+ }
446
+ catch (saveError) {
447
+ log.warn("Failed to persist migrated storage", {
448
+ error: String(saveError),
449
+ });
450
+ }
451
+ }
452
+ else if (data.version === 2) {
453
+ log.info("Migrating account storage from v2 to v4");
454
+ const v3 = migrateV2ToV3(data);
455
+ storage = migrateV3ToV4(v3);
456
+ try {
457
+ await saveAccounts(storage);
458
+ log.info("Migration to v4 complete");
459
+ }
460
+ catch (saveError) {
461
+ log.warn("Failed to persist migrated storage", {
462
+ error: String(saveError),
463
+ });
464
+ }
465
+ }
466
+ else if (data.version === 3) {
467
+ log.info("Migrating account storage from v3 to v4");
468
+ storage = migrateV3ToV4(data);
469
+ try {
470
+ await saveAccounts(storage);
471
+ log.info("Migration to v4 complete");
472
+ }
473
+ catch (saveError) {
474
+ log.warn("Failed to persist migrated storage", {
475
+ error: String(saveError),
476
+ });
477
+ }
478
+ }
479
+ else if (data.version === 4) {
480
+ storage = data;
481
+ }
482
+ else {
483
+ log.warn("Unknown storage version, ignoring", {
484
+ version: data.version,
485
+ });
486
+ return null;
487
+ }
488
+ // Validate accounts have required fields
489
+ const validAccounts = storage.accounts.filter((a) => {
490
+ return (!!a &&
491
+ typeof a === "object" &&
492
+ typeof a.refreshToken === "string");
493
+ });
494
+ // Drop retired tokens, then deduplicate by email (keeps newest entry for each email)
495
+ const retiredTokenHashes = Array.isArray(storage.retiredTokenHashes) ? storage.retiredTokenHashes : [];
496
+ const deduplicatedAccounts = deduplicateAccountsByEmail(withoutRetired(validAccounts, retiredTokenHashes));
497
+ // Clamp activeIndex to valid range after deduplication
498
+ let activeIndex = typeof storage.activeIndex === "number" &&
499
+ Number.isFinite(storage.activeIndex)
500
+ ? storage.activeIndex
501
+ : 0;
502
+ if (deduplicatedAccounts.length > 0) {
503
+ activeIndex = Math.min(activeIndex, deduplicatedAccounts.length - 1);
504
+ activeIndex = Math.max(activeIndex, 0);
505
+ }
506
+ else {
507
+ activeIndex = 0;
508
+ }
509
+ return {
510
+ version: 4,
511
+ accounts: deduplicatedAccounts,
512
+ activeIndex,
513
+ activeIndexByFamily: storage.activeIndexByFamily,
514
+ ...(retiredTokenHashes.length > 0 ? { retiredTokenHashes } : {}),
515
+ };
516
+ }
517
+ catch (error) {
518
+ const code = error.code;
519
+ if (code === "ENOENT") {
520
+ return null;
521
+ }
522
+ log.error("Failed to load account storage", { error: String(error) });
523
+ return null;
524
+ }
525
+ }
526
+ /**
527
+ * Merges `storage` into the file. `options.unretireTokens` lifts the retirement of tokens a
528
+ * sign-in just wrote (in case Google hands back a token that was retired before).
529
+ */
530
+ export async function saveAccounts(storage, options = {}) {
531
+ const path = getStoragePath();
532
+ const configDir = dirname(path);
533
+ await fs.mkdir(configDir, { recursive: true });
534
+ await ensureGitignore(configDir);
535
+ await withFileLock(path, async () => {
536
+ const existing = await loadAccountsUnsafe();
537
+ const unretired = (options.unretireTokens ?? []).map(hashRefreshToken);
538
+ const merged = existing ? mergeAccountStorage(existing, storage, unretired) : storage;
539
+ const tempPath = `${path}.${randomBytes(6).toString("hex")}.tmp`;
540
+ const content = JSON.stringify(merged, null, 2);
541
+ try {
542
+ await fs.writeFile(tempPath, content, { encoding: "utf-8", mode: 0o600 });
543
+ await fs.rename(tempPath, path);
544
+ }
545
+ catch (error) {
546
+ // Clean up temp file on failure to prevent accumulation
547
+ try {
548
+ await fs.unlink(tempPath);
549
+ }
550
+ catch {
551
+ // Ignore cleanup errors (file may not exist)
552
+ }
553
+ throw error;
554
+ }
555
+ });
556
+ }
557
+ /**
558
+ * Save accounts storage by replacing the entire file (no merge).
559
+ * Use this for destructive operations like delete where we need to
560
+ * remove accounts that would otherwise be merged back from existing storage.
561
+ */
562
+ export async function saveAccountsReplace(storage) {
563
+ const path = getStoragePath();
564
+ const configDir = dirname(path);
565
+ await fs.mkdir(configDir, { recursive: true });
566
+ await ensureGitignore(configDir);
567
+ await withFileLock(path, async () => {
568
+ // Keep the retired-token list across replacing writes, and never write a retired token back.
569
+ const existing = await loadAccountsUnsafe();
570
+ const retired = mergeRetired(existing?.retiredTokenHashes, storage.retiredTokenHashes);
571
+ storage = {
572
+ ...storage,
573
+ accounts: withoutRetired(storage.accounts, retired),
574
+ ...(retired.length > 0 ? { retiredTokenHashes: retired } : {}),
575
+ };
576
+ const tempPath = `${path}.${randomBytes(6).toString("hex")}.tmp`;
577
+ const content = JSON.stringify(storage, null, 2);
578
+ try {
579
+ await fs.writeFile(tempPath, content, { encoding: "utf-8", mode: 0o600 });
580
+ await fs.rename(tempPath, path);
581
+ }
582
+ catch (error) {
583
+ try {
584
+ await fs.unlink(tempPath);
585
+ }
586
+ catch {
587
+ // Ignore cleanup errors
588
+ }
589
+ throw error;
590
+ }
591
+ });
592
+ }
593
+ /**
594
+ * Retires refresh tokens (replaced or removed accounts): their accounts are dropped from the
595
+ * pool now, and merges from account managers that still hold them can't bring them back.
596
+ */
597
+ export async function retireRefreshTokens(refreshTokens) {
598
+ if (refreshTokens.length === 0)
599
+ return;
600
+ const storage = await loadAccounts();
601
+ if (!storage)
602
+ return;
603
+ await saveAccountsReplace({
604
+ ...storage,
605
+ retiredTokenHashes: mergeRetired(storage.retiredTokenHashes, refreshTokens.map(hashRefreshToken)),
606
+ });
607
+ }
608
+ async function loadAccountsUnsafe() {
609
+ try {
610
+ const path = getStoragePath();
611
+ // Ensure permissions are correct on load (fixes existing files)
612
+ await ensureSecurePermissions(path);
613
+ const content = await fs.readFile(path, "utf-8");
614
+ const parsed = JSON.parse(content);
615
+ if (parsed.version === 1) {
616
+ return migrateV3ToV4(migrateV2ToV3(migrateV1ToV2(parsed)));
617
+ }
618
+ if (parsed.version === 2) {
619
+ return migrateV3ToV4(migrateV2ToV3(parsed));
620
+ }
621
+ if (parsed.version === 3) {
622
+ return migrateV3ToV4(parsed);
623
+ }
624
+ const retiredTokenHashes = Array.isArray(parsed.retiredTokenHashes) ? parsed.retiredTokenHashes : [];
625
+ return {
626
+ ...parsed,
627
+ accounts: deduplicateAccountsByEmail(withoutRetired(parsed.accounts, retiredTokenHashes)),
628
+ };
629
+ }
630
+ catch (error) {
631
+ const code = error.code;
632
+ if (code === "ENOENT") {
633
+ return null;
634
+ }
635
+ return null;
636
+ }
637
+ }
638
+ export async function clearAccounts() {
639
+ try {
640
+ const path = getStoragePath();
641
+ await fs.unlink(path);
642
+ }
643
+ catch (error) {
644
+ const code = error.code;
645
+ if (code !== "ENOENT") {
646
+ log.error("Failed to clear account storage", { error: String(error) });
647
+ }
648
+ }
649
+ }
650
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/plugin/storage.ts"],"names":[],"mappings":"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"}