@openlimiter/core 0.4.0 → 1.3.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 (68) hide show
  1. package/dist/acquire/antigravity-probe.d.ts +139 -0
  2. package/dist/acquire/antigravity-probe.d.ts.map +1 -0
  3. package/dist/acquire/antigravity-probe.js +599 -0
  4. package/dist/acquire/antigravity-probe.js.map +1 -0
  5. package/dist/acquire/cadence.d.ts +74 -0
  6. package/dist/acquire/cadence.d.ts.map +1 -0
  7. package/dist/acquire/cadence.js +171 -0
  8. package/dist/acquire/cadence.js.map +1 -0
  9. package/dist/acquire/coordination.d.ts +157 -0
  10. package/dist/acquire/coordination.d.ts.map +1 -0
  11. package/dist/acquire/coordination.js +292 -0
  12. package/dist/acquire/coordination.js.map +1 -0
  13. package/dist/acquire/credentials.d.ts +113 -0
  14. package/dist/acquire/credentials.d.ts.map +1 -0
  15. package/dist/acquire/credentials.js +316 -0
  16. package/dist/acquire/credentials.js.map +1 -0
  17. package/dist/acquire/identity.d.ts +20 -0
  18. package/dist/acquire/identity.d.ts.map +1 -0
  19. package/dist/acquire/identity.js +20 -0
  20. package/dist/acquire/identity.js.map +1 -0
  21. package/dist/acquire/index.d.ts +10 -0
  22. package/dist/acquire/index.d.ts.map +1 -0
  23. package/dist/acquire/index.js +10 -0
  24. package/dist/acquire/index.js.map +1 -0
  25. package/dist/acquire/providers.d.ts +86 -0
  26. package/dist/acquire/providers.d.ts.map +1 -0
  27. package/dist/acquire/providers.js +175 -0
  28. package/dist/acquire/providers.js.map +1 -0
  29. package/dist/acquire/runner.d.ts +146 -0
  30. package/dist/acquire/runner.d.ts.map +1 -0
  31. package/dist/acquire/runner.js +345 -0
  32. package/dist/acquire/runner.js.map +1 -0
  33. package/dist/acquire/transport.d.ts +194 -0
  34. package/dist/acquire/transport.d.ts.map +1 -0
  35. package/dist/acquire/transport.js +434 -0
  36. package/dist/acquire/transport.js.map +1 -0
  37. package/dist/acquire/windows-credential.d.ts +74 -0
  38. package/dist/acquire/windows-credential.d.ts.map +1 -0
  39. package/dist/acquire/windows-credential.js +124 -0
  40. package/dist/acquire/windows-credential.js.map +1 -0
  41. package/dist/cache.d.ts +28 -0
  42. package/dist/cache.d.ts.map +1 -1
  43. package/dist/cache.js +179 -25
  44. package/dist/cache.js.map +1 -1
  45. package/dist/connection-state.d.ts +53 -2
  46. package/dist/connection-state.d.ts.map +1 -1
  47. package/dist/connection-state.js +98 -9
  48. package/dist/connection-state.js.map +1 -1
  49. package/dist/failures.d.ts +2 -1
  50. package/dist/failures.d.ts.map +1 -1
  51. package/dist/failures.js +7 -3
  52. package/dist/failures.js.map +1 -1
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +1 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/merge.d.ts.map +1 -1
  58. package/dist/merge.js +17 -1
  59. package/dist/merge.js.map +1 -1
  60. package/dist/normalizer.d.ts +2 -0
  61. package/dist/normalizer.d.ts.map +1 -1
  62. package/dist/normalizer.js +39 -4
  63. package/dist/normalizer.js.map +1 -1
  64. package/dist/types.d.ts +63 -1
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/types.js +22 -0
  67. package/dist/types.js.map +1 -1
  68. package/package.json +3 -2
@@ -0,0 +1,599 @@
1
+ /**
2
+ * The Antigravity loopback probe.
3
+ *
4
+ * Antigravity quota is served live by a running agy process on a loopback port.
5
+ * It speaks Connect protocol (POST with Connect-Protocol-Version: 1) and
6
+ * answers RetrieveUserQuotaSummary over loopback HTTPS with a self-signed
7
+ * certificate. When an agy process is alive on this machine, probing this
8
+ * loopback endpoint gives an honest, authoritative reading with zero cloud
9
+ * impersonation.
10
+ *
11
+ * When no agy process is running, this probe reports that fact plainly and
12
+ * never attempts to spawn agy.
13
+ */
14
+ import { execFile } from "node:child_process";
15
+ import https from "node:https";
16
+ import http from "node:http";
17
+ import path from "node:path";
18
+ import { OPENLIMITER_USER_AGENT } from "./identity.js";
19
+ export const AGY_QUOTA_PATH = "/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary";
20
+ export const AGY_NOT_RUNNING_SENTENCE = "Open Antigravity once to refresh";
21
+ export const AGY_PROBE_TIMEOUT_MILLISECONDS = 3_000;
22
+ export const MAX_AGY_RESPONSE_BYTES = 64 * 1024; // 64 KB
23
+ export const TOTAL_AGY_PROBE_DEADLINE_MS = 5_000; // 5 seconds
24
+ export const ANTIGRAVITY_PROBE_LABELS = {
25
+ credentialOrigin: "official-local-tool",
26
+ dataInterfaceStatus: "internal-endpoint",
27
+ automationRisk: "high",
28
+ verification: "UNVERIFIED"
29
+ };
30
+ /**
31
+ * Parse the Connect protocol RetrieveUserQuotaSummary response.
32
+ *
33
+ * Maps gemini-5h to FIVE_HOUR (18,000s) and gemini-weekly to SEVEN_DAY (604,800s).
34
+ * Percentage is rounded to 1 decimal place: (1 - remainingFraction) * 100.
35
+ */
36
+ export function parseAgyQuotaSummary(payload, now) {
37
+ if (typeof payload !== "object" || payload === null)
38
+ return null;
39
+ const root = payload;
40
+ const unwrapped = typeof root["response"] === "object" && root["response"] !== null
41
+ ? root["response"]
42
+ : root;
43
+ const groups = unwrapped["groups"];
44
+ if (!Array.isArray(groups))
45
+ return null;
46
+ const meters = [];
47
+ for (const entry of groups) {
48
+ if (typeof entry !== "object" || entry === null)
49
+ continue;
50
+ const buckets = entry["buckets"];
51
+ if (!Array.isArray(buckets))
52
+ continue;
53
+ for (const item of buckets) {
54
+ if (typeof item !== "object" || item === null)
55
+ continue;
56
+ const b = item;
57
+ const bucketId = typeof b["bucketId"] === "string" ? b["bucketId"] : "";
58
+ if (!bucketId.startsWith("gemini"))
59
+ continue;
60
+ const windowName = typeof b["window"] === "string" ? b["window"].toLowerCase() : "";
61
+ let meterCode = null;
62
+ let durationSeconds = 0;
63
+ if (windowName === "5h") {
64
+ meterCode = "FIVE_HOUR";
65
+ durationSeconds = 18_000;
66
+ }
67
+ else if (windowName === "weekly") {
68
+ meterCode = "SEVEN_DAY";
69
+ durationSeconds = 604_800;
70
+ }
71
+ if (meterCode === null)
72
+ continue;
73
+ const remaining = typeof b["remainingFraction"] === "number" ? b["remainingFraction"] : null;
74
+ if (remaining === null || Number.isNaN(remaining))
75
+ continue;
76
+ const fraction = Math.max(0, Math.min(1, remaining));
77
+ const value = Math.round(Math.max(0, Math.min(100, (1 - fraction) * 100)) * 10) / 10;
78
+ const resetTime = typeof b["resetTime"] === "string" ? b["resetTime"] : null;
79
+ const resetAt = resetTime !== null && !Number.isNaN(Date.parse(resetTime))
80
+ ? new Date(resetTime).toISOString()
81
+ : undefined;
82
+ const expiresAt = new Date(new Date(now).getTime() + 300_000).toISOString();
83
+ meters.push({
84
+ provider: "ANTIGRAVITY",
85
+ meter: meterCode,
86
+ value,
87
+ unit: "PERCENT",
88
+ window: { kind: "rolling", durationSeconds },
89
+ resetAt,
90
+ source: "internal_payload",
91
+ precision: "estimated",
92
+ observedAt: now,
93
+ expiresAt,
94
+ labels: ANTIGRAVITY_PROBE_LABELS
95
+ });
96
+ }
97
+ }
98
+ return meters.length > 0 ? meters : null;
99
+ }
100
+ function execFilePromise(executable, args, timeout) {
101
+ return new Promise((resolve) => {
102
+ execFile(executable, [...args], { timeout, windowsHide: true }, (error, stdout) => {
103
+ if (error) {
104
+ resolve({ ok: false });
105
+ }
106
+ else {
107
+ resolve({ ok: true, stdout: stdout.toString() });
108
+ }
109
+ });
110
+ });
111
+ }
112
+ /**
113
+ * Resolve a pid to the absolute path of the executable running it, the one
114
+ * piece of proof `isTrustedAgyExecutable` actually checks.
115
+ *
116
+ * Windows' own `tasklist` names a process but never its path, so a caller
117
+ * stuck on that fallback (CIM itself already carries a path, see
118
+ * `enumerateAgyListeningPorts`) has nothing to verify a candidate against but
119
+ * the bare string "agy.exe", which is exactly the name an impostor process
120
+ * picks for itself. This asks Windows the same question CIM already answers,
121
+ * for one pid at a time; POSIX reads `/proc/<pid>/exe`'s own symlink on
122
+ * Linux, where the kernel itself is the source of truth, and asks `ps` on
123
+ * every other POSIX platform. A pid whose executable cannot be read this way
124
+ * answers null, which every caller here treats as "cannot be trusted", never
125
+ * as "trust it anyway".
126
+ */
127
+ export async function resolveAgyExecutablePath(pid, platform = process.platform, runCommand = execFilePromise) {
128
+ if (!/^\d+$/u.test(pid))
129
+ return null;
130
+ if (platform === "win32") {
131
+ const script = "$ErrorActionPreference='SilentlyContinue';" +
132
+ `(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").ExecutablePath`;
133
+ const result = await runCommand("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], AGY_PROBE_TIMEOUT_MILLISECONDS);
134
+ if (!result.ok)
135
+ return null;
136
+ const trimmed = result.stdout.trim();
137
+ return trimmed.length > 0 ? trimmed : null;
138
+ }
139
+ if (platform === "linux") {
140
+ try {
141
+ const fsPromises = await import("node:fs/promises");
142
+ return await fsPromises.readlink(`/proc/${pid}/exe`);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ const result = await runCommand("ps", ["-o", "comm=", "-p", pid], AGY_PROBE_TIMEOUT_MILLISECONDS);
149
+ if (!result.ok)
150
+ return null;
151
+ const trimmed = result.stdout.trim();
152
+ return trimmed.length > 0 ? trimmed : null;
153
+ }
154
+ /**
155
+ * Extract loopback port from an address string (e.g. "127.0.0.1:57737" or "[::1]:57737").
156
+ */
157
+ export function parseLoopbackPort(address) {
158
+ const lastColon = address.lastIndexOf(":");
159
+ if (lastColon === -1)
160
+ return null;
161
+ let host = address.slice(0, lastColon);
162
+ const portStr = address.slice(lastColon + 1);
163
+ if (host.startsWith("[") && host.endsWith("]")) {
164
+ host = host.slice(1, -1);
165
+ }
166
+ if (host !== "127.0.0.1" && host !== "::1") {
167
+ return null;
168
+ }
169
+ const port = Number.parseInt(portStr, 10);
170
+ if (Number.isNaN(port) || port <= 0 || port > 65535) {
171
+ return null;
172
+ }
173
+ return port;
174
+ }
175
+ /**
176
+ * Language-agnostic Windows netstat parser.
177
+ *
178
+ * Windows netstat lines have 5 whitespace-delimited tokens:
179
+ * Protocol, Local Address, Foreign Address, State, PID.
180
+ * A listening socket always has a wildcard foreign address (0.0.0.0:0, [::]:0, *:*).
181
+ * Matching this wildcard avoids relying on English "LISTENING" or "TCP".
182
+ */
183
+ export function parseNetstatPorts(report, pids) {
184
+ const pidSet = pids instanceof Set ? pids : new Set(pids);
185
+ const ports = [];
186
+ for (const line of report.split(/\r?\n/)) {
187
+ const fields = line.trim().split(/\s+/);
188
+ if (fields.length !== 5) {
189
+ continue;
190
+ }
191
+ const owner = fields[4];
192
+ if (!pidSet.has(owner)) {
193
+ continue;
194
+ }
195
+ const foreign = fields[2];
196
+ if (foreign !== "0.0.0.0:0" && foreign !== "[::]:0" && foreign !== "*:*") {
197
+ continue;
198
+ }
199
+ const localAddress = fields[1];
200
+ if (localAddress === undefined) {
201
+ continue;
202
+ }
203
+ const port = parseLoopbackPort(localAddress);
204
+ if (port !== null && !ports.includes(port)) {
205
+ ports.push(port);
206
+ }
207
+ }
208
+ return ports;
209
+ }
210
+ /**
211
+ * Parse output from lsof, handling both standard tabular output and "-F pn" output.
212
+ */
213
+ export function parseLsofOutput(output) {
214
+ const results = [];
215
+ let currentPid = null;
216
+ for (const line of output.split(/\r?\n/)) {
217
+ const trimmed = line.trim();
218
+ if (trimmed.startsWith("p")) {
219
+ currentPid = trimmed.slice(1).trim();
220
+ continue;
221
+ }
222
+ if (trimmed.startsWith("n")) {
223
+ if (currentPid) {
224
+ const port = parseLoopbackPort(trimmed.slice(1).trim());
225
+ if (port !== null) {
226
+ results.push({ pid: currentPid, port });
227
+ }
228
+ }
229
+ continue;
230
+ }
231
+ const parts = trimmed.split(/\s+/);
232
+ if (parts.length >= 8) {
233
+ const pid = parts[1];
234
+ if (pid === undefined) {
235
+ continue;
236
+ }
237
+ for (const part of parts) {
238
+ const port = parseLoopbackPort(part);
239
+ if (port !== null) {
240
+ results.push({ pid, port });
241
+ break;
242
+ }
243
+ }
244
+ }
245
+ }
246
+ return results;
247
+ }
248
+ /**
249
+ * Valid install roots where legitimate software binaries are located.
250
+ */
251
+ export function getAgyInstallRoots(platform = process.platform, env = process.env) {
252
+ const roots = [];
253
+ const hostPath = platform === "win32" ? path.win32 : path.posix;
254
+ if (platform === "win32") {
255
+ const keys = ["LOCALAPPDATA", "APPDATA", "ProgramFiles", "ProgramFiles(x86)", "ProgramW6432"];
256
+ for (const key of keys) {
257
+ const val = env[key];
258
+ if (val && val.trim().length > 0) {
259
+ roots.push(hostPath.normalize(val.trim()));
260
+ }
261
+ }
262
+ const userProfile = env["USERPROFILE"];
263
+ if (userProfile && userProfile.trim().length > 0) {
264
+ roots.push(hostPath.normalize(hostPath.join(userProfile.trim(), "AppData", "Local", "Programs")));
265
+ roots.push(hostPath.normalize(hostPath.join(userProfile.trim(), ".local", "bin")));
266
+ }
267
+ }
268
+ else {
269
+ for (const fixed of ["/usr/bin", "/usr/local", "/opt", "/Applications", "/snap"]) {
270
+ roots.push(fixed);
271
+ }
272
+ const home = env["HOME"];
273
+ if (home && home.trim().length > 0) {
274
+ roots.push(path.join(home.trim(), ".local"));
275
+ roots.push(path.join(home.trim(), ".nvm"));
276
+ roots.push(path.join(home.trim(), "Applications"));
277
+ }
278
+ }
279
+ return roots;
280
+ }
281
+ /**
282
+ * Validate that an executable path is trusted:
283
+ * 1. Absolute path, no parent traversal ("..")
284
+ * 2. Named agy.exe (Windows) or agy (non-Windows)
285
+ * 3. Resides under one of the legitimate install roots
286
+ */
287
+ export function isTrustedAgyExecutable(executablePath, platform = process.platform, roots = getAgyInstallRoots(platform)) {
288
+ if (!executablePath || typeof executablePath !== "string")
289
+ return false;
290
+ const p = platform === "win32" ? path.win32 : path.posix;
291
+ const normalized = p.normalize(executablePath);
292
+ if (executablePath.includes("..") || normalized.split(p.sep).includes("..")) {
293
+ return false;
294
+ }
295
+ if (!p.isAbsolute(executablePath)) {
296
+ return false;
297
+ }
298
+ const baseName = p.basename(normalized);
299
+ const expectedName = platform === "win32" ? "agy.exe" : "agy";
300
+ if (platform === "win32") {
301
+ if (baseName.toLowerCase() !== expectedName.toLowerCase()) {
302
+ return false;
303
+ }
304
+ }
305
+ else {
306
+ if (baseName !== expectedName) {
307
+ return false;
308
+ }
309
+ }
310
+ const normPath = platform === "win32" ? normalized.toLowerCase() : normalized;
311
+ return roots.some((root) => {
312
+ const normRoot = platform === "win32" ? root.toLowerCase() : root;
313
+ return (normPath.startsWith(normRoot.endsWith(p.sep) ? normRoot : normRoot + p.sep) ||
314
+ normPath === normRoot);
315
+ });
316
+ }
317
+ /**
318
+ * Enumerate listening loopback ports belonging to running agy processes.
319
+ */
320
+ export async function enumerateAgyListeningPorts(options) {
321
+ const platform = options?.platform ?? process.platform;
322
+ const runner = options?.runCommand ?? execFilePromise;
323
+ if (platform === "win32") {
324
+ const roots = getAgyInstallRoots("win32", options?.env ?? process.env);
325
+ const trustedPids = new Set();
326
+ const cimScript = "$ErrorActionPreference='SilentlyContinue';" +
327
+ "$me=[System.Security.Principal.WindowsIdentity]::GetCurrent().Name;" +
328
+ "Get-CimInstance Win32_Process -Filter \"Name='agy.exe'\" | ForEach-Object {" +
329
+ "$owner=(Invoke-CimMethod -InputObject $_ -MethodName GetOwner);" +
330
+ "if ($owner -and $owner.User -and (\"$($owner.Domain)\\$($owner.User)\" -eq $me)) {" +
331
+ "\"$($_.ProcessId)|$($_.ExecutablePath)\" } }";
332
+ const cimRes = await runner("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", cimScript], AGY_PROBE_TIMEOUT_MILLISECONDS);
333
+ if (cimRes.ok && cimRes.stdout.trim().length > 0) {
334
+ for (const line of cimRes.stdout.split(/\r?\n/)) {
335
+ const parts = line.trim().split("|");
336
+ if (parts.length >= 2) {
337
+ const rawPid = parts[0];
338
+ if (rawPid === undefined) {
339
+ continue;
340
+ }
341
+ const pid = rawPid.trim();
342
+ const exePath = parts.slice(1).join("|").trim();
343
+ if (isTrustedAgyExecutable(exePath, "win32", roots)) {
344
+ trustedPids.add(pid);
345
+ }
346
+ }
347
+ }
348
+ }
349
+ else {
350
+ // Fallback to tasklist if CIM is unavailable
351
+ const tasklistRes = await runner("tasklist.exe", ["/FI", "IMAGENAME eq agy.exe", "/FO", "CSV", "/NH"], AGY_PROBE_TIMEOUT_MILLISECONDS);
352
+ if (tasklistRes.ok) {
353
+ for (const line of tasklistRes.stdout.split(/\r?\n/)) {
354
+ const match = /^"agy\.exe","(\d+)"/i.exec(line.trim());
355
+ if (match && match[1]) {
356
+ const pid = match[1];
357
+ if (options?.resolveExecutablePath) {
358
+ const exePath = await options.resolveExecutablePath(pid);
359
+ if (exePath && isTrustedAgyExecutable(exePath, "win32", roots)) {
360
+ trustedPids.add(pid);
361
+ }
362
+ /* No resolver was able to name this pid's executable: it is
363
+ skipped, the same as an untrusted path, rather than trusted on
364
+ the strength of `tasklist` naming it "agy.exe", which is a
365
+ string an impostor process gets to pick for itself. */
366
+ }
367
+ }
368
+ }
369
+ }
370
+ }
371
+ if (trustedPids.size === 0)
372
+ return [];
373
+ const netstatRes = await runner("netstat.exe", ["-ano", "-p", "tcp"], AGY_PROBE_TIMEOUT_MILLISECONDS);
374
+ if (!netstatRes.ok)
375
+ return [];
376
+ return parseNetstatPorts(netstatRes.stdout, trustedPids);
377
+ }
378
+ const roots = getAgyInstallRoots(platform, options?.env ?? process.env);
379
+ const lsofRes = await runner("lsof", ["-nP", "-iTCP", "-sTCP:LISTEN", "-a", "-c", "agy"], AGY_PROBE_TIMEOUT_MILLISECONDS);
380
+ if (!lsofRes.ok)
381
+ return [];
382
+ const pidPorts = parseLsofOutput(lsofRes.stdout);
383
+ if (pidPorts.length === 0)
384
+ return [];
385
+ const verifiedPids = new Map();
386
+ const ports = [];
387
+ for (const { pid, port } of pidPorts) {
388
+ let trusted = verifiedPids.get(pid);
389
+ if (trusted === undefined) {
390
+ if (options?.resolveExecutablePath) {
391
+ const exePath = await options.resolveExecutablePath(pid);
392
+ trusted = exePath !== null && isTrustedAgyExecutable(exePath, platform, roots);
393
+ }
394
+ else {
395
+ let exePath = null;
396
+ if (platform === "linux") {
397
+ try {
398
+ const fsPromises = await import("node:fs/promises");
399
+ exePath = await fsPromises.readlink(`/proc/${pid}/exe`);
400
+ }
401
+ catch {
402
+ exePath = null;
403
+ }
404
+ }
405
+ else {
406
+ const psRes = await runner("ps", ["-o", "comm=", "-p", pid], AGY_PROBE_TIMEOUT_MILLISECONDS);
407
+ if (psRes.ok && psRes.stdout.trim().length > 0) {
408
+ exePath = psRes.stdout.trim();
409
+ }
410
+ }
411
+ if (exePath !== null) {
412
+ trusted = isTrustedAgyExecutable(exePath, platform, roots);
413
+ }
414
+ else {
415
+ /* The executable this pid runs could not be read at all, on the
416
+ one platform this file resolves it without an injected
417
+ resolver. That is a reason to skip the port, not to trust it: a
418
+ `lsof` name match is exactly what an impostor process names
419
+ itself to get. */
420
+ trusted = false;
421
+ }
422
+ }
423
+ verifiedPids.set(pid, trusted);
424
+ }
425
+ if (trusted && !ports.includes(port)) {
426
+ ports.push(port);
427
+ }
428
+ }
429
+ return ports;
430
+ }
431
+ function httpPost(isHttps, port, path, timeoutMs, signal) {
432
+ return new Promise((resolve) => {
433
+ if (signal?.aborted) {
434
+ resolve(null);
435
+ return;
436
+ }
437
+ const transport = isHttps ? https : http;
438
+ const body = "{}";
439
+ let settled = false;
440
+ const onAbort = () => {
441
+ if (!settled) {
442
+ settled = true;
443
+ req.destroy();
444
+ resolve(null);
445
+ }
446
+ };
447
+ if (signal) {
448
+ signal.addEventListener("abort", onAbort, { once: true });
449
+ }
450
+ const req = transport.request({
451
+ hostname: "127.0.0.1",
452
+ port,
453
+ path,
454
+ method: "POST",
455
+ headers: {
456
+ "Content-Type": "application/json",
457
+ "Connect-Protocol-Version": "1",
458
+ "User-Agent": OPENLIMITER_USER_AGENT,
459
+ "Content-Length": Buffer.byteLength(body)
460
+ },
461
+ rejectUnauthorized: false,
462
+ timeout: timeoutMs
463
+ }, (res) => {
464
+ if (res.statusCode !== 200) {
465
+ res.resume();
466
+ if (!settled) {
467
+ settled = true;
468
+ resolve(null);
469
+ }
470
+ return;
471
+ }
472
+ let totalBytes = 0;
473
+ let data = "";
474
+ res.on("data", (chunk) => {
475
+ totalBytes += typeof chunk === "string" ? Buffer.byteLength(chunk) : chunk.length;
476
+ if (totalBytes > MAX_AGY_RESPONSE_BYTES) {
477
+ req.destroy();
478
+ res.destroy();
479
+ if (!settled) {
480
+ settled = true;
481
+ resolve(null);
482
+ }
483
+ return;
484
+ }
485
+ data += chunk;
486
+ });
487
+ res.on("end", () => {
488
+ if (settled)
489
+ return;
490
+ settled = true;
491
+ try {
492
+ resolve(JSON.parse(data));
493
+ }
494
+ catch {
495
+ resolve(null);
496
+ }
497
+ });
498
+ res.on("error", () => {
499
+ if (!settled) {
500
+ settled = true;
501
+ resolve(null);
502
+ }
503
+ });
504
+ });
505
+ req.on("error", () => {
506
+ if (!settled) {
507
+ settled = true;
508
+ resolve(null);
509
+ }
510
+ });
511
+ req.on("timeout", () => {
512
+ req.destroy();
513
+ if (!settled) {
514
+ settled = true;
515
+ resolve(null);
516
+ }
517
+ });
518
+ req.write(body);
519
+ req.end();
520
+ });
521
+ }
522
+ /**
523
+ * Probe an agy loopback port for quota summary.
524
+ * Attempts HTTPS with self-signed certificate acceptance first, then plain HTTP.
525
+ */
526
+ export async function probeAgyLoopback(port, timeoutMs = AGY_PROBE_TIMEOUT_MILLISECONDS, signal) {
527
+ const httpsRes = await httpPost(true, port, AGY_QUOTA_PATH, timeoutMs, signal);
528
+ if (httpsRes !== null)
529
+ return httpsRes;
530
+ return await httpPost(false, port, AGY_QUOTA_PATH, timeoutMs, signal);
531
+ }
532
+ /**
533
+ * Run the Antigravity probe:
534
+ * 1. Discover listening ports for running agy processes.
535
+ * 2. If no processes found, report "not_running".
536
+ * 3. Probe loopback ports and parse quota summary.
537
+ * Enforces a hard total deadline across all ports probed.
538
+ */
539
+ export async function probeAntigravity(options) {
540
+ const now = options?.now ?? new Date().toISOString();
541
+ const totalTimeoutMs = options?.totalDeadlineMs ?? TOTAL_AGY_PROBE_DEADLINE_MS;
542
+ const abortController = new AbortController();
543
+ const timeoutId = setTimeout(() => {
544
+ abortController.abort();
545
+ }, totalTimeoutMs);
546
+ try {
547
+ const enumeratePorts = options?.enumeratePorts ??
548
+ (() => enumerateAgyListeningPorts({
549
+ ...(options?.lookup?.platform !== undefined ? { platform: options.lookup.platform } : {}),
550
+ ...(options?.runCommand !== undefined ? { runCommand: options.runCommand } : {}),
551
+ ...(options?.resolveExecutablePath !== undefined
552
+ ? { resolveExecutablePath: options.resolveExecutablePath }
553
+ : {})
554
+ }));
555
+ const probePort = options?.probePort ??
556
+ ((port) => probeAgyLoopback(port, AGY_PROBE_TIMEOUT_MILLISECONDS, abortController.signal));
557
+ if (abortController.signal.aborted) {
558
+ return { ok: false, reason: "unreachable" };
559
+ }
560
+ const ports = await enumeratePorts();
561
+ if (abortController.signal.aborted) {
562
+ return { ok: false, reason: "unreachable" };
563
+ }
564
+ if (ports.length === 0) {
565
+ return { ok: false, reason: "not_running" };
566
+ }
567
+ for (const port of ports) {
568
+ if (abortController.signal.aborted) {
569
+ return { ok: false, reason: "unreachable" };
570
+ }
571
+ const probePromise = probePort(port);
572
+ const payload = await Promise.race([
573
+ probePromise,
574
+ new Promise((resolve) => {
575
+ if (abortController.signal.aborted) {
576
+ resolve(null);
577
+ }
578
+ else {
579
+ abortController.signal.addEventListener("abort", () => resolve(null), { once: true });
580
+ }
581
+ })
582
+ ]);
583
+ if (abortController.signal.aborted) {
584
+ return { ok: false, reason: "unreachable" };
585
+ }
586
+ if (payload !== null) {
587
+ const meters = parseAgyQuotaSummary(payload, now);
588
+ if (meters !== null && meters.length > 0) {
589
+ return { ok: true, meters };
590
+ }
591
+ }
592
+ }
593
+ return { ok: false, reason: "unreachable" };
594
+ }
595
+ finally {
596
+ clearTimeout(timeoutId);
597
+ }
598
+ }
599
+ //# sourceMappingURL=antigravity-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"antigravity-probe.js","sourceRoot":"","sources":["../../src/acquire/antigravity-probe.ts"],"names":[],"mappings":"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"}