@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
package/dist/cache.d.ts CHANGED
@@ -122,6 +122,34 @@ export interface CacheMergeResult {
122
122
  * renders on every keystroke from churning the disk.
123
123
  */
124
124
  export declare function mergeSnapshotCache(incoming: readonly Snapshot[], directory?: string): Promise<CacheMergeResult>;
125
+ /**
126
+ * Fold rows this machine just acquired into the cache, without ever losing a
127
+ * newer row somebody else wrote.
128
+ *
129
+ * The problem this exists for: two PROCESSES write this cache, the desktop tray
130
+ * and this command line tool, and a lock held by one of them means nothing to
131
+ * the other. A plain collection report replaces every row for its identity,
132
+ * which is correct when the writer owns the provider and destructive when a
133
+ * desktop wrote a fresher row for the same identity a moment ago.
134
+ *
135
+ * So the decision is made INSIDE the cache lock, which both processes do share,
136
+ * and it is made per row: the newer `observedAt` wins, and on a tie the row
137
+ * already in the cache wins. Ties go to the incumbent because the only way to
138
+ * get one is two writers reading the same instant, and in that case the row
139
+ * that is already visible should not flicker.
140
+ *
141
+ * When nothing was deferred this behaves exactly like a collection report, so a
142
+ * provider that stops reporting a window still loses that row. When something
143
+ * was deferred the write becomes a merge instead, because dropping the rows for
144
+ * an identity we did not fully win would delete the very rows we deferred to.
145
+ */
146
+ export declare function mergeAcquiredSnapshots(report: Extract<CollectionReport, {
147
+ ok: true;
148
+ }>, directory?: string): Promise<{
149
+ written: boolean;
150
+ taken: number;
151
+ deferred: number;
152
+ }>;
125
153
  /**
126
154
  * Fold one collection report into the cache under the lock.
127
155
  *
@@ -1 +1 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/cache.js CHANGED
@@ -3,8 +3,8 @@ import { constants } from "node:fs";
3
3
  import { chmod, lstat, mkdir, open, readFile, rename, unlink } from "node:fs/promises";
4
4
  import { homedir } from "node:os";
5
5
  import path from "node:path";
6
- import { applyCollectionReport, readSuppressions, visibleSnapshots } from "./collection.js";
7
- import { MAX_CACHE_ENTRIES, mergeSnapshots } from "./merge.js";
6
+ import { applyCollectionReport, readSuppressions, snapshotBelongsTo, visibleSnapshots } from "./collection.js";
7
+ import { MAX_CACHE_ENTRIES, mergeSnapshots, snapshotIdentity } from "./merge.js";
8
8
  import { canonicalJson, normalizeMeter, normalizeMeters } from "./normalizer.js";
9
9
  export const CACHE_FILE_NAME = "openlimiter-cache.json";
10
10
  export const CACHE_LOCK_NAME = "openlimiter.lock";
@@ -12,7 +12,7 @@ export const CACHE_LOCK_NAME = "openlimiter.lock";
12
12
  export const MAX_JSON_FILE_BYTES = 1_048_576;
13
13
  /** A lock older than this is treated as abandoned and reclaimed. */
14
14
  export const LOCK_STALE_MILLISECONDS = 5_000;
15
- const LOCK_ATTEMPT_LIMIT = 40;
15
+ /** The longest pause between lock acquisition attempts. It is not a deadline. */
16
16
  const LOCK_BACKOFF_CEILING_MILLISECONDS = 25;
17
17
  export function resolveStateDirectory(options = {}) {
18
18
  const platform = options.platform ?? process.platform;
@@ -277,8 +277,10 @@ export async function writeFileAtomically(target, contents) {
277
277
  async function reclaimStaleLock(lockPath) {
278
278
  const now = Date.now();
279
279
  let heldSince = null;
280
+ let observedContents = null;
280
281
  try {
281
- const parsed = JSON.parse(await readFile(lockPath, "utf8"));
282
+ observedContents = await readFile(lockPath, "utf8");
283
+ const parsed = JSON.parse(observedContents);
282
284
  const stamp = isRecord(parsed) ? parsed["at"] : undefined;
283
285
  if (typeof stamp === "number" && Number.isFinite(stamp) && stamp <= now) {
284
286
  heldSince = stamp;
@@ -287,38 +289,87 @@ async function reclaimStaleLock(lockPath) {
287
289
  catch {
288
290
  heldSince = null;
289
291
  }
290
- if (heldSince === null) {
291
- try {
292
- heldSince = (await lstat(lockPath)).mtimeMs;
293
- }
294
- catch {
292
+ let observedDevice;
293
+ let observedInode;
294
+ let modificationTime;
295
+ try {
296
+ const observed = await lstat(lockPath);
297
+ observedDevice = observed.dev;
298
+ observedInode = observed.ino;
299
+ modificationTime = observed.mtimeMs;
300
+ }
301
+ catch (error) {
302
+ if (errorCode(error) === "ENOENT")
295
303
  return true;
296
- }
304
+ throw error;
305
+ }
306
+ if (heldSince === null) {
307
+ heldSince = modificationTime;
297
308
  if (!Number.isFinite(heldSince) || heldSince > now)
298
309
  heldSince = now;
299
310
  }
300
311
  if (now - heldSince < LOCK_STALE_MILLISECONDS)
301
312
  return false;
302
- await unlink(lockPath).catch(() => undefined);
303
- return true;
313
+ try {
314
+ if (observedContents !== null &&
315
+ (await readFile(lockPath, "utf8")) !== observedContents)
316
+ return false;
317
+ const observed = await lstat(lockPath);
318
+ if (observed.dev !== observedDevice || observed.ino !== observedInode)
319
+ return false;
320
+ await unlink(lockPath);
321
+ return true;
322
+ }
323
+ catch (error) {
324
+ if (errorCode(error) === "ENOENT")
325
+ return true;
326
+ throw error;
327
+ }
328
+ }
329
+ const transientLockCodes = new Set(["EEXIST", "EPERM", "EACCES", "EBUSY"]);
330
+ async function lockPathExists(lockPath) {
331
+ try {
332
+ await lstat(lockPath);
333
+ return true;
334
+ }
335
+ catch (error) {
336
+ if (errorCode(error) === "ENOENT")
337
+ return false;
338
+ throw error;
339
+ }
304
340
  }
305
341
  async function acquireLock(lockPath) {
306
- const token = JSON.stringify({ at: Date.now(), pid: process.pid });
307
- for (let attempt = 0; attempt < LOCK_ATTEMPT_LIMIT; attempt += 1) {
342
+ /* Contention has no deadline. A live owner releases the lock and an
343
+ abandoned owner becomes stale, so neither case should discard this write. */
344
+ for (let attempt = 0;; attempt += 1) {
308
345
  try {
309
346
  const handle = await open(lockPath, "wx", 0o600);
310
- await handle.writeFile(token, "utf8").catch(() => undefined);
311
- return { handle, token };
347
+ const token = JSON.stringify({
348
+ at: Date.now(),
349
+ id: randomUUID(),
350
+ pid: process.pid
351
+ });
352
+ try {
353
+ await handle.writeFile(token, "utf8");
354
+ return { handle, token };
355
+ }
356
+ catch (error) {
357
+ await handle.close().catch(() => undefined);
358
+ await unlink(lockPath).catch(() => undefined);
359
+ throw error;
360
+ }
312
361
  }
313
362
  catch (error) {
314
- if (errorCode(error) !== "EEXIST")
363
+ const code = errorCode(error);
364
+ if (code === undefined ||
365
+ !transientLockCodes.has(code) ||
366
+ !(await lockPathExists(lockPath)))
315
367
  throw error;
316
368
  if (!(await reclaimStaleLock(lockPath))) {
317
369
  await delay(backoffMilliseconds(attempt));
318
370
  }
319
371
  }
320
372
  }
321
- throw new Error("Cache lock is busy");
322
373
  }
323
374
  async function releaseLock(lockPath, token) {
324
375
  try {
@@ -336,6 +387,10 @@ function rejectOutOfBounds(snapshots) {
336
387
  if (snapshots.some((snapshot) => normalizeMeter(snapshot) === null))
337
388
  throw new Error("Snapshot bounds rejected");
338
389
  }
390
+ /* Writers in this process take FIFO turns before competing for the filesystem
391
+ lock. Other processes still use the same lock, while one busy provider can
392
+ no longer make an earlier local waiter lose a bounded polling race. */
393
+ const processLockQueues = new Map();
339
394
  /**
340
395
  * Run one cache mutation while holding the single cache lock.
341
396
  *
@@ -343,16 +398,36 @@ function rejectOutOfBounds(snapshots) {
343
398
  * the lock exists only to keep two writers from interleaving.
344
399
  */
345
400
  async function withCacheLock(directory, action) {
346
- await prepareStateDirectory(directory);
347
- const lockPath = path.join(directory, CACHE_LOCK_NAME);
348
- await rejectSymlink(lockPath);
349
- const { handle, token } = await acquireLock(lockPath);
401
+ const absoluteDirectory = path.resolve(directory);
402
+ const queueKey = process.platform === "win32"
403
+ ? absoluteDirectory.toLowerCase()
404
+ : absoluteDirectory;
405
+ const previousTurn = processLockQueues.get(queueKey);
406
+ let finishTurn = () => undefined;
407
+ const currentTurn = new Promise((resolve) => {
408
+ finishTurn = resolve;
409
+ });
410
+ processLockQueues.set(queueKey, currentTurn);
411
+ if (previousTurn !== undefined)
412
+ await previousTurn;
350
413
  try {
351
- return await action();
414
+ await prepareStateDirectory(absoluteDirectory);
415
+ const lockPath = path.join(absoluteDirectory, CACHE_LOCK_NAME);
416
+ await rejectSymlink(lockPath);
417
+ const { handle, token } = await acquireLock(lockPath);
418
+ try {
419
+ return await action();
420
+ }
421
+ finally {
422
+ await handle.close().catch(() => undefined);
423
+ await releaseLock(lockPath, token);
424
+ }
352
425
  }
353
426
  finally {
354
- await handle.close().catch(() => undefined);
355
- await releaseLock(lockPath, token);
427
+ finishTurn();
428
+ if (processLockQueues.get(queueKey) === currentTurn) {
429
+ processLockQueues.delete(queueKey);
430
+ }
356
431
  }
357
432
  }
358
433
  /**
@@ -418,6 +493,85 @@ export async function mergeSnapshotCache(incoming, directory = resolveStateDirec
418
493
  return { merged, written: true };
419
494
  });
420
495
  }
496
+ /**
497
+ * Fold rows this machine just acquired into the cache, without ever losing a
498
+ * newer row somebody else wrote.
499
+ *
500
+ * The problem this exists for: two PROCESSES write this cache, the desktop tray
501
+ * and this command line tool, and a lock held by one of them means nothing to
502
+ * the other. A plain collection report replaces every row for its identity,
503
+ * which is correct when the writer owns the provider and destructive when a
504
+ * desktop wrote a fresher row for the same identity a moment ago.
505
+ *
506
+ * So the decision is made INSIDE the cache lock, which both processes do share,
507
+ * and it is made per row: the newer `observedAt` wins, and on a tie the row
508
+ * already in the cache wins. Ties go to the incumbent because the only way to
509
+ * get one is two writers reading the same instant, and in that case the row
510
+ * that is already visible should not flicker.
511
+ *
512
+ * When nothing was deferred this behaves exactly like a collection report, so a
513
+ * provider that stops reporting a window still loses that row. When something
514
+ * was deferred the write becomes a merge instead, because dropping the rows for
515
+ * an identity we did not fully win would delete the very rows we deferred to.
516
+ */
517
+ export async function mergeAcquiredSnapshots(report, directory = resolveStateDirectory()) {
518
+ rejectOutOfBounds(report.snapshots);
519
+ return await withCacheLock(directory, async () => {
520
+ const cached = await readCacheState(directory);
521
+ const before = cached.ok
522
+ ? cached.state
523
+ : { snapshots: [], suppressions: [] };
524
+ const held = new Map(before.snapshots.map((snapshot) => [snapshotIdentity(snapshot), snapshot]));
525
+ const taken = [];
526
+ let deferred = 0;
527
+ for (const incoming of report.snapshots) {
528
+ const existing = held.get(snapshotIdentity(incoming));
529
+ const existingAt = existing === undefined
530
+ ? null
531
+ : Date.parse(existing.observedAt);
532
+ const incomingAt = Date.parse(incoming.observedAt);
533
+ const loses = existing !== undefined &&
534
+ Number.isFinite(existingAt) &&
535
+ Number.isFinite(incomingAt) &&
536
+ existingAt >= incomingAt;
537
+ if (loses) {
538
+ deferred += 1;
539
+ continue;
540
+ }
541
+ taken.push(incoming);
542
+ }
543
+ /*
544
+ * The authoritative replace drops every row for this identity before it
545
+ * merges, which is right when this process owns them all and destructive
546
+ * when it does not. A round that reports FEWER windows than last time would
547
+ * otherwise delete another writer's row for a window it simply did not
548
+ * report, which is how the desktop's five hour Codex row disappeared the
549
+ * first time this was written. So a row belonging to this identity that
550
+ * nobody in this round reported and that this tool did not write is enough
551
+ * on its own to make the write a merge.
552
+ */
553
+ const incomingIdentities = new Set(report.snapshots.map((snapshot) => snapshotIdentity(snapshot)));
554
+ const foreign = before.snapshots.filter((snapshot) => snapshotBelongsTo(snapshot, report.provider, report.accountId) &&
555
+ snapshot.writer !== "cli" &&
556
+ !incomingIdentities.has(snapshotIdentity(snapshot))).length;
557
+ if (deferred === 0 && foreign === 0) {
558
+ const after = applyCollectionReport(before, report);
559
+ if (canonicalJson(after) === canonicalJson(before)) {
560
+ return { written: false, taken: taken.length, deferred };
561
+ }
562
+ rejectOutOfBounds(after.snapshots);
563
+ await replaceCache(directory, after.snapshots, after.suppressions);
564
+ return { written: true, taken: taken.length, deferred };
565
+ }
566
+ const merged = mergeSnapshots(before.snapshots, taken);
567
+ if (canonicalJson(merged) === canonicalJson(before.snapshots)) {
568
+ return { written: false, taken: taken.length, deferred };
569
+ }
570
+ rejectOutOfBounds(merged);
571
+ await replaceCache(directory, merged, before.suppressions);
572
+ return { written: true, taken: taken.length, deferred };
573
+ });
574
+ }
421
575
  /**
422
576
  * Fold one collection report into the cache under the lock.
423
577
  *
package/dist/cache.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,MAAM,EAEP,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAIjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGjF,MAAM,CAAC,MAAM,eAAe,GAAG,wBAAwB,CAAC;AACxD,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAElD,gEAAgE;AAChE,MAAM,CAAC,MAAM,mBAAmB,GAAG,SAAS,CAAC;AAE7C,oEAAoE;AACpE,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C,iFAAiF;AACjF,MAAM,iCAAiC,GAAG,EAAE,CAAC;AAQ7C,MAAM,UAAU,qBAAqB,CAAC,UAAiC,EAAE;IACvE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,IAAI,OAAO,EAAE,CAAC;IAChD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,aAAa,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,IAAI,CACd,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAC1E,aAAa,CACd,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAQ,KAA+B,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAc;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,cAAc,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC9E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,MAAM,KAAK,CAAC;IACjD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IACpD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAClE,CAAC;AAMD;;;;GAIG;AACH,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ;IAClC,CAAC,OAAO,SAAS,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAExE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,YAAY,GAAG,mBAAmB;IAElC,IAAI,MAAkB,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACrF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC7D,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,cAAc,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACpE,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;YAC3D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,EAAE,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAgBD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAS,GAAG,qBAAqB,EAAE;IAEnC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1E,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1C;qEACiE;IACjE,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,sBAAsB,EAAE,CAAC;QACjF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1C,CAAC;IACD,MAAM,SAAS,GAAG,eAAe,CAAC,YAA0B,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACvD,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb;;8BAEsB;QACtB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC9F,CAAC;IACD,MAAM,SAAS,GAAG,gBAAgB,CAAC;QACjC,SAAS,EAAE,SAAS;QACpB,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CAAC;IACH,OAAO;QACL,EAAE,EAAE,IAAI;QACR,SAAS;QACT,OAAO;QACP,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM;QAC/C,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAS,GAAG,qBAAqB,EAAE;IAEnC,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC,CAAC;IACjF,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACvE,MAAM,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC1E,IAAI,YAAY,CAAC,MAAM,GAAG,iBAAiB;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACrF,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;IAC9D,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACtD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE;YACL,SAAS,EAAE,eAAe,CAAC,YAA0B,CAAC;YACtD,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB;IACjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAC5E,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEnE;;;;;;;GAOG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,EAAU;IACrD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,IACE,OAAO,IAAI,oBAAoB;gBAC/B,IAAI,KAAK,SAAS;gBAClB,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC/B,MAAM,KAAK,CAAC;YACd,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,QAAgB;IAEhB,MAAM,QAAQ,GAAG,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;IAC1E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;YAAE,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,CAAC;QACH,gBAAgB,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;YACxE,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,cAAsB,CAAC;IAC3B,IAAI,aAAqB,CAAC;IAC1B,IAAI,gBAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC9B,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC;QAC7B,gBAAgB,GAAG,QAAQ,CAAC,OAAO,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,SAAS,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,GAAG;YAAE,SAAS,GAAG,GAAG,CAAC;IACtE,CAAC;IACD,IAAI,GAAG,GAAG,SAAS,GAAG,uBAAuB;QAAE,OAAO,KAAK,CAAC;IAC5D,IAAI,CAAC;QACH,IACE,gBAAgB,KAAK,IAAI;YACzB,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,gBAAgB;YACvD,OAAO,KAAK,CAAC;QACf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,QAAQ,CAAC,GAAG,KAAK,cAAc,IAAI,QAAQ,CAAC,GAAG,KAAK,aAAa;YAAE,OAAO,KAAK,CAAC;QACpF,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC/C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3E,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAAgB;IAEhB;mFAC+E;IAC/E,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;gBAC3B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;gBACd,EAAE,EAAE,UAAU,EAAE;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACtC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC5C,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC9C,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAC9B,IACE,IAAI,KAAK,SAAS;gBAClB,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC7B,CAAC,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;gBACjC,MAAM,KAAK,CAAC;YACd,IAAI,CAAC,CAAC,MAAM,gBAAgB,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,KAAK,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,KAAa;IACxD,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK;YAAE,OAAO;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IACD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,SAA8B;IACvD,IAAI,SAAS,CAAC,MAAM,GAAG,iBAAiB;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IACtF,IACE,SAAS,CAAC,IAAI,CACZ,CAAC,QAAQ,EAAE,EAAE,CAAC,cAAc,CAAC,QAA+B,CAAC,KAAK,IAAI,CACvE;QACD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAChD,CAAC;AAED;;yEAEyE;AACzE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAyB,CAAC;AAE3D;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAC1B,SAAiB,EACjB,MAA6B;IAE7B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC3C,CAAC,CAAC,iBAAiB,CAAC,WAAW,EAAE;QACjC,CAAC,CAAC,iBAAiB,CAAC;IACtB,MAAM,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,UAAU,GAAe,GAAG,EAAE,CAAC,SAAS,CAAC;IAC7C,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChD,UAAU,GAAG,OAAO,CAAC;IACvB,CAAC,CAAC,CAAC;IACH,iBAAiB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,YAAY,KAAK,SAAS;QAAE,MAAM,YAAY,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,qBAAqB,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAC/D,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,EAAE,CAAC;QACxB,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,UAAU,EAAE,CAAC;QACb,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,WAAW,EAAE,CAAC;YACpD,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAExC,KAAK,UAAU,YAAY,CACzB,SAAiB,EACjB,SAA8B,EAC9B,eAA4C,EAAE;IAE9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACnD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC1B;kFAC8E;IAC9E,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC;QACxC,CAAC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE;QAChD,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;IACjE,MAAM,mBAAmB,CAAC,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAA8B,EAC9B,SAAS,GAAG,qBAAqB,EAAE;IAEnC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7B,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAA6B,EAC7B,SAAS,GAAG,qBAAqB,EAAE;IAEnC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,OAAO,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAe,MAAM,CAAC,EAAE;YACjC,CAAC,CAAC,MAAM,CAAC,KAAK;YACd,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzD,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QACD,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAA+C,EAC/C,SAAS,GAAG,qBAAqB,EAAE;IAEnC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAe,MAAM,CAAC,EAAE;YAClC,CAAC,CAAC,MAAM,CAAC,KAAK;YACd,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAClB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAC3E,CAAC;QACF,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtD,MAAM,UAAU,GAAG,QAAQ,KAAK,SAAS;gBACvC,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,KAAK,GAAG,QAAQ,KAAK,SAAS;gBAClC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC3B,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC1B,UAAqB,IAAI,UAAU,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,IAAI,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD;;;;;;;;;WASG;QACH,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAChC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAC/D,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CACrC,CAAC,QAAQ,EAAE,EAAE,CACX,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC;YAC9D,QAAQ,CAAC,MAAM,KAAK,KAAK;YACzB,CAAC,kBAAkB,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CACtD,CAAC,MAAM,CAAC;QACT,IAAI,QAAQ,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACpD,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC3D,CAAC;YACD,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACnC,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC1D,CAAC;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC3D,CAAC;QACD,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;QAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAwB,EACxB,SAAS,GAAG,qBAAqB,EAAE;IAEnC,IAAI,MAAM,CAAC,EAAE;QAAE,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnD,OAAO,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAe,MAAM,CAAC,EAAE;YAClC,CAAC,CAAC,MAAM,CAAC,KAAK;YACd,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpD,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC1C,CAAC;QACD,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACnE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -125,8 +125,59 @@ export declare const connectionNextAction: {
125
125
  readonly UNSUPPORTED: "Add manual plan";
126
126
  readonly ERROR: "View diagnostics";
127
127
  };
128
- /** The five providers on the Connect and See catalogue surface. */
129
- export declare const CATALOGUE_PROVIDER_IDS: readonly ["claude", "openrouter", "codex", "antigravity", "opencode"];
128
+ /**
129
+ * Why a connection is not simply working, in a closed vocabulary.
130
+ *
131
+ * A state says WHAT a connection is. A reason says why it got there, and it is
132
+ * the half a person actually needs: "stale" is a shrug, "stale because the
133
+ * stored credential stopped working" is something they can act on. Closed
134
+ * rather than free text, because a reason is rendered next to a button and a
135
+ * provider must never be able to write either one.
136
+ */
137
+ export declare const CONNECTION_REASONS: readonly ["token_expired", "reading_expired", "tool_not_running", "provider_refusing", "shape_mismatch", "network_unreachable", "no_credential"];
138
+ export type ConnectionReason = (typeof CONNECTION_REASONS)[number];
139
+ /** One sentence per reason, written for a person rather than for a log. */
140
+ export declare const connectionReasonSentence: {
141
+ readonly token_expired: "The credential this connection uses stopped working.";
142
+ readonly reading_expired: "The newest reading is older than the window it describes.";
143
+ readonly tool_not_running: "The local tool has not written a reading yet.";
144
+ readonly provider_refusing: "The provider refused the last read.";
145
+ readonly shape_mismatch: "The answer did not match the shape this build reads.";
146
+ readonly network_unreachable: "The last read never reached the provider.";
147
+ readonly no_credential: "No credential has been stored for this connection.";
148
+ };
149
+ /**
150
+ * The connection as one value a surface can render without deciding anything.
151
+ *
152
+ * State, reason, and the one instruction that belongs to that pair. Every field
153
+ * is written by OpenLimiter and never by a provider, which is what keeps a
154
+ * payload from writing the sentence beside a button.
155
+ */
156
+ export interface ConnectionStatus {
157
+ readonly state: ConnectionState;
158
+ readonly reason: ConnectionReason | null;
159
+ /** What the PERSON does next. Never something this app does on their behalf. */
160
+ readonly instruction: string;
161
+ }
162
+ /**
163
+ * The local tool a connection reads through, when one exists.
164
+ *
165
+ * Carried so an instruction can name it. A connection with no local tool, such
166
+ * as a remote read behind a key the person pasted, passes null and gets an
167
+ * instruction that names no tool rather than an invented one.
168
+ */
169
+ export type ConnectionTool = string | null;
170
+ /**
171
+ * One connection status, from a state and an optional reason.
172
+ *
173
+ * Pure, total, and the only place an instruction is chosen. A reason wins the
174
+ * instruction whenever it has one, because it is the more specific fact; with
175
+ * no reason the state's own next action stands. Nothing here reads a clock, a
176
+ * network or a disk, so a surface and a test see the same answer.
177
+ */
178
+ export declare function connectionStatus(state: ConnectionState, reason?: ConnectionReason | null, tool?: ConnectionTool): ConnectionStatus;
179
+ /** The seven providers on the Connect and See catalogue surface. */
180
+ export declare const CATALOGUE_PROVIDER_IDS: readonly ["claude", "openrouter", "codex", "antigravity", "opencode", "grok", "kimi"];
130
181
  export type CatalogueProviderId = (typeof CATALOGUE_PROVIDER_IDS)[number];
131
182
  export type CataloguePlatform = "windows" | "macos" | "linux";
132
183
  export type CatalogueCapabilityMode = "automatic" | "manual" | "event_driven";
@@ -1 +1 @@
1
- {"version":3,"file":"connection-state.d.ts","sourceRoot":"","sources":["../src/connection-state.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection-state.d.ts","sourceRoot":"","sources":["../src/connection-state.ts"],"names":[],"mappings":"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"}
@@ -157,13 +157,98 @@ export const connectionNextAction = {
157
157
  UNSUPPORTED: "Add manual plan",
158
158
  ERROR: "View diagnostics"
159
159
  };
160
- /** The five providers on the Connect and See catalogue surface. */
160
+ /**
161
+ * Why a connection is not simply working, in a closed vocabulary.
162
+ *
163
+ * A state says WHAT a connection is. A reason says why it got there, and it is
164
+ * the half a person actually needs: "stale" is a shrug, "stale because the
165
+ * stored credential stopped working" is something they can act on. Closed
166
+ * rather than free text, because a reason is rendered next to a button and a
167
+ * provider must never be able to write either one.
168
+ */
169
+ export const CONNECTION_REASONS = [
170
+ "token_expired",
171
+ "reading_expired",
172
+ "tool_not_running",
173
+ "provider_refusing",
174
+ "shape_mismatch",
175
+ "network_unreachable",
176
+ "no_credential"
177
+ ];
178
+ /** One sentence per reason, written for a person rather than for a log. */
179
+ export const connectionReasonSentence = {
180
+ token_expired: "The credential this connection uses stopped working.",
181
+ reading_expired: "The newest reading is older than the window it describes.",
182
+ tool_not_running: "The local tool has not written a reading yet.",
183
+ provider_refusing: "The provider refused the last read.",
184
+ shape_mismatch: "The answer did not match the shape this build reads.",
185
+ network_unreachable: "The last read never reached the provider.",
186
+ no_credential: "No credential has been stored for this connection."
187
+ };
188
+ /**
189
+ * The instruction for a reason, in the words of the thing the person does.
190
+ *
191
+ * Every one of these is an action a HUMAN takes. OpenLimiter never refreshes a
192
+ * command line tool's token, never signs anyone in, and never renews a
193
+ * credential it did not create, so no instruction here can be read as something
194
+ * this app is about to do by itself. That restraint is the product: a meter
195
+ * that quietly reauthenticated a coding agent would be a much larger thing than
196
+ * a meter, and it would be one nobody asked for.
197
+ */
198
+ function reasonInstruction(reason, tool) {
199
+ switch (reason) {
200
+ case "token_expired":
201
+ return tool === null
202
+ ? "Sign in again where this credential was created."
203
+ : "Open " + tool + " to refresh";
204
+ case "reading_expired":
205
+ return tool === null
206
+ ? "Refresh to read this connection again."
207
+ : "Open " + tool + " to refresh";
208
+ case "tool_not_running":
209
+ return tool === null
210
+ ? "Start the tool that writes this reading."
211
+ : "Open " + tool + " once so it writes a reading";
212
+ case "provider_refusing":
213
+ return "Wait for the next retry.";
214
+ case "shape_mismatch":
215
+ return tool === null
216
+ ? "Reconnect, then report this if it keeps happening."
217
+ : "Reconnect " + tool + ", then report this if it keeps happening";
218
+ case "network_unreachable":
219
+ return "Check the network, then retry.";
220
+ case "no_credential":
221
+ return "Add the credential this connection needs.";
222
+ default: {
223
+ const unreachable = reason;
224
+ return unreachable;
225
+ }
226
+ }
227
+ }
228
+ /**
229
+ * One connection status, from a state and an optional reason.
230
+ *
231
+ * Pure, total, and the only place an instruction is chosen. A reason wins the
232
+ * instruction whenever it has one, because it is the more specific fact; with
233
+ * no reason the state's own next action stands. Nothing here reads a clock, a
234
+ * network or a disk, so a surface and a test see the same answer.
235
+ */
236
+ export function connectionStatus(state, reason = null, tool = null) {
237
+ return {
238
+ state,
239
+ reason,
240
+ instruction: reason === null ? connectionNextAction[state] : reasonInstruction(reason, tool)
241
+ };
242
+ }
243
+ /** The seven providers on the Connect and See catalogue surface. */
161
244
  export const CATALOGUE_PROVIDER_IDS = [
162
245
  "claude",
163
246
  "openrouter",
164
247
  "codex",
165
248
  "antigravity",
166
- "opencode"
249
+ "opencode",
250
+ "grok",
251
+ "kimi"
167
252
  ];
168
253
  const supported = {
169
254
  mode: "automatic",
@@ -175,11 +260,6 @@ const eventDriven = {
175
260
  maturity: "supported",
176
261
  label: "Event driven"
177
262
  };
178
- const experimental = {
179
- mode: "automatic",
180
- maturity: "experimental",
181
- label: "Experimental"
182
- };
183
263
  const manual = {
184
264
  mode: "manual",
185
265
  maturity: "supported",
@@ -194,12 +274,15 @@ const catalogueCapabilities = {
194
274
  claude: { windows: eventDriven, macos: eventDriven, linux: eventDriven },
195
275
  openrouter: { windows: supported, macos: supported, linux: supported },
196
276
  codex: { windows: supported, macos: supported, linux: supported },
197
- antigravity: { windows: experimental, macos: manual, linux: manual },
277
+ // The label states what this UI can do today; discovery returns only when its result reaches this surface.
278
+ antigravity: { windows: manualExperimental, macos: manual, linux: manual },
198
279
  opencode: {
199
280
  windows: manualExperimental,
200
281
  macos: manualExperimental,
201
282
  linux: manualExperimental
202
- }
283
+ },
284
+ grok: { windows: supported, macos: supported, linux: supported },
285
+ kimi: { windows: supported, macos: supported, linux: supported }
203
286
  };
204
287
  function isCatalogueProviderId(value) {
205
288
  return typeof value === "string" &&
@@ -218,6 +301,12 @@ function actionFor(providerId, state) {
218
301
  if (providerId === "codex" && (state === "NEEDS_AUTH" || state === "AUTH_EXPIRED")) {
219
302
  return "Run codex login";
220
303
  }
304
+ if (providerId === "grok" && (state === "NEEDS_AUTH" || state === "AUTH_EXPIRED")) {
305
+ return "Run grok login";
306
+ }
307
+ if (providerId === "kimi" && (state === "NEEDS_AUTH" || state === "AUTH_EXPIRED")) {
308
+ return "Run kimi login";
309
+ }
221
310
  return connectionNextAction[state];
222
311
  }
223
312
  /**