@cortexkit/opencode-anthropic-auth 2.4.6 → 2.4.8

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.
@@ -1,7 +1,7 @@
1
- import { memo as _$memo } from "opentui:runtime-module:%40opentui%2Fsolid";
2
- import { createComponent as _$createComponent } from "opentui:runtime-module:%40opentui%2Fsolid";
3
1
  import { createTextNode as _$createTextNode } from "opentui:runtime-module:%40opentui%2Fsolid";
2
+ import { memo as _$memo } from "opentui:runtime-module:%40opentui%2Fsolid";
4
3
  import { use as _$use } from "opentui:runtime-module:%40opentui%2Fsolid";
4
+ import { createComponent as _$createComponent } from "opentui:runtime-module:%40opentui%2Fsolid";
5
5
  import { effect as _$effect } from "opentui:runtime-module:%40opentui%2Fsolid";
6
6
  import { insertNode as _$insertNode } from "opentui:runtime-module:%40opentui%2Fsolid";
7
7
  import { insert as _$insert } from "opentui:runtime-module:%40opentui%2Fsolid";
@@ -17,10 +17,11 @@ import { readFileSync } from "node:fs";
17
17
  import { dirname, join } from "node:path";
18
18
  import { fileURLToPath } from "node:url";
19
19
  import { formatCreditAmounts, quotaDisplayProjection, quotaWindowParts } from "@cortexkit/anthropic-auth-core";
20
- import { TextAttributes } from "opentui:runtime-module:%40opentui%2Fcore";
21
20
  import { createEffect, createMemo, createSignal, For, Index, onCleanup, Show } from "opentui:runtime-module:solid-js";
22
- import { computeQuotaPacing, DEFAULT_SIDEBAR_STATE, FIVE_HOUR_MS, fitPaceLine, fitQuotaRow, formatPrimeAccountValue, formatQuotaRowLabel, getCollapsedAccounts, getCollapsedQuotaSummary, getFableRecoverySummary, quotaLabelColumnWidth, resolveActiveAccount, SEVEN_DAY_MS, scopedQuotaShortNames } from "../sidebar-state.js";
21
+ import { createStore, reconcile } from "opentui:runtime-module:solid-js%2Fstore";
22
+ import { computeQuotaPacing, DEFAULT_SIDEBAR_STATE, FIVE_HOUR_MS, fitPaceLine, fitQuotaRow, formatPrimeAccountValue, getCollapsedAccounts, getCollapsedQuotaSummary, getFableRecoverySummary, quotaLabelColumnWidth, resolveActiveAccount, SEVEN_DAY_MS, scopedQuotaShortNames } from "../sidebar-state.js";
23
23
  import { PLUGIN_KEY, queueTuiPreferenceUpdate, readTuiPreferencesFile, resolveAnthropicAuthPrefs, watchTuiPreferences } from "../tui-preferences.js";
24
+ import { SidebarFrame, SidebarTextRow } from "./../quota-sidebar.js";
24
25
 
25
26
  // Read package metadata from either the raw src/ entry or its generated
26
27
  // src/tui-compiled/tui/ counterpart. Avoid a JSON import because package.json sits
@@ -64,6 +65,9 @@ function usageTone(usedPct, appearance) {
64
65
  if (usedPct < appearance.errorThreshold) return 'warn';
65
66
  return 'err';
66
67
  }
68
+ function sharedTone(tone) {
69
+ return tone === 'ok' ? 'success' : tone === 'warn' ? 'warning' : tone === 'err' ? 'error' : tone === 'muted' ? 'textMuted' : tone;
70
+ }
67
71
  const PACE_RESERVE_CHAR = '\u2592';
68
72
  const PACE_DEFICIT_CHAR = '\u2593';
69
73
 
@@ -198,111 +202,26 @@ function CollapsedRow(props) {
198
202
  return _el$8;
199
203
  })();
200
204
  }
201
- function CollapsedAccountRow(props) {
202
- const [width, setWidth] = createSignal(40);
203
- let row;
204
- const summary = () => getCollapsedQuotaSummary(props.account.quota, props.now);
205
- const value = () => summary().text ?? '—';
206
- // Keep the quota and its two-cell status suffix intact; only the label shrinks.
207
- const labelWidth = () => Math.max(0, width() - 1 - Bun.stringWidth(value()) - 2);
208
- const dim = () => !props.account.active || props.account.quotaDated || summary().stale;
209
- const attributes = () => dim() ? TextAttributes.DIM : TextAttributes.BOLD;
210
- const color = () => dim() ? props.theme.textMuted : toneColor(props.theme, props.tone);
211
- return (() => {
212
- var _el$0 = _$createElement("box"),
213
- _el$12 = _$createElement("text"),
214
- _el$13 = _$createElement("text");
215
- _$insertNode(_el$0, _el$12);
216
- _$insertNode(_el$0, _el$13);
217
- _$use(element => {
218
- row = element;
219
- setWidth(element.width || 40);
220
- }, _el$0);
221
- _$setProp(_el$0, "width", '100%');
222
- _$setProp(_el$0, "height", 1);
223
- _$setProp(_el$0, "flexDirection", 'row');
224
- _$setProp(_el$0, "onSizeChange", () => setWidth(row?.width || 40));
225
- _$insert(_el$0, _$createComponent(Show, {
226
- get when() {
227
- return labelWidth() > 0;
228
- },
229
- get children() {
230
- return [(() => {
231
- var _el$1 = _$createElement("text");
232
- _$setProp(_el$1, "flexShrink", 0);
233
- _$setProp(_el$1, "wrapMode", 'none');
234
- _$insert(_el$1, () => formatQuotaRowLabel(props.account.name, labelWidth()));
235
- _$effect(_p$ => {
236
- var _v$5 = labelWidth(),
237
- _v$6 = color(),
238
- _v$7 = attributes();
239
- _v$5 !== _p$.e && (_p$.e = _$setProp(_el$1, "width", _v$5, _p$.e));
240
- _v$6 !== _p$.t && (_p$.t = _$setProp(_el$1, "fg", _v$6, _p$.t));
241
- _v$7 !== _p$.a && (_p$.a = _$setProp(_el$1, "attributes", _v$7, _p$.a));
242
- return _p$;
243
- }, {
244
- e: undefined,
245
- t: undefined,
246
- a: undefined
247
- });
248
- return _el$1;
249
- })(), (() => {
250
- var _el$10 = _$createElement("text");
251
- _$insertNode(_el$10, _$createTextNode(` `));
252
- _$setProp(_el$10, "width", 1);
253
- _$setProp(_el$10, "flexShrink", 0);
254
- return _el$10;
255
- })()];
256
- }
257
- }), _el$12);
258
- _$setProp(_el$12, "flexShrink", 0);
259
- _$setProp(_el$12, "wrapMode", 'none');
260
- _$insert(_el$12, value);
261
- _$setProp(_el$13, "width", 2);
262
- _$setProp(_el$13, "flexShrink", 0);
263
- _$insert(_el$13, () => props.account.blocked ? ' ⊘' : ' ●');
264
- _$effect(_p$ => {
265
- var _v$8 = Bun.stringWidth(value()),
266
- _v$9 = color(),
267
- _v$0 = attributes(),
268
- _v$1 = toneColor(props.theme, props.account.blocked ? 'warn' : props.account.active ? 'ok' : 'muted'),
269
- _v$10 = attributes();
270
- _v$8 !== _p$.e && (_p$.e = _$setProp(_el$12, "width", _v$8, _p$.e));
271
- _v$9 !== _p$.t && (_p$.t = _$setProp(_el$12, "fg", _v$9, _p$.t));
272
- _v$0 !== _p$.a && (_p$.a = _$setProp(_el$12, "attributes", _v$0, _p$.a));
273
- _v$1 !== _p$.o && (_p$.o = _$setProp(_el$13, "fg", _v$1, _p$.o));
274
- _v$10 !== _p$.i && (_p$.i = _$setProp(_el$13, "attributes", _v$10, _p$.i));
275
- return _p$;
276
- }, {
277
- e: undefined,
278
- t: undefined,
279
- a: undefined,
280
- o: undefined,
281
- i: undefined
282
- });
283
- return _el$0;
284
- })();
285
- }
286
205
 
287
206
  // One cell run of a single-line row: drawn at its own width, never shrunk and
288
207
  // never wrapped, so the row's layout is exactly what `fitQuotaRow` measured.
289
208
  function Cell(props) {
290
209
  return (() => {
291
- var _el$14 = _$createElement("text");
292
- _$setProp(_el$14, "flexShrink", 0);
293
- _$setProp(_el$14, "wrapMode", 'none');
294
- _$insert(_el$14, () => props.text);
210
+ var _el$0 = _$createElement("text");
211
+ _$setProp(_el$0, "flexShrink", 0);
212
+ _$setProp(_el$0, "wrapMode", 'none');
213
+ _$insert(_el$0, () => props.text);
295
214
  _$effect(_p$ => {
296
- var _v$11 = Bun.stringWidth(props.text),
297
- _v$12 = props.fg;
298
- _v$11 !== _p$.e && (_p$.e = _$setProp(_el$14, "width", _v$11, _p$.e));
299
- _v$12 !== _p$.t && (_p$.t = _$setProp(_el$14, "fg", _v$12, _p$.t));
215
+ var _v$5 = Bun.stringWidth(props.text),
216
+ _v$6 = props.fg;
217
+ _v$5 !== _p$.e && (_p$.e = _$setProp(_el$0, "width", _v$5, _p$.e));
218
+ _v$6 !== _p$.t && (_p$.t = _$setProp(_el$0, "fg", _v$6, _p$.t));
300
219
  return _p$;
301
220
  }, {
302
221
  e: undefined,
303
222
  t: undefined
304
223
  });
305
- return _el$14;
224
+ return _el$0;
306
225
  })();
307
226
  }
308
227
 
@@ -332,11 +251,11 @@ function QuotaRow(props) {
332
251
  },
333
252
  get fallback() {
334
253
  return (() => {
335
- var _el$17 = _$createElement("box");
336
- _$setProp(_el$17, "width", '100%');
337
- _$setProp(_el$17, "height", 1);
338
- _$setProp(_el$17, "flexDirection", 'row');
339
- _$insert(_el$17, _$createComponent(Cell, {
254
+ var _el$11 = _$createElement("box");
255
+ _$setProp(_el$11, "width", '100%');
256
+ _$setProp(_el$11, "height", 1);
257
+ _$setProp(_el$11, "flexDirection", 'row');
258
+ _$insert(_el$11, _$createComponent(Cell, {
340
259
  get fg() {
341
260
  return props.theme.textMuted;
342
261
  },
@@ -344,26 +263,26 @@ function QuotaRow(props) {
344
263
  return `${labelCell()}\u2014`;
345
264
  }
346
265
  }));
347
- return _el$17;
266
+ return _el$11;
348
267
  })();
349
268
  },
350
269
  get children() {
351
270
  return [(() => {
352
- var _el$15 = _$createElement("box"),
353
- _el$16 = _$createElement("box");
354
- _$insertNode(_el$15, _el$16);
355
- _$setProp(_el$15, "width", '100%');
356
- _$setProp(_el$15, "height", 1);
357
- _$setProp(_el$15, "flexDirection", 'row');
358
- _$insert(_el$15, _$createComponent(Cell, {
271
+ var _el$1 = _$createElement("box"),
272
+ _el$10 = _$createElement("box");
273
+ _$insertNode(_el$1, _el$10);
274
+ _$setProp(_el$1, "width", '100%');
275
+ _$setProp(_el$1, "height", 1);
276
+ _$setProp(_el$1, "flexDirection", 'row');
277
+ _$insert(_el$1, _$createComponent(Cell, {
359
278
  get fg() {
360
279
  return props.theme.textMuted;
361
280
  },
362
281
  get text() {
363
282
  return labelCell();
364
283
  }
365
- }), _el$16);
366
- _$insert(_el$15, _$createComponent(Index, {
284
+ }), _el$10);
285
+ _$insert(_el$1, _$createComponent(Index, {
367
286
  get each() {
368
287
  return quotaBarSegments(used(), props.appearance, props.pacing, fit().barCells);
369
288
  },
@@ -375,17 +294,17 @@ function QuotaRow(props) {
375
294
  return segment().text;
376
295
  }
377
296
  })
378
- }), _el$16);
379
- _$insert(_el$15, _$createComponent(Cell, {
297
+ }), _el$10);
298
+ _$insert(_el$1, _$createComponent(Cell, {
380
299
  get fg() {
381
300
  return toneColor(props.theme, usageTone(used(), props.appearance));
382
301
  },
383
302
  get text() {
384
303
  return `${fit().barCells > 0 ? ' ' : ''}${figure()}`;
385
304
  }
386
- }), _el$16);
387
- _$setProp(_el$16, "flexGrow", 1);
388
- _$insert(_el$15, _$createComponent(Show, {
305
+ }), _el$10);
306
+ _$setProp(_el$10, "flexGrow", 1);
307
+ _$insert(_el$1, _$createComponent(Show, {
389
308
  get when() {
390
309
  return fit().reset;
391
310
  },
@@ -398,17 +317,17 @@ function QuotaRow(props) {
398
317
  }
399
318
  })
400
319
  }), null);
401
- return _el$15;
320
+ return _el$1;
402
321
  })(), _$createComponent(Show, {
403
322
  get when() {
404
323
  return paceLine();
405
324
  },
406
325
  children: line => (() => {
407
- var _el$18 = _$createElement("box");
408
- _$setProp(_el$18, "width", '100%');
409
- _$setProp(_el$18, "height", 1);
410
- _$setProp(_el$18, "flexDirection", 'row');
411
- _$insert(_el$18, _$createComponent(Cell, {
326
+ var _el$12 = _$createElement("box");
327
+ _$setProp(_el$12, "width", '100%');
328
+ _$setProp(_el$12, "height", 1);
329
+ _$setProp(_el$12, "flexDirection", 'row');
330
+ _$insert(_el$12, _$createComponent(Cell, {
412
331
  get fg() {
413
332
  return props.theme.textMuted;
414
333
  },
@@ -416,7 +335,7 @@ function QuotaRow(props) {
416
335
  return ' '.repeat(props.labelWidth + 1);
417
336
  }
418
337
  }), null);
419
- _$insert(_el$18, _$createComponent(Cell, {
338
+ _$insert(_el$12, _$createComponent(Cell, {
420
339
  get fg() {
421
340
  return toneColor(props.theme, props.pacing?.state === 'deficit' ? 'warn' : 'muted');
422
341
  },
@@ -424,7 +343,7 @@ function QuotaRow(props) {
424
343
  return line();
425
344
  }
426
345
  }), null);
427
- return _el$18;
346
+ return _el$12;
428
347
  })()
429
348
  })];
430
349
  }
@@ -464,110 +383,124 @@ export function AccountBlock(props) {
464
383
  const [width, setWidth] = createSignal();
465
384
  let block;
466
385
  return (() => {
467
- var _el$19 = _$createElement("box"),
468
- _el$20 = _$createElement("box"),
469
- _el$21 = _$createElement("text"),
470
- _el$22 = _$createElement("b"),
471
- _el$23 = _$createElement("text"),
472
- _el$24 = _$createElement("b");
473
- _$insertNode(_el$19, _el$20);
386
+ var _el$13 = _$createElement("box"),
387
+ _el$14 = _$createElement("box"),
388
+ _el$15 = _$createElement("text"),
389
+ _el$16 = _$createElement("b"),
390
+ _el$17 = _$createElement("text"),
391
+ _el$18 = _$createElement("b");
392
+ _$insertNode(_el$13, _el$14);
474
393
  _$use(element => {
475
394
  block = element;
476
395
  setWidth(element.width || undefined);
477
- }, _el$19);
478
- _$setProp(_el$19, "width", '100%');
479
- _$setProp(_el$19, "flexDirection", 'column');
480
- _$setProp(_el$19, "onSizeChange", () => setWidth(block?.width || undefined));
481
- _$insertNode(_el$20, _el$21);
482
- _$insertNode(_el$20, _el$23);
483
- _$setProp(_el$20, "width", '100%');
484
- _$setProp(_el$20, "flexDirection", 'row');
485
- _$setProp(_el$20, "justifyContent", 'space-between');
486
- _$insertNode(_el$21, _el$22);
487
- _$insert(_el$22, () => `${props.name}${props.tierLabel ? ` · ${props.tierLabel}` : ''}`);
488
- _$insertNode(_el$23, _el$24);
489
- _$insert(_el$24, statusWord);
490
- _$insert(_el$19, _$createComponent(Show, {
396
+ }, _el$13);
397
+ _$setProp(_el$13, "width", '100%');
398
+ _$setProp(_el$13, "flexDirection", 'column');
399
+ _$setProp(_el$13, "onSizeChange", () => setWidth(block?.width || undefined));
400
+ _$insertNode(_el$14, _el$15);
401
+ _$insertNode(_el$14, _el$17);
402
+ _$setProp(_el$14, "width", '100%');
403
+ _$setProp(_el$14, "flexDirection", 'row');
404
+ _$setProp(_el$14, "justifyContent", 'space-between');
405
+ _$insertNode(_el$15, _el$16);
406
+ _$insert(_el$16, () => `${props.name}${props.tierLabel ? ` · ${props.tierLabel}` : ''}`);
407
+ _$insertNode(_el$17, _el$18);
408
+ _$insert(_el$18, statusWord);
409
+ _$insert(_el$13, _$createComponent(Show, {
491
410
  get when() {
492
411
  return props.stateLine;
493
412
  },
494
413
  get children() {
495
- var _el$25 = _$createElement("text");
496
- _$insert(_el$25, () => props.stateLine);
497
- _$effect(_$p => _$setProp(_el$25, "fg", props.theme.textMuted, _$p));
498
- return _el$25;
414
+ var _el$19 = _$createElement("text");
415
+ _$insert(_el$19, () => props.stateLine);
416
+ _$effect(_$p => _$setProp(_el$19, "fg", props.theme.textMuted, _$p));
417
+ return _el$19;
499
418
  }
500
419
  }), null);
501
- _$insert(_el$19, _$createComponent(Show, {
420
+ _$insert(_el$13, _$createComponent(Show, {
502
421
  get when() {
503
422
  return props.quota;
504
423
  },
505
424
  get fallback() {
506
425
  return (() => {
507
- var _el$29 = _$createElement("text");
508
- _$insertNode(_el$29, _$createTextNode(`checking…`));
509
- _$effect(_$p => _$setProp(_el$29, "fg", props.theme.textMuted, _$p));
510
- return _el$29;
426
+ var _el$23 = _$createElement("text");
427
+ _$insertNode(_el$23, _$createTextNode(`checking…`));
428
+ _$effect(_$p => _$setProp(_el$23, "fg", props.theme.textMuted, _$p));
429
+ return _el$23;
511
430
  })();
512
431
  },
513
432
  get children() {
514
- return [_$createComponent(QuotaRow, {
515
- get theme() {
516
- return props.theme;
517
- },
518
- get appearance() {
519
- return props.appearance;
520
- },
521
- label: "5h",
522
- get labelWidth() {
523
- return labelWidth();
524
- },
525
- get width() {
526
- return width();
527
- },
528
- get part() {
529
- return partFor('5h');
530
- },
531
- get usedPercent() {
532
- return props.quota?.five_hour?.usedPercent;
533
- },
534
- get pacing() {
535
- return pacingFor(props.quota?.five_hour, FIVE_HOUR_MS);
536
- },
537
- get binding() {
538
- return props.quota?.bindingWindow === 'five_hour';
433
+ return [_$createComponent(Show, {
434
+ get when() {
435
+ return props.quota?.five_hour;
539
436
  },
540
- get now() {
541
- return props.now;
437
+ get children() {
438
+ return _$createComponent(QuotaRow, {
439
+ get theme() {
440
+ return props.theme;
441
+ },
442
+ get appearance() {
443
+ return props.appearance;
444
+ },
445
+ label: "5h",
446
+ get labelWidth() {
447
+ return labelWidth();
448
+ },
449
+ get width() {
450
+ return width();
451
+ },
452
+ get part() {
453
+ return partFor('5h');
454
+ },
455
+ get usedPercent() {
456
+ return props.quota?.five_hour?.usedPercent;
457
+ },
458
+ get pacing() {
459
+ return pacingFor(props.quota?.five_hour, FIVE_HOUR_MS);
460
+ },
461
+ get binding() {
462
+ return props.quota?.bindingWindow === 'five_hour';
463
+ },
464
+ get now() {
465
+ return props.now;
466
+ }
467
+ });
542
468
  }
543
- }), _$createComponent(QuotaRow, {
544
- get theme() {
545
- return props.theme;
546
- },
547
- get appearance() {
548
- return props.appearance;
549
- },
550
- label: "7d",
551
- get labelWidth() {
552
- return labelWidth();
553
- },
554
- get width() {
555
- return width();
556
- },
557
- get part() {
558
- return partFor('7d');
559
- },
560
- get usedPercent() {
561
- return props.quota?.seven_day?.usedPercent;
562
- },
563
- get pacing() {
564
- return pacingFor(props.quota?.seven_day, SEVEN_DAY_MS);
565
- },
566
- get binding() {
567
- return props.quota?.bindingWindow === 'seven_day';
469
+ }), _$createComponent(Show, {
470
+ get when() {
471
+ return props.quota?.seven_day;
568
472
  },
569
- get now() {
570
- return props.now;
473
+ get children() {
474
+ return _$createComponent(QuotaRow, {
475
+ get theme() {
476
+ return props.theme;
477
+ },
478
+ get appearance() {
479
+ return props.appearance;
480
+ },
481
+ label: "7d",
482
+ get labelWidth() {
483
+ return labelWidth();
484
+ },
485
+ get width() {
486
+ return width();
487
+ },
488
+ get part() {
489
+ return partFor('7d');
490
+ },
491
+ get usedPercent() {
492
+ return props.quota?.seven_day?.usedPercent;
493
+ },
494
+ get pacing() {
495
+ return pacingFor(props.quota?.seven_day, SEVEN_DAY_MS);
496
+ },
497
+ get binding() {
498
+ return props.quota?.bindingWindow === 'seven_day';
499
+ },
500
+ get now() {
501
+ return props.now;
502
+ }
503
+ });
571
504
  }
572
505
  }), _$createComponent(For, {
573
506
  get each() {
@@ -612,54 +545,99 @@ export function AccountBlock(props) {
612
545
  children: budget => // One line in the block's width: amounts drop their cents rather
613
546
  // than wrap, and keep them until the first layout.
614
547
  (() => {
615
- var _el$31 = _$createElement("box"),
616
- _el$32 = _$createElement("text");
617
- _$insertNode(_el$31, _el$32);
618
- _$setProp(_el$31, "width", '100%');
619
- _$setProp(_el$31, "height", 1);
620
- _$setProp(_el$31, "flexDirection", 'row');
621
- _$setProp(_el$32, "wrapMode", 'none');
622
- _$insert(_el$32, () => creditLine(budget().figure, props.quota?.extraUsage, width()));
623
- _$effect(_$p => _$setProp(_el$32, "fg", toneColor(props.theme, props.quota?.extraUsage?.severity === 'critical' ? 'err' : props.quota?.extraUsage?.severity === 'warning' || props.quota?.extraUsage?.exhausted ? 'warn' : 'muted'), _$p));
624
- return _el$31;
548
+ var _el$25 = _$createElement("box"),
549
+ _el$26 = _$createElement("text");
550
+ _$insertNode(_el$25, _el$26);
551
+ _$setProp(_el$25, "width", '100%');
552
+ _$setProp(_el$25, "height", 1);
553
+ _$setProp(_el$25, "flexDirection", 'row');
554
+ _$setProp(_el$26, "wrapMode", 'none');
555
+ _$insert(_el$26, () => creditLine(budget().figure, props.quota?.extraUsage, width()));
556
+ _$effect(_$p => _$setProp(_el$26, "fg", toneColor(props.theme, props.quota?.extraUsage?.severity === 'critical' ? 'err' : props.quota?.extraUsage?.severity === 'warning' || props.quota?.extraUsage?.exhausted ? 'warn' : 'muted'), _$p));
557
+ return _el$25;
625
558
  })()
626
559
  }), _$createComponent(Show, {
627
560
  get when() {
628
561
  return parts().age;
629
562
  },
630
563
  get children() {
631
- var _el$26 = _$createElement("text");
632
- _$insert(_el$26, () => parts().age);
633
- _$effect(_$p => _$setProp(_el$26, "fg", props.theme.textMuted, _$p));
634
- return _el$26;
564
+ var _el$20 = _$createElement("text");
565
+ _$insert(_el$20, () => parts().age);
566
+ _$effect(_$p => _$setProp(_el$20, "fg", props.theme.textMuted, _$p));
567
+ return _el$20;
635
568
  }
636
569
  }), _$createComponent(Show, {
637
570
  get when() {
638
571
  return props.quota?.fallbackAdvised === true;
639
572
  },
640
573
  get children() {
641
- var _el$27 = _$createElement("text");
642
- _$insertNode(_el$27, _$createTextNode(`→ fallback advised`));
643
- _$effect(_$p => _$setProp(_el$27, "fg", props.theme.textMuted, _$p));
644
- return _el$27;
574
+ var _el$21 = _$createElement("text");
575
+ _$insertNode(_el$21, _$createTextNode(`→ fallback advised`));
576
+ _$effect(_$p => _$setProp(_el$21, "fg", props.theme.textMuted, _$p));
577
+ return _el$21;
645
578
  }
646
579
  })];
647
580
  }
648
581
  }), null);
649
582
  _$effect(_p$ => {
650
- var _v$13 = props.marginTop ?? 0,
651
- _v$14 = props.theme.text,
652
- _v$15 = toneColor(props.theme, statusTone());
653
- _v$13 !== _p$.e && (_p$.e = _$setProp(_el$19, "marginTop", _v$13, _p$.e));
654
- _v$14 !== _p$.t && (_p$.t = _$setProp(_el$21, "fg", _v$14, _p$.t));
655
- _v$15 !== _p$.a && (_p$.a = _$setProp(_el$23, "fg", _v$15, _p$.a));
583
+ var _v$7 = props.marginTop ?? 0,
584
+ _v$8 = props.theme.text,
585
+ _v$9 = toneColor(props.theme, statusTone());
586
+ _v$7 !== _p$.e && (_p$.e = _$setProp(_el$13, "marginTop", _v$7, _p$.e));
587
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$15, "fg", _v$8, _p$.t));
588
+ _v$9 !== _p$.a && (_p$.a = _$setProp(_el$17, "fg", _v$9, _p$.a));
656
589
  return _p$;
657
590
  }, {
658
591
  e: undefined,
659
592
  t: undefined,
660
593
  a: undefined
661
594
  });
662
- return _el$19;
595
+ return _el$13;
596
+ })();
597
+ }
598
+ function AccountExtras(props) {
599
+ const [width, setWidth] = createSignal();
600
+ let block;
601
+ const budget = () => quotaWindowParts(quotaDisplayProjection(props.quota, props.now), {
602
+ now: props.now
603
+ }).windows.find(part => part.kind === 'budget');
604
+ return (() => {
605
+ var _el$27 = _$createElement("box");
606
+ _$use(element => {
607
+ block = element;
608
+ setWidth(element.width || undefined);
609
+ }, _el$27);
610
+ _$setProp(_el$27, "width", '100%');
611
+ _$setProp(_el$27, "flexDirection", 'column');
612
+ _$setProp(_el$27, "onSizeChange", () => setWidth(block?.width || undefined));
613
+ _$insert(_el$27, _$createComponent(Show, {
614
+ get when() {
615
+ return budget();
616
+ },
617
+ children: part => (() => {
618
+ var _el$28 = _$createElement("box"),
619
+ _el$29 = _$createElement("text");
620
+ _$insertNode(_el$28, _el$29);
621
+ _$setProp(_el$28, "width", '100%');
622
+ _$setProp(_el$28, "height", 1);
623
+ _$setProp(_el$28, "flexDirection", 'row');
624
+ _$setProp(_el$29, "wrapMode", 'none');
625
+ _$insert(_el$29, () => creditLine(part().figure, props.quota?.extraUsage, width()));
626
+ _$effect(_$p => _$setProp(_el$29, "fg", toneColor(props.theme, props.quota?.extraUsage?.severity === 'critical' ? 'err' : props.quota?.extraUsage?.severity === 'warning' || props.quota?.extraUsage?.exhausted ? 'warn' : 'muted'), _$p));
627
+ return _el$28;
628
+ })()
629
+ }), null);
630
+ _$insert(_el$27, _$createComponent(Show, {
631
+ get when() {
632
+ return props.quota?.fallbackAdvised === true;
633
+ },
634
+ get children() {
635
+ return _$createComponent(SidebarTextRow, {
636
+ text: "\u2192 fallback advised"
637
+ });
638
+ }
639
+ }), null);
640
+ return _el$27;
663
641
  })();
664
642
  }
665
643
  // The TUI may unmount and remount sidebar_content when the user switches
@@ -733,12 +711,6 @@ export function ClaudeSidebar(props) {
733
711
  });
734
712
  const enabledFallbacks = () => (state().fallbacks ?? []).filter(f => f.enabled || f.custodyState && f.custodyState !== 'off');
735
713
  const hasData = () => state().main?.quota != null || state().main?.stateLine != null || enabledFallbacks().length > 0;
736
- // One label column for every expanded account, so all their bars line up.
737
- const quotaLabelWidth = () => quotaLabelColumnWidth([state().main?.quota, ...(prefs().sections.fallbackAccounts ? enabledFallbacks().map(fallback => fallback.quota) : [])], now());
738
- const headerLabel = () => {
739
- const name = prefs().header.label;
740
- return !hasData() ? name : collapsed() ? `\u25b6 ${name}` : `\u25bc ${name}`;
741
- };
742
714
  const activeAccount = () => resolveActiveAccount(state());
743
715
  const activeQuotaSummary = () => getCollapsedQuotaSummary(activeAccount().quota, now());
744
716
  const activePacingDeficit = () => {
@@ -776,420 +748,354 @@ export function ClaudeSidebar(props) {
776
748
  if (!r) return '\u2014';
777
749
  return `${r.transport} \u00b7 ${r.enabled ? 'on' : 'off'}`;
778
750
  };
779
- return (() => {
780
- var _el$33 = _$createElement("box"),
781
- _el$34 = _$createElement("box"),
782
- _el$35 = _$createElement("box"),
783
- _el$36 = _$createElement("text"),
784
- _el$37 = _$createElement("b");
785
- _$insertNode(_el$33, _el$34);
786
- _$setProp(_el$33, "width", '100%');
787
- _$setProp(_el$33, "flexDirection", 'column');
788
- _$insertNode(_el$34, _el$35);
789
- _$setProp(_el$34, "width", '100%');
790
- _$setProp(_el$34, "flexDirection", 'row');
791
- _$setProp(_el$34, "justifyContent", 'space-between');
792
- _$setProp(_el$34, "alignItems", 'center');
793
- _$setProp(_el$34, "onMouseDown", () => {
794
- if (hasData()) props.controller.toggleCollapsed();
751
+ const accountDetail = id => id === 'main' ? state().main : state().fallbacks?.find(account => account.id === id);
752
+ const accountViews = createMemo(() => {
753
+ if (!hasData()) return [];
754
+ return getCollapsedAccounts(state(), prefs().sections.fallbackAccounts).map(account => {
755
+ const detail = accountDetail(account.id);
756
+ const quota = quotaDisplayProjection(account.quota, now());
757
+ const needsReauth = detail && 'needsReauth' in detail && detail.needsReauth;
758
+ const vaultReauth = detail && 'vaultReauth' in detail && detail.vaultReauth;
759
+ const active = state().activeId === account.id;
760
+ const status = account.quotaDated && account.quota ? 'dated' : needsReauth ? 're-login' : vaultReauth ? 'needs sign-in in the vault' : active ? 'active' : 'idle';
761
+ const groups = [{
762
+ rows: quotaWindowParts(quota, {
763
+ now: now()
764
+ }).windows.filter(part => part.kind === 'window').map(part => {
765
+ const scoped = account.quota?.scoped?.find(window => window.title === part.name);
766
+ const window = part.name === '5h' ? account.quota?.five_hour : part.name === '7d' ? account.quota?.seven_day : scoped;
767
+ const pacing = prefs().sections.pacing && !account.quotaDated && window ? computeQuotaPacing(window, part.name === '5h' ? FIVE_HOUR_MS : SEVEN_DAY_MS, now()) : null;
768
+ const text = fitPaceLine(pacing, undefined, pacing?.runsOutAt ? formatResetIn(pacing.runsOutAt, now()) : undefined, part.resetIn, part.remainingPercent);
769
+ const pace = pacing ? {
770
+ text: text ?? '',
771
+ tone: pacing.state === 'deficit' ? 'warning' : 'textMuted',
772
+ overlay: {
773
+ kind: pacing.deltaPercent > 0 ? 'deficit' : 'reserve',
774
+ percent: pacing.pacePercent
775
+ }
776
+ } : undefined;
777
+ const binding = account.quota?.bindingWindow === (part.name === '5h' ? 'five_hour' : part.name === '7d' ? 'seven_day' : scoped?.id);
778
+ return {
779
+ part: {
780
+ ...part,
781
+ name: part.short,
782
+ figure: `${part.figure}${binding ? ' •' : ''}`
783
+ },
784
+ pace
785
+ };
786
+ })
787
+ }];
788
+ return {
789
+ id: account.id,
790
+ label: account.name,
791
+ titleSuffix: detail?.tierLabel,
792
+ quota,
793
+ groups,
794
+ status: {
795
+ text: status,
796
+ tone: needsReauth || vaultReauth || detail?.stateLine ? 'warning' : active ? 'success' : 'textMuted'
797
+ },
798
+ blocked: Boolean(account.blocked),
799
+ indicatorTone: account.blocked ? 'warning' : account.active ? 'success' : 'textMuted',
800
+ collapsed: {
801
+ muted: Boolean(!account.active || account.quotaDated || getCollapsedQuotaSummary(account.quota, now()).stale),
802
+ quotaTone: sharedTone(activeQuotaTone())
803
+ },
804
+ emptyQuotaText: {
805
+ expanded: 'checking…',
806
+ collapsed: '—'
807
+ }
808
+ };
795
809
  });
796
- _$insertNode(_el$35, _el$36);
797
- _$setProp(_el$35, "paddingLeft", 1);
798
- _$setProp(_el$35, "paddingRight", 1);
799
- _$insertNode(_el$36, _el$37);
800
- _$insert(_el$37, headerLabel);
801
- _$insert(_el$34, _$createComponent(Show, {
810
+ });
811
+ // Polls rebuild snapshots, but account ids keep the shared frame's rows mounted.
812
+ const [accounts, setAccounts] = createStore([]);
813
+ createEffect(() => setAccounts(reconcile(accountViews(), {
814
+ key: 'id'
815
+ })));
816
+ return _$createComponent(SidebarFrame, {
817
+ get header() {
818
+ return {
819
+ badge: prefs().header.label,
820
+ version: prefs().header.showVersion && PLUGIN_VERSION !== '' ? `v${PLUGIN_VERSION}` : undefined
821
+ };
822
+ },
823
+ accounts: accounts,
824
+ get theme() {
825
+ return theme();
826
+ },
827
+ get appearance() {
828
+ return prefs().appearance;
829
+ },
830
+ get showQuota() {
831
+ return prefs().sections.quota;
832
+ },
833
+ get now() {
834
+ return now();
835
+ },
836
+ get collapsed() {
837
+ return collapsed();
838
+ },
839
+ get onToggle() {
840
+ return props.controller.toggleCollapsed;
841
+ },
842
+ beforeQuota: account => _$createComponent(Show, {
802
843
  get when() {
803
- return prefs().header.showVersion && PLUGIN_VERSION !== '';
844
+ return accountDetail(account.id)?.stateLine;
845
+ },
846
+ children: text => _$createComponent(SidebarTextRow, {
847
+ get text() {
848
+ return text();
849
+ }
850
+ })
851
+ }),
852
+ afterQuota: account => _$createComponent(AccountExtras, {
853
+ get quota() {
854
+ return accountDetail(account.id)?.quota ?? null;
855
+ },
856
+ get now() {
857
+ return now();
858
+ },
859
+ get theme() {
860
+ return theme();
861
+ }
862
+ }),
863
+ collapsedSections: () => [_$createComponent(Show, {
864
+ get when() {
865
+ return state().fastMode;
804
866
  },
805
867
  get children() {
806
- var _el$38 = _$createElement("text");
807
- _$insert(_el$38, `v${PLUGIN_VERSION}`);
808
- _$effect(_$p => _$setProp(_el$38, "fg", theme().textMuted, _$p));
809
- return _el$38;
868
+ return _$createComponent(CollapsedRow, {
869
+ get theme() {
870
+ return theme();
871
+ },
872
+ label: "Mode",
873
+ get children() {
874
+ var _el$30 = _$createElement("text"),
875
+ _el$31 = _$createElement("b");
876
+ _$insertNode(_el$30, _el$31);
877
+ _$insertNode(_el$31, _$createTextNode(`fast`));
878
+ _$effect(_$p => _$setProp(_el$30, "fg", toneColor(theme(), 'accent'), _$p));
879
+ return _el$30;
880
+ }
881
+ });
810
882
  }
811
- }), null);
812
- _$insert(_el$33, _$createComponent(Show, {
883
+ }), _$createComponent(Show, {
884
+ get when() {
885
+ return fableRecoverySummary();
886
+ },
887
+ children: summary => _$createComponent(CollapsedRow, {
888
+ get theme() {
889
+ return theme();
890
+ },
891
+ label: "Recovery",
892
+ get children() {
893
+ var _el$33 = _$createElement("text"),
894
+ _el$34 = _$createElement("b");
895
+ _$insertNode(_el$33, _el$34);
896
+ _$insert(_el$34, summary);
897
+ _$effect(_$p => _$setProp(_el$33, "fg", toneColor(theme(), fableRecoveryTone()), _$p));
898
+ return _el$33;
899
+ }
900
+ })
901
+ })],
902
+ sections: () => [_$createComponent(Show, {
813
903
  get when() {
814
- return _$memo(() => !!collapsed())() && hasData();
904
+ return !hasData();
815
905
  },
816
906
  get children() {
817
- return [_$createComponent(Index, {
818
- get each() {
819
- return getCollapsedAccounts(state(), prefs().sections.fallbackAccounts);
907
+ var _el$35 = _$createElement("box"),
908
+ _el$36 = _$createElement("text");
909
+ _$insertNode(_el$35, _el$36);
910
+ _$setProp(_el$35, "marginTop", 1);
911
+ _$setProp(_el$35, "width", '100%');
912
+ _$insertNode(_el$36, _$createTextNode(`Waiting for quota…`));
913
+ _$effect(_$p => _$setProp(_el$36, "fg", theme().textMuted, _$p));
914
+ return _el$35;
915
+ }
916
+ }), _$createComponent(Show, {
917
+ get when() {
918
+ return prefs().sections.routing;
919
+ },
920
+ get children() {
921
+ return [_$createComponent(SectionHeader, {
922
+ get theme() {
923
+ return theme();
820
924
  },
821
- children: account => _$createComponent(CollapsedAccountRow, {
822
- get theme() {
823
- return theme();
824
- },
825
- get account() {
826
- return account();
827
- },
828
- get tone() {
829
- return activeQuotaTone();
830
- },
831
- get now() {
832
- return now();
833
- }
834
- })
835
- }), _$createComponent(Show, {
836
- get when() {
837
- return state().fastMode;
925
+ title: "Routing"
926
+ }), _$createComponent(StatRow, {
927
+ get theme() {
928
+ return theme();
838
929
  },
839
- get children() {
840
- return _$createComponent(CollapsedRow, {
841
- get theme() {
842
- return theme();
843
- },
844
- label: "Mode",
845
- get children() {
846
- var _el$39 = _$createElement("text"),
847
- _el$40 = _$createElement("b");
848
- _$insertNode(_el$39, _el$40);
849
- _$insertNode(_el$40, _$createTextNode(`fast`));
850
- _$effect(_$p => _$setProp(_el$39, "fg", toneColor(theme(), 'accent'), _$p));
851
- return _el$39;
852
- }
853
- });
930
+ label: "Route",
931
+ get value() {
932
+ return state().route;
933
+ },
934
+ tone: "accent"
935
+ }), _$createComponent(StatRow, {
936
+ get theme() {
937
+ return theme();
938
+ },
939
+ label: "Mode",
940
+ get value() {
941
+ return state().fastMode ? 'fast' : 'std';
942
+ },
943
+ get tone() {
944
+ return state().fastMode ? 'accent' : 'muted';
854
945
  }
855
- }), _$createComponent(Show, {
856
- get when() {
857
- return fableRecoverySummary();
946
+ }), _$createComponent(StatRow, {
947
+ get theme() {
948
+ return theme();
858
949
  },
859
- children: summary => _$createComponent(CollapsedRow, {
860
- get theme() {
861
- return theme();
862
- },
863
- label: "Recovery",
864
- get children() {
865
- var _el$42 = _$createElement("text"),
866
- _el$43 = _$createElement("b");
867
- _$insertNode(_el$42, _el$43);
868
- _$insert(_el$43, summary);
869
- _$effect(_$p => _$setProp(_el$42, "fg", toneColor(theme(), fableRecoveryTone()), _$p));
870
- return _el$42;
871
- }
872
- })
950
+ label: "Relay",
951
+ get value() {
952
+ return relayValue();
953
+ },
954
+ get tone() {
955
+ return state().relay?.enabled ? 'ok' : 'muted';
956
+ }
873
957
  })];
874
958
  }
875
- }), null);
876
- _$insert(_el$33, _$createComponent(Show, {
959
+ }), _$createComponent(Show, {
877
960
  get when() {
878
- return !collapsed() || !hasData();
961
+ return fableRecoverySummary();
962
+ },
963
+ children: summary => _$createComponent(StatRow, {
964
+ get theme() {
965
+ return theme();
966
+ },
967
+ label: "Recovery",
968
+ get value() {
969
+ return summary();
970
+ },
971
+ get tone() {
972
+ return fableRecoveryTone();
973
+ }
974
+ })
975
+ }), _$createComponent(Show, {
976
+ get when() {
977
+ return showCache();
879
978
  },
880
979
  get children() {
881
- return [_$createComponent(Show, {
882
- get when() {
883
- return hasData();
980
+ return [_$createComponent(SectionHeader, {
981
+ get theme() {
982
+ return theme();
884
983
  },
885
- get fallback() {
886
- return (() => {
887
- var _el$44 = _$createElement("box"),
888
- _el$45 = _$createElement("text");
889
- _$insertNode(_el$44, _el$45);
890
- _$setProp(_el$44, "marginTop", 1);
891
- _$setProp(_el$44, "width", '100%');
892
- _$insertNode(_el$45, _$createTextNode(`Waiting for quota…`));
893
- _$effect(_$p => _$setProp(_el$45, "fg", theme().textMuted, _$p));
894
- return _el$44;
895
- })();
984
+ title: "Cache"
985
+ }), _$createComponent(StatRow, {
986
+ get theme() {
987
+ return theme();
896
988
  },
897
- get children() {
898
- return _$createComponent(Show, {
899
- get when() {
900
- return prefs().sections.quota;
901
- },
902
- get children() {
903
- return [_$createComponent(SectionHeader, {
904
- get theme() {
905
- return theme();
906
- },
907
- title: "Quota"
908
- }), _$createComponent(AccountBlock, {
909
- get theme() {
910
- return theme();
911
- },
912
- get appearance() {
913
- return prefs().appearance;
914
- },
915
- name: "main",
916
- get quota() {
917
- return state().main?.quota;
918
- },
919
- get active() {
920
- return state().activeId === 'main';
921
- },
922
- get pacingEnabled() {
923
- return prefs().sections.pacing;
924
- },
925
- get tierLabel() {
926
- return state().main?.tierLabel;
927
- },
928
- get labelWidth() {
929
- return quotaLabelWidth();
930
- },
931
- get stateLine() {
932
- return state().main?.stateLine;
933
- },
934
- get quotaDated() {
935
- return state().main?.quotaDated;
936
- },
937
- get now() {
938
- return now();
939
- }
940
- }), _$createComponent(Show, {
941
- get when() {
942
- return prefs().sections.fallbackAccounts;
943
- },
944
- get children() {
945
- return _$createComponent(For, {
946
- get each() {
947
- return enabledFallbacks();
948
- },
949
- children: fb => _$createComponent(AccountBlock, {
950
- get theme() {
951
- return theme();
952
- },
953
- get appearance() {
954
- return prefs().appearance;
955
- },
956
- get name() {
957
- return fb.label ?? fb.id;
958
- },
959
- get quota() {
960
- return fb.quota;
961
- },
962
- get active() {
963
- return state().activeId === fb.id;
964
- },
965
- get pacingEnabled() {
966
- return prefs().sections.pacing;
967
- },
968
- get tierLabel() {
969
- return fb.tierLabel;
970
- },
971
- get labelWidth() {
972
- return quotaLabelWidth();
973
- },
974
- get needsReauth() {
975
- return fb.needsReauth;
976
- },
977
- get vaultReauth() {
978
- return fb.vaultReauth;
979
- },
980
- get stateLine() {
981
- return fb.stateLine;
982
- },
983
- get quotaDated() {
984
- return fb.quotaDated;
985
- },
986
- marginTop: 1,
987
- get now() {
988
- return now();
989
- }
990
- })
991
- });
992
- }
993
- })];
994
- }
995
- });
989
+ label: "1h cache",
990
+ get value() {
991
+ return `${cacheKeep()?.window} \u00b7 ${cacheKeep()?.enabled ? 'on' : 'off'}`;
992
+ },
993
+ get tone() {
994
+ return cacheKeep()?.enabled ? 'ok' : 'muted';
996
995
  }
997
996
  }), _$createComponent(Show, {
998
997
  get when() {
999
- return prefs().sections.routing;
998
+ return (cacheKeep()?.trackedSessions ?? 0) > 0;
1000
999
  },
1001
1000
  get children() {
1002
- return [_$createComponent(SectionHeader, {
1003
- get theme() {
1004
- return theme();
1005
- },
1006
- title: "Routing"
1007
- }), _$createComponent(StatRow, {
1008
- get theme() {
1009
- return theme();
1010
- },
1011
- label: "Route",
1012
- get value() {
1013
- return state().route;
1014
- },
1015
- tone: "accent"
1016
- }), _$createComponent(StatRow, {
1001
+ return _$createComponent(StatRow, {
1017
1002
  get theme() {
1018
1003
  return theme();
1019
1004
  },
1020
- label: "Mode",
1005
+ label: "Tracked",
1021
1006
  get value() {
1022
- return state().fastMode ? 'fast' : 'std';
1007
+ return String(cacheKeep()?.trackedSessions);
1023
1008
  },
1024
- get tone() {
1025
- return state().fastMode ? 'accent' : 'muted';
1026
- }
1027
- }), _$createComponent(StatRow, {
1028
- get theme() {
1029
- return theme();
1030
- },
1031
- label: "Relay",
1032
- get value() {
1033
- return relayValue();
1034
- },
1035
- get tone() {
1036
- return state().relay?.enabled ? 'ok' : 'muted';
1037
- }
1038
- })];
1009
+ tone: "text"
1010
+ });
1039
1011
  }
1040
- }), _$createComponent(Show, {
1041
- get when() {
1042
- return fableRecoverySummary();
1012
+ })];
1013
+ }
1014
+ }), _$createComponent(Show, {
1015
+ get when() {
1016
+ return showPrime();
1017
+ },
1018
+ get children() {
1019
+ return [_$createComponent(StatRow, {
1020
+ get theme() {
1021
+ return theme();
1043
1022
  },
1044
- children: summary => _$createComponent(StatRow, {
1045
- get theme() {
1046
- return theme();
1047
- },
1048
- label: "Recovery",
1049
- get value() {
1050
- return summary();
1051
- },
1052
- get tone() {
1053
- return fableRecoveryTone();
1054
- }
1055
- })
1056
- }), _$createComponent(Show, {
1057
- get when() {
1058
- return showCache();
1023
+ label: "Prime",
1024
+ get value() {
1025
+ return primeHasError() ? 'err' : 'on';
1059
1026
  },
1060
- get children() {
1061
- return [_$createComponent(SectionHeader, {
1027
+ get tone() {
1028
+ return primeHasError() ? 'warn' : 'ok';
1029
+ }
1030
+ }), _$createComponent(For, {
1031
+ get each() {
1032
+ return prime()?.accounts ?? [];
1033
+ },
1034
+ children: account => {
1035
+ const value = () => formatPrimeAccountValue(account, now());
1036
+ return _$createComponent(StatRow, {
1062
1037
  get theme() {
1063
1038
  return theme();
1064
1039
  },
1065
- title: "Cache"
1066
- }), _$createComponent(StatRow, {
1067
- get theme() {
1068
- return theme();
1040
+ get label() {
1041
+ return account.label;
1069
1042
  },
1070
- label: "1h cache",
1071
1043
  get value() {
1072
- return `${cacheKeep()?.window} \u00b7 ${cacheKeep()?.enabled ? 'on' : 'off'}`;
1044
+ return value().text;
1073
1045
  },
1074
1046
  get tone() {
1075
- return cacheKeep()?.enabled ? 'ok' : 'muted';
1047
+ return value().hasError ? 'warn' : 'text';
1076
1048
  }
1077
- }), _$createComponent(Show, {
1078
- get when() {
1079
- return (cacheKeep()?.trackedSessions ?? 0) > 0;
1080
- },
1081
- get children() {
1082
- return _$createComponent(StatRow, {
1083
- get theme() {
1084
- return theme();
1085
- },
1086
- label: "Tracked",
1087
- get value() {
1088
- return String(cacheKeep()?.trackedSessions);
1089
- },
1090
- tone: "text"
1091
- });
1092
- }
1093
- })];
1049
+ });
1094
1050
  }
1051
+ })];
1052
+ }
1053
+ }), _$createComponent(Show, {
1054
+ get when() {
1055
+ return _$memo(() => !!degraded())() && prefs().sections.health;
1056
+ },
1057
+ get children() {
1058
+ return [_$createComponent(SectionHeader, {
1059
+ get theme() {
1060
+ return theme();
1061
+ },
1062
+ title: "Health"
1095
1063
  }), _$createComponent(Show, {
1096
1064
  get when() {
1097
- return showPrime();
1065
+ return quotaBackedOff();
1098
1066
  },
1099
1067
  get children() {
1100
- return [_$createComponent(StatRow, {
1068
+ return _$createComponent(StatRow, {
1101
1069
  get theme() {
1102
1070
  return theme();
1103
1071
  },
1104
- label: "Prime",
1072
+ label: "Quota API",
1105
1073
  get value() {
1106
- return primeHasError() ? 'err' : 'on';
1074
+ return `backoff ${formatUntil(state().main?.quotaBackoffUntil, now())}`;
1107
1075
  },
1108
- get tone() {
1109
- return primeHasError() ? 'warn' : 'ok';
1110
- }
1111
- }), _$createComponent(For, {
1112
- get each() {
1113
- return prime()?.accounts ?? [];
1114
- },
1115
- children: account => {
1116
- const value = () => formatPrimeAccountValue(account, now());
1117
- return _$createComponent(StatRow, {
1118
- get theme() {
1119
- return theme();
1120
- },
1121
- get label() {
1122
- return account.label;
1123
- },
1124
- get value() {
1125
- return value().text;
1126
- },
1127
- get tone() {
1128
- return value().hasError ? 'warn' : 'text';
1129
- }
1130
- });
1131
- }
1132
- })];
1076
+ tone: "warn"
1077
+ });
1133
1078
  }
1134
1079
  }), _$createComponent(Show, {
1135
1080
  get when() {
1136
- return _$memo(() => !!degraded())() && prefs().sections.health;
1081
+ return refreshBackedOff();
1137
1082
  },
1138
1083
  get children() {
1139
- return [_$createComponent(SectionHeader, {
1084
+ return _$createComponent(StatRow, {
1140
1085
  get theme() {
1141
1086
  return theme();
1142
1087
  },
1143
- title: "Health"
1144
- }), _$createComponent(Show, {
1145
- get when() {
1146
- return quotaBackedOff();
1147
- },
1148
- get children() {
1149
- return _$createComponent(StatRow, {
1150
- get theme() {
1151
- return theme();
1152
- },
1153
- label: "Quota API",
1154
- get value() {
1155
- return `backoff ${formatUntil(state().main?.quotaBackoffUntil, now())}`;
1156
- },
1157
- tone: "warn"
1158
- });
1159
- }
1160
- }), _$createComponent(Show, {
1161
- get when() {
1162
- return refreshBackedOff();
1088
+ label: "Token refresh",
1089
+ get value() {
1090
+ return `backoff ${formatUntil(state().main?.refreshBackoffUntil, now())}`;
1163
1091
  },
1164
- get children() {
1165
- return _$createComponent(StatRow, {
1166
- get theme() {
1167
- return theme();
1168
- },
1169
- label: "Token refresh",
1170
- get value() {
1171
- return `backoff ${formatUntil(state().main?.refreshBackoffUntil, now())}`;
1172
- },
1173
- tone: "warn"
1174
- });
1175
- }
1176
- })];
1092
+ tone: "warn"
1093
+ });
1177
1094
  }
1178
1095
  })];
1179
1096
  }
1180
- }), null);
1181
- _$effect(_p$ => {
1182
- var _v$16 = theme().accent,
1183
- _v$17 = theme().background;
1184
- _v$16 !== _p$.e && (_p$.e = _$setProp(_el$35, "backgroundColor", _v$16, _p$.e));
1185
- _v$17 !== _p$.t && (_p$.t = _$setProp(_el$36, "fg", _v$17, _p$.t));
1186
- return _p$;
1187
- }, {
1188
- e: undefined,
1189
- t: undefined
1190
- });
1191
- return _el$33;
1192
- })();
1097
+ })]
1098
+ });
1193
1099
  }
1194
1100
 
1195
1101
  // --- OpenCode 2 -------------------------------------------------------------