opencode-antigravity-auth-mf 1.3.0-1

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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +630 -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 +168 -0
  10. package/dist/src/antigravity/oauth.js.map +1 -0
  11. package/dist/src/constants.d.ts +99 -0
  12. package/dist/src/constants.d.ts.map +1 -0
  13. package/dist/src/constants.js +135 -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 +237 -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 +125 -0
  30. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  32. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  34. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  35. package/dist/src/plugin/accounts.d.ts +86 -0
  36. package/dist/src/plugin/accounts.d.ts.map +1 -0
  37. package/dist/src/plugin/accounts.js +609 -0
  38. package/dist/src/plugin/accounts.js.map +1 -0
  39. package/dist/src/plugin/auth.d.ts +21 -0
  40. package/dist/src/plugin/auth.d.ts.map +1 -0
  41. package/dist/src/plugin/auth.js +46 -0
  42. package/dist/src/plugin/auth.js.map +1 -0
  43. package/dist/src/plugin/cache/index.d.ts +5 -0
  44. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  45. package/dist/src/plugin/cache/index.js +5 -0
  46. package/dist/src/plugin/cache/index.js.map +1 -0
  47. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  48. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  49. package/dist/src/plugin/cache/signature-cache.js +375 -0
  50. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  51. package/dist/src/plugin/cache.d.ts +44 -0
  52. package/dist/src/plugin/cache.d.ts.map +1 -0
  53. package/dist/src/plugin/cache.js +200 -0
  54. package/dist/src/plugin/cache.js.map +1 -0
  55. package/dist/src/plugin/cli.d.ts +19 -0
  56. package/dist/src/plugin/cli.d.ts.map +1 -0
  57. package/dist/src/plugin/cli.js +59 -0
  58. package/dist/src/plugin/cli.js.map +1 -0
  59. package/dist/src/plugin/config/index.d.ts +16 -0
  60. package/dist/src/plugin/config/index.d.ts.map +1 -0
  61. package/dist/src/plugin/config/index.js +16 -0
  62. package/dist/src/plugin/config/index.js.map +1 -0
  63. package/dist/src/plugin/config/loader.d.ts +37 -0
  64. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  65. package/dist/src/plugin/config/loader.js +206 -0
  66. package/dist/src/plugin/config/loader.js.map +1 -0
  67. package/dist/src/plugin/config/schema.d.ts +411 -0
  68. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  69. package/dist/src/plugin/config/schema.js +339 -0
  70. package/dist/src/plugin/config/schema.js.map +1 -0
  71. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  72. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  73. package/dist/src/plugin/core/streaming/index.js +3 -0
  74. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  75. package/dist/src/plugin/core/streaming/transformer.d.ts +10 -0
  76. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  77. package/dist/src/plugin/core/streaming/transformer.js +255 -0
  78. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  79. package/dist/src/plugin/core/streaming/types.d.ts +35 -0
  80. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  81. package/dist/src/plugin/core/streaming/types.js +1 -0
  82. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  83. package/dist/src/plugin/debug.d.ts +68 -0
  84. package/dist/src/plugin/debug.d.ts.map +1 -0
  85. package/dist/src/plugin/debug.js +325 -0
  86. package/dist/src/plugin/debug.js.map +1 -0
  87. package/dist/src/plugin/errors.d.ts +28 -0
  88. package/dist/src/plugin/errors.d.ts.map +1 -0
  89. package/dist/src/plugin/errors.js +42 -0
  90. package/dist/src/plugin/errors.js.map +1 -0
  91. package/dist/src/plugin/image-saver.d.ts +25 -0
  92. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  93. package/dist/src/plugin/image-saver.js +86 -0
  94. package/dist/src/plugin/image-saver.js.map +1 -0
  95. package/dist/src/plugin/logger.d.ts +54 -0
  96. package/dist/src/plugin/logger.d.ts.map +1 -0
  97. package/dist/src/plugin/logger.js +120 -0
  98. package/dist/src/plugin/logger.js.map +1 -0
  99. package/dist/src/plugin/project.d.ts +33 -0
  100. package/dist/src/plugin/project.d.ts.map +1 -0
  101. package/dist/src/plugin/project.js +234 -0
  102. package/dist/src/plugin/project.js.map +1 -0
  103. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  104. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  105. package/dist/src/plugin/recovery/constants.js +43 -0
  106. package/dist/src/plugin/recovery/constants.js.map +1 -0
  107. package/dist/src/plugin/recovery/index.d.ts +12 -0
  108. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  109. package/dist/src/plugin/recovery/index.js +12 -0
  110. package/dist/src/plugin/recovery/index.js.map +1 -0
  111. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  112. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  113. package/dist/src/plugin/recovery/storage.js +354 -0
  114. package/dist/src/plugin/recovery/storage.js.map +1 -0
  115. package/dist/src/plugin/recovery/types.d.ts +116 -0
  116. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  117. package/dist/src/plugin/recovery/types.js +6 -0
  118. package/dist/src/plugin/recovery/types.js.map +1 -0
  119. package/dist/src/plugin/recovery.d.ts +61 -0
  120. package/dist/src/plugin/recovery.d.ts.map +1 -0
  121. package/dist/src/plugin/recovery.js +376 -0
  122. package/dist/src/plugin/recovery.js.map +1 -0
  123. package/dist/src/plugin/refresh-queue.d.ts +101 -0
  124. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  125. package/dist/src/plugin/refresh-queue.js +244 -0
  126. package/dist/src/plugin/refresh-queue.js.map +1 -0
  127. package/dist/src/plugin/request-helpers.d.ts +278 -0
  128. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  129. package/dist/src/plugin/request-helpers.js +2268 -0
  130. package/dist/src/plugin/request-helpers.js.map +1 -0
  131. package/dist/src/plugin/request.d.ts +91 -0
  132. package/dist/src/plugin/request.d.ts.map +1 -0
  133. package/dist/src/plugin/request.js +1302 -0
  134. package/dist/src/plugin/request.js.map +1 -0
  135. package/dist/src/plugin/rotation.d.ts +168 -0
  136. package/dist/src/plugin/rotation.d.ts.map +1 -0
  137. package/dist/src/plugin/rotation.js +302 -0
  138. package/dist/src/plugin/rotation.js.map +1 -0
  139. package/dist/src/plugin/server.d.ts +23 -0
  140. package/dist/src/plugin/server.d.ts.map +1 -0
  141. package/dist/src/plugin/server.js +324 -0
  142. package/dist/src/plugin/server.js.map +1 -0
  143. package/dist/src/plugin/storage.d.ts +92 -0
  144. package/dist/src/plugin/storage.d.ts.map +1 -0
  145. package/dist/src/plugin/storage.js +417 -0
  146. package/dist/src/plugin/storage.js.map +1 -0
  147. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  148. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  149. package/dist/src/plugin/stores/signature-store.js +25 -0
  150. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  151. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  152. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  153. package/dist/src/plugin/thinking-recovery.js +316 -0
  154. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  155. package/dist/src/plugin/token.d.ts +19 -0
  156. package/dist/src/plugin/token.d.ts.map +1 -0
  157. package/dist/src/plugin/token.js +128 -0
  158. package/dist/src/plugin/token.js.map +1 -0
  159. package/dist/src/plugin/transform/claude.d.ts +80 -0
  160. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  161. package/dist/src/plugin/transform/claude.js +265 -0
  162. package/dist/src/plugin/transform/claude.js.map +1 -0
  163. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +35 -0
  164. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  165. package/dist/src/plugin/transform/cross-model-sanitizer.js +225 -0
  166. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  167. package/dist/src/plugin/transform/gemini.d.ts +112 -0
  168. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  169. package/dist/src/plugin/transform/gemini.js +409 -0
  170. package/dist/src/plugin/transform/gemini.js.map +1 -0
  171. package/dist/src/plugin/transform/index.d.ts +15 -0
  172. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  173. package/dist/src/plugin/transform/index.js +14 -0
  174. package/dist/src/plugin/transform/index.js.map +1 -0
  175. package/dist/src/plugin/transform/model-resolver.d.ts +101 -0
  176. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  177. package/dist/src/plugin/transform/model-resolver.js +356 -0
  178. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  179. package/dist/src/plugin/transform/types.d.ts +106 -0
  180. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  181. package/dist/src/plugin/transform/types.js +1 -0
  182. package/dist/src/plugin/transform/types.js.map +1 -0
  183. package/dist/src/plugin/types.d.ts +96 -0
  184. package/dist/src/plugin/types.d.ts.map +1 -0
  185. package/dist/src/plugin/types.js +1 -0
  186. package/dist/src/plugin/types.js.map +1 -0
  187. package/dist/src/plugin/usage-reporter.d.ts +23 -0
  188. package/dist/src/plugin/usage-reporter.d.ts.map +1 -0
  189. package/dist/src/plugin/usage-reporter.js +43 -0
  190. package/dist/src/plugin/usage-reporter.js.map +1 -0
  191. package/dist/src/plugin.d.ts +8 -0
  192. package/dist/src/plugin.d.ts.map +1 -0
  193. package/dist/src/plugin.js +1708 -0
  194. package/dist/src/plugin.js.map +1 -0
  195. package/package.json +67 -0
@@ -0,0 +1,324 @@
1
+ import { createServer } from "node:http";
2
+ import { readFileSync, existsSync } from "node:fs";
3
+ import { ANTIGRAVITY_REDIRECT_URI } from "../constants";
4
+ const redirectUri = new URL(ANTIGRAVITY_REDIRECT_URI);
5
+ const callbackPath = redirectUri.pathname || "/";
6
+ /**
7
+ * Detect if running in OrbStack Docker with --network host mode.
8
+ * OrbStack's host networking only forwards ports bound to 127.0.0.1 to macOS.
9
+ */
10
+ function isOrbStackDockerHost() {
11
+ // Check if we're in Docker
12
+ if (!existsSync("/.dockerenv")) {
13
+ return false;
14
+ }
15
+ // Check for OrbStack-specific indicators
16
+ // OrbStack sets specific environment variables or has identifiable characteristics
17
+ try {
18
+ // OrbStack containers often have /run/.containerenv or specific mount patterns
19
+ // Also check if /proc/version contains orbstack
20
+ if (existsSync("/proc/version")) {
21
+ const version = readFileSync("/proc/version", "utf8").toLowerCase();
22
+ if (version.includes("orbstack")) {
23
+ return true;
24
+ }
25
+ }
26
+ // Check hostname pattern (OrbStack uses specific patterns)
27
+ const hostname = process.env.HOSTNAME || "";
28
+ if (hostname.startsWith("orbstack-") || hostname.endsWith(".orb") || hostname === "orbstack") {
29
+ return true;
30
+ }
31
+ // Check for OrbStack's network host mode by looking at resolv.conf
32
+ // OrbStack with --network host has specific DNS configuration
33
+ if (existsSync("/etc/resolv.conf")) {
34
+ const resolv = readFileSync("/etc/resolv.conf", "utf8");
35
+ if (resolv.includes("orb.local") || resolv.includes("orbstack")) {
36
+ return true;
37
+ }
38
+ }
39
+ // Fallback: Check if running on macOS/Darwin host via Docker
40
+ // This is a heuristic - if in Docker on Linux but /proc/version shows darwin-like patterns
41
+ if (process.platform === "linux" && existsSync("/.dockerenv")) {
42
+ // Most OrbStack containers will have been caught above
43
+ // For safety, also check common OrbStack mount patterns
44
+ if (existsSync("/run/host-services")) {
45
+ return true;
46
+ }
47
+ }
48
+ }
49
+ catch {
50
+ // Ignore errors, fall through to default
51
+ }
52
+ return false;
53
+ }
54
+ /**
55
+ * Detect WSL (Windows Subsystem for Linux) environment.
56
+ */
57
+ function isWSL() {
58
+ if (process.platform !== "linux")
59
+ return false;
60
+ try {
61
+ const release = readFileSync("/proc/version", "utf8").toLowerCase();
62
+ return release.includes("microsoft") || release.includes("wsl");
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Detect remote/SSH environment where localhost may not be accessible from browser.
70
+ */
71
+ function isRemoteEnvironment() {
72
+ if (process.env.SSH_CLIENT || process.env.SSH_TTY || process.env.SSH_CONNECTION) {
73
+ return true;
74
+ }
75
+ if (process.env.REMOTE_CONTAINERS || process.env.CODESPACES) {
76
+ return true;
77
+ }
78
+ return false;
79
+ }
80
+ /**
81
+ * Determine the best bind address for the OAuth callback server.
82
+ *
83
+ * Priority:
84
+ * 1. OPENCODE_ANTIGRAVITY_OAUTH_BIND environment variable (user override)
85
+ * 2. OrbStack Docker with --network host: 127.0.0.1 (required for port forwarding)
86
+ * 3. WSL/SSH/Remote: 0.0.0.0 (needed for cross-network access)
87
+ * 4. Default: 127.0.0.1 (most secure for local development)
88
+ */
89
+ function getBindAddress() {
90
+ // Allow user override via environment variable
91
+ const envBind = process.env.OPENCODE_ANTIGRAVITY_OAUTH_BIND;
92
+ if (envBind) {
93
+ return envBind;
94
+ }
95
+ // OrbStack Docker needs 127.0.0.1 for --network host port forwarding
96
+ if (isOrbStackDockerHost()) {
97
+ return "127.0.0.1";
98
+ }
99
+ // WSL and remote environments need 0.0.0.0 to be reachable
100
+ if (isWSL() || isRemoteEnvironment()) {
101
+ return "0.0.0.0";
102
+ }
103
+ // Default to 127.0.0.1 for security (local-only access)
104
+ return "127.0.0.1";
105
+ }
106
+ /**
107
+ * Starts a lightweight HTTP server that listens for the Antigravity OAuth redirect
108
+ * and resolves with the captured callback URL.
109
+ */
110
+ export async function startOAuthListener({ timeoutMs = 5 * 60 * 1000 } = {}) {
111
+ const port = redirectUri.port
112
+ ? Number.parseInt(redirectUri.port, 10)
113
+ : redirectUri.protocol === "https:"
114
+ ? 443
115
+ : 80;
116
+ const origin = `${redirectUri.protocol}//${redirectUri.host}`;
117
+ let settled = false;
118
+ let resolveCallback;
119
+ let rejectCallback;
120
+ let timeoutHandle;
121
+ const callbackPromise = new Promise((resolve, reject) => {
122
+ resolveCallback = (url) => {
123
+ if (settled)
124
+ return;
125
+ settled = true;
126
+ if (timeoutHandle)
127
+ clearTimeout(timeoutHandle);
128
+ resolve(url);
129
+ };
130
+ rejectCallback = (error) => {
131
+ if (settled)
132
+ return;
133
+ settled = true;
134
+ if (timeoutHandle)
135
+ clearTimeout(timeoutHandle);
136
+ reject(error);
137
+ };
138
+ });
139
+ const successResponse = `<!DOCTYPE html>
140
+ <html lang="en">
141
+ <head>
142
+ <meta charset="utf-8" />
143
+ <meta name="viewport" content="width=device-width, initial-scale=1">
144
+ <title>Authentication Successful</title>
145
+ <style>
146
+ :root {
147
+ --bg: #FAFAFA;
148
+ --card-bg: #FFFFFF;
149
+ --text-primary: #1F2937;
150
+ --text-secondary: #6B7280;
151
+ --accent: #2563EB;
152
+ --success: #10B981;
153
+ --border: #E5E7EB;
154
+ }
155
+ @media (prefers-color-scheme: dark) {
156
+ :root {
157
+ --bg: #111827;
158
+ --card-bg: #1F2937;
159
+ --text-primary: #F9FAFB;
160
+ --text-secondary: #9CA3AF;
161
+ --accent: #3B82F6;
162
+ --success: #34D399;
163
+ --border: #374151;
164
+ }
165
+ }
166
+ body {
167
+ margin: 0;
168
+ min-height: 100vh;
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
173
+ background: var(--bg);
174
+ color: var(--text-primary);
175
+ padding: 1rem;
176
+ }
177
+ .card {
178
+ background: var(--card-bg);
179
+ border-radius: 16px;
180
+ padding: 3rem 2rem;
181
+ width: 100%;
182
+ max-width: 400px;
183
+ text-align: center;
184
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
185
+ border: 1px solid var(--border);
186
+ }
187
+ .icon-wrapper {
188
+ width: 64px;
189
+ height: 64px;
190
+ background: rgba(16, 185, 129, 0.1);
191
+ border-radius: 50%;
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ margin: 0 auto 1.5rem;
196
+ }
197
+ .icon {
198
+ width: 32px;
199
+ height: 32px;
200
+ color: var(--success);
201
+ }
202
+ h1 {
203
+ font-size: 1.5rem;
204
+ font-weight: 600;
205
+ margin: 0 0 0.5rem;
206
+ letter-spacing: -0.025em;
207
+ }
208
+ p {
209
+ color: var(--text-secondary);
210
+ font-size: 0.95rem;
211
+ line-height: 1.5;
212
+ margin: 0 0 2rem;
213
+ }
214
+ .btn {
215
+ display: inline-flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ background: var(--text-primary);
219
+ color: var(--card-bg);
220
+ font-weight: 500;
221
+ padding: 0.75rem 1.5rem;
222
+ border-radius: 8px;
223
+ text-decoration: none;
224
+ transition: opacity 0.2s;
225
+ font-size: 0.95rem;
226
+ border: none;
227
+ cursor: pointer;
228
+ width: 100%;
229
+ box-sizing: border-box;
230
+ }
231
+ .btn:hover {
232
+ opacity: 0.9;
233
+ }
234
+ .sub-text {
235
+ margin-top: 1rem;
236
+ font-size: 0.8rem;
237
+ color: var(--text-secondary);
238
+ }
239
+ </style>
240
+ </head>
241
+ <body>
242
+ <div class="card">
243
+ <div class="icon-wrapper">
244
+ <svg class="icon" fill="none" viewBox="0 0 24 24" stroke="currentColor">
245
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M5 13l4 4L19 7" />
246
+ </svg>
247
+ </div>
248
+ <h1>All set!</h1>
249
+ <p>You've successfully authenticated with Antigravity. You can now return to Opencode.</p>
250
+ <button class="btn" onclick="closeWindow()">Close this tab</button>
251
+ <div class="sub-text">Usage Tip: Most browsers block auto-closing. If the button doesn't work, please close the tab manually.</div>
252
+ </div>
253
+ <script>
254
+ function closeWindow() {
255
+ window.close();
256
+ // Fallback if window.close() is blocked
257
+ document.querySelector('.btn').textContent = "Tab cannot be closed automatically";
258
+ document.querySelector('.btn').style.opacity = "0.5";
259
+ document.querySelector('.btn').style.cursor = "default";
260
+ }
261
+ </script>
262
+ </body>
263
+ </html>`;
264
+ timeoutHandle = setTimeout(() => {
265
+ rejectCallback(new Error("Timed out waiting for OAuth callback"));
266
+ }, timeoutMs);
267
+ timeoutHandle.unref?.();
268
+ const server = createServer((request, response) => {
269
+ if (!request.url) {
270
+ response.writeHead(400, { "Content-Type": "text/plain" });
271
+ response.end("Invalid request");
272
+ return;
273
+ }
274
+ const url = new URL(request.url, origin);
275
+ if (url.pathname !== callbackPath) {
276
+ response.writeHead(404, { "Content-Type": "text/plain" });
277
+ response.end("Not found");
278
+ return;
279
+ }
280
+ response.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
281
+ response.end(successResponse);
282
+ resolveCallback(url);
283
+ setImmediate(() => {
284
+ server.close();
285
+ });
286
+ });
287
+ const bindAddress = getBindAddress();
288
+ await new Promise((resolve, reject) => {
289
+ const handleError = (error) => {
290
+ server.off("error", handleError);
291
+ if (error.code === "EADDRINUSE") {
292
+ reject(new Error(`Port ${port} is already in use. ` +
293
+ `Another process is occupying this port. ` +
294
+ `Please terminate the process or try again later.`));
295
+ return;
296
+ }
297
+ reject(error);
298
+ };
299
+ server.once("error", handleError);
300
+ server.listen(port, bindAddress, () => {
301
+ server.off("error", handleError);
302
+ resolve();
303
+ });
304
+ });
305
+ server.on("error", (error) => {
306
+ rejectCallback(error instanceof Error ? error : new Error(String(error)));
307
+ });
308
+ return {
309
+ waitForCallback: () => callbackPromise,
310
+ close: () => new Promise((resolve, reject) => {
311
+ server.close((error) => {
312
+ if (error && error.code !== "ERR_SERVER_NOT_RUNNING") {
313
+ reject(error);
314
+ return;
315
+ }
316
+ if (!settled) {
317
+ rejectCallback(new Error("OAuth listener closed before callback"));
318
+ }
319
+ resolve();
320
+ });
321
+ }),
322
+ };
323
+ }
324
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/plugin/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAoBxD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;AACtD,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,IAAI,GAAG,CAAC;AAEjD;;;GAGG;AACH,SAAS,oBAAoB;IAC3B,2BAA2B;IAC3B,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,yCAAyC;IACzC,mFAAmF;IACnF,IAAI,CAAC;QACH,+EAA+E;QAC/E,gDAAgD;QAChD,IAAI,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACpE,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,2DAA2D;QAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC5C,IAAI,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC7F,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mEAAmE;QACnE,8DAA8D;QAC9D,IAAI,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;YACxD,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChE,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,6DAA6D;QAC7D,2FAA2F;QAC3F,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YAC9D,uDAAuD;YACvD,wDAAwD;YACxD,IAAI,UAAU,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,KAAK;IACZ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACpE,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB;IAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,cAAc;IACrB,+CAA+C;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC;IAC5D,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,qEAAqE;IACrE,IAAI,oBAAoB,EAAE,EAAE,CAAC;QAC3B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,2DAA2D;IAC3D,IAAI,KAAK,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,wDAAwD;IACxD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAE,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,KAA2B,EAAE;IAExD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI;QAC3B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,CAAC,CAAC,WAAW,CAAC,QAAQ,KAAK,QAAQ;YACnC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,KAAK,WAAW,CAAC,IAAI,EAAE,CAAC;IAE9D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,eAAmC,CAAC;IACxC,IAAI,cAAsC,CAAC;IAC3C,IAAI,aAA6B,CAAC;IAClC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3D,eAAe,GAAG,CAAC,GAAQ,EAAE,EAAE;YAC7B,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,CAAC;QACf,CAAC,CAAC;QACF,cAAc,GAAG,CAAC,KAAY,EAAE,EAAE;YAChC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,aAAa;gBAAE,YAAY,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEL,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4HhB,CAAC;IAEP,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;QAC9B,cAAc,CAAC,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC,CAAC;IACpE,CAAC,EAAE,SAAS,CAAC,CAAC;IACd,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;IAExB,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE;QAChD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAClC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;YAC1D,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACxE,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAE9B,eAAe,CAAC,GAAG,CAAC,CAAC;QAErB,YAAY,CAAC,GAAG,EAAE;YAChB,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,WAAW,GAAG,CAAC,KAA4B,EAAE,EAAE;YACnD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,KAAK,CACd,QAAQ,IAAI,sBAAsB;oBAClC,0CAA0C;oBAC1C,kDAAkD,CACnD,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACjC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC3B,cAAc,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,eAAe,EAAE,GAAG,EAAE,CAAC,eAAe;QACtC,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrB,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;oBAChF,MAAM,CAAC,KAAK,CAAC,CAAC;oBACd,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,cAAc,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACrE,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;KACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,92 @@
1
+ import type { HeaderStyle } from "../constants";
2
+ /**
3
+ * Files/directories that should be gitignored in the config directory.
4
+ * These contain sensitive data or machine-specific state.
5
+ */
6
+ export declare const GITIGNORE_ENTRIES: string[];
7
+ /**
8
+ * Ensures a .gitignore file exists in the config directory with entries
9
+ * for sensitive files. Creates the file if missing, or appends missing
10
+ * entries if it already exists.
11
+ */
12
+ export declare function ensureGitignore(configDir: string): Promise<void>;
13
+ /**
14
+ * Synchronous version of ensureGitignore for use in sync code paths.
15
+ */
16
+ export declare function ensureGitignoreSync(configDir: string): void;
17
+ export type ModelFamily = "claude" | "gemini";
18
+ export type { HeaderStyle };
19
+ export interface RateLimitState {
20
+ claude?: number;
21
+ gemini?: number;
22
+ }
23
+ export interface RateLimitStateV3 {
24
+ claude?: number;
25
+ "gemini-antigravity"?: number;
26
+ "gemini-cli"?: number;
27
+ [key: string]: number | undefined;
28
+ }
29
+ export interface AccountMetadataV1 {
30
+ email?: string;
31
+ refreshToken: string;
32
+ projectId?: string;
33
+ managedProjectId?: string;
34
+ addedAt: number;
35
+ lastUsed: number;
36
+ isRateLimited?: boolean;
37
+ rateLimitResetTime?: number;
38
+ lastSwitchReason?: "rate-limit" | "initial" | "rotation";
39
+ }
40
+ export interface AccountStorageV1 {
41
+ version: 1;
42
+ accounts: AccountMetadataV1[];
43
+ activeIndex: number;
44
+ }
45
+ export interface AccountMetadata {
46
+ email?: string;
47
+ refreshToken: string;
48
+ projectId?: string;
49
+ managedProjectId?: string;
50
+ addedAt: number;
51
+ lastUsed: number;
52
+ lastSwitchReason?: "rate-limit" | "initial" | "rotation";
53
+ rateLimitResetTimes?: RateLimitState;
54
+ }
55
+ export interface AccountStorage {
56
+ version: 2;
57
+ accounts: AccountMetadata[];
58
+ activeIndex: number;
59
+ }
60
+ export type CooldownReason = "auth-failure" | "network-error" | "project-error";
61
+ export interface AccountMetadataV3 {
62
+ email?: string;
63
+ refreshToken: string;
64
+ projectId?: string;
65
+ managedProjectId?: string;
66
+ addedAt: number;
67
+ lastUsed: number;
68
+ lastSwitchReason?: "rate-limit" | "initial" | "rotation";
69
+ rateLimitResetTimes?: RateLimitStateV3;
70
+ coolingDownUntil?: number;
71
+ cooldownReason?: CooldownReason;
72
+ }
73
+ export interface AccountStorageV3 {
74
+ version: 3;
75
+ accounts: AccountMetadataV3[];
76
+ activeIndex: number;
77
+ activeIndexByFamily?: {
78
+ claude?: number;
79
+ gemini?: number;
80
+ };
81
+ }
82
+ export declare function getStoragePath(): string;
83
+ export declare function deduplicateAccountsByEmail<T extends {
84
+ email?: string;
85
+ lastUsed?: number;
86
+ addedAt?: number;
87
+ }>(accounts: T[]): T[];
88
+ export declare function migrateV2ToV3(v2: AccountStorage): AccountStorageV3;
89
+ export declare function loadAccounts(): Promise<AccountStorageV3 | null>;
90
+ export declare function saveAccounts(storage: AccountStorageV3): Promise<void>;
91
+ export declare function clearAccounts(): Promise<void>;
92
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/plugin/storage.ts"],"names":[],"mappings":"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"}