@cortexkit/opencode-openai-auth 0.8.0 → 0.9.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 (40) hide show
  1. package/README.md +1 -1
  2. package/dist/{index-3w4vmckx.js → index-4effjmr6.js} +2 -2
  3. package/dist/{index-507jh8bv.js → index-9ehhb051.js} +1 -1
  4. package/dist/index-g3hsdjh4.js +2 -0
  5. package/dist/index-hh52v8sb.js +2 -0
  6. package/dist/{index-944gsj1s.js → index-jwn4r3sw.js} +1 -1
  7. package/dist/{index-02h7g5f9.js → index-sdt2d2ra.js} +1 -1
  8. package/dist/index-sq36b120.js +211 -0
  9. package/dist/index.d.ts +172 -341
  10. package/dist/index.js +65 -65
  11. package/dist/internal-BTndPmW2.d.ts +914 -0
  12. package/dist/quota-normalize-08hpp51v.js +1 -0
  13. package/dist/rpc/port-file.js +1 -1
  14. package/dist/rpc/protocol.d.ts +1 -1
  15. package/dist/rpc/rpc-client.d.ts +2 -1
  16. package/dist/rpc/rpc-client.js +1 -1
  17. package/dist/rpc/rpc-dir.js +1 -1
  18. package/dist/sidebar-state-CoKYKcLn.d.ts +220 -0
  19. package/dist/sidebar-state.d.ts +2 -172
  20. package/dist/sidebar-state.js +1 -1
  21. package/dist/{token-jdvpwk60.js → token-9823y0pc.js} +1 -1
  22. package/dist/token-util-ypgz7rge.js +1 -0
  23. package/dist/tui-preferences.js +1 -1
  24. package/dist/tui.d.ts +27 -5
  25. package/package.json +3 -2
  26. package/src/tui-compiled/raw/core-custody-state.ts +243 -0
  27. package/src/tui-compiled/raw/sidebar-state.ts +168 -12
  28. package/src/tui-compiled/raw/tui-command-dialogs.tsx +89 -39
  29. package/src/tui-compiled/raw/tui.tsx +138 -18
  30. package/src/tui-compiled/runtime/core-custody-state.ts +243 -0
  31. package/src/tui-compiled/runtime/sidebar-state.ts +168 -12
  32. package/src/tui-compiled/runtime/tui-command-dialogs.tsx +70 -33
  33. package/src/tui-compiled/runtime/tui.tsx +241 -143
  34. package/src/tui-compiled/shared/logger.ts +9 -2
  35. package/dist/index-2xppkvkx.js +0 -2
  36. package/dist/index-nshbgkz1.js +0 -198
  37. package/dist/index-xyg86jgt.js +0 -2
  38. package/dist/protocol-Cv9ZmU0p.d.ts +0 -24
  39. package/dist/quota-normalize-wap0rne8.js +0 -1
  40. package/dist/token-util-zzm7paz9.js +0 -1
@@ -207,15 +207,72 @@ function CollapsedRow(props) {
207
207
  return _el$8;
208
208
  })();
209
209
  }
210
+ const SPEND_CONTROL_LABEL = 'credits';
211
+
212
+ // Labels a quota snapshot contributes to the sidebar, independent of pacing or
213
+ // the wall clock — the label column is sized from these alone.
214
+ function quotaRowLabels(quota) {
215
+ const labels = getPresentQuotaWindows(quota).map(row => row.label);
216
+ if (quota?.spendControl) labels.push(SPEND_CONTROL_LABEL);
217
+ return labels;
218
+ }
219
+
220
+ // The label column is a property of the whole sidebar, not of one account's row
221
+ // set: every account's bars must start at the same column, so the width is
222
+ // derived once from every account rendered (main plus fallbacks) and threaded
223
+ // into each account's rows. The +1 keeps a separator before the longest label's
224
+ // bar; 3 is the floor the short 5h/7d labels already relied on.
225
+ /**
226
+ * Every quota the sidebar will draw, in one list.
227
+ *
228
+ * The label column is shared by all of them, so the width has to be measured
229
+ * over this exact set — measuring a subset is what made stacked accounts
230
+ * disagree about where the bar starts. Named rather than inlined at each call
231
+ * site because the set is the part that can be got wrong, and a call site
232
+ * cannot be tested without the host's rendering runtime.
233
+ */
234
+ export function renderedQuotas(state) {
235
+ return [state.main?.quota ?? null, ...(state.fallbacks ?? []).filter(fallback => fallback.enabled).map(fallback => fallback.quota)];
236
+ }
237
+ export function computeQuotaLabelWidth(quotas) {
238
+ let width = 3;
239
+ for (const quota of quotas) {
240
+ for (const label of quotaRowLabels(quota ?? null)) {
241
+ width = Math.max(width, label.length + 1);
242
+ }
243
+ }
244
+ return width;
245
+ }
246
+
210
247
  // Maps present quota windows onto display rows and computes pacing against each
211
248
  // dynamic duration or the historical 5h/7d duration for legacy snapshots.
212
- export function buildQuotaRowsForDisplay(quota, now, pacingEnabled) {
213
- return getPresentQuotaWindows(quota).map(row => ({
249
+ // `labelWidth` comes from computeQuotaLabelWidth for rendered sidebars; callers
250
+ // that only inspect pacing may omit it and get this row set's own width.
251
+ export function buildQuotaRowsForDisplay(quota, now, pacingEnabled, labelWidth) {
252
+ const rows = getPresentQuotaWindows(quota).map(row => ({
214
253
  key: row.key,
215
254
  label: row.label,
216
255
  window: row.window,
217
256
  pacing: pacingEnabled && row.windowMs !== null ? computeQuotaPacing(row.window, row.windowMs, now) : null
218
257
  }));
258
+ const spendControl = quota?.spendControl;
259
+ if (spendControl) {
260
+ rows.push({
261
+ key: 'spendControl',
262
+ label: SPEND_CONTROL_LABEL,
263
+ window: {
264
+ usedPercent: spendControl.usedPercent,
265
+ remainingPercent: spendControl.remainingPercent,
266
+ resetsAt: spendControl.resetsAt
267
+ },
268
+ pacing: null
269
+ });
270
+ }
271
+ const width = labelWidth ?? Math.max(3, ...rows.map(row => row.label.length + 1));
272
+ return rows.map(row => ({
273
+ ...row,
274
+ labelWidth: width
275
+ }));
219
276
  }
220
277
  export function isQuotaLoaded(quota) {
221
278
  return quota !== null;
@@ -234,11 +291,35 @@ export function getQuotaMetadataRows(state) {
234
291
  }
235
292
  return rows;
236
293
  }
237
- export function getAccountMetadataRows(resetCredits) {
238
- return resetCredits === undefined ? [] : [{
239
- label: 'resets',
240
- value: String(resetCredits)
241
- }];
294
+ function formatGroupedAmount(value) {
295
+ return Math.round(value).toLocaleString('en-US');
296
+ }
297
+
298
+ // The unit names the budget the amounts are counted in, so it agrees with the
299
+ // total rather than staying singular against a plural quantity.
300
+ function pluralizeUnit(unit, count) {
301
+ if (count === 1) return unit;
302
+ return unit.endsWith('s') ? unit : `${unit}s`;
303
+ }
304
+ export function formatSpendControlAmounts(spendControl) {
305
+ const unit = pluralizeUnit(spendControl.unit ?? 'unit', spendControl.limit);
306
+ return `${formatGroupedAmount(spendControl.used)} / ${formatGroupedAmount(spendControl.limit)} ${unit}`;
307
+ }
308
+ export function getAccountMetadataRows(resetCredits, spendControl) {
309
+ const rows = [];
310
+ if (spendControl) {
311
+ rows.push({
312
+ label: 'credits',
313
+ value: formatSpendControlAmounts(spendControl)
314
+ });
315
+ }
316
+ if (resetCredits !== undefined) {
317
+ rows.push({
318
+ label: 'resets',
319
+ value: String(resetCredits)
320
+ });
321
+ }
322
+ return rows;
242
323
  }
243
324
 
244
325
  // Quota window row: muted label left, tone-colored bar + percentage right,
@@ -261,26 +342,26 @@ function QuotaRow(props) {
261
342
  },
262
343
  get fallback() {
263
344
  return (() => {
264
- var _el$17 = _$createElement("box"),
265
- _el$18 = _$createElement("text"),
266
- _el$19 = _$createElement("text");
267
- _$insertNode(_el$17, _el$18);
268
- _$insertNode(_el$17, _el$19);
269
- _$setProp(_el$17, "width", '100%');
270
- _$setProp(_el$17, "flexDirection", 'row');
271
- _$insert(_el$18, () => props.label.padEnd(3));
272
- _$insertNode(_el$19, _$createTextNode(`—`));
345
+ var _el$16 = _$createElement("box"),
346
+ _el$17 = _$createElement("text"),
347
+ _el$18 = _$createElement("text");
348
+ _$insertNode(_el$16, _el$17);
349
+ _$insertNode(_el$16, _el$18);
350
+ _$setProp(_el$16, "width", '100%');
351
+ _$setProp(_el$16, "flexDirection", 'row');
352
+ _$insert(_el$17, () => props.label.padEnd(props.labelWidth));
353
+ _$insertNode(_el$18, _$createTextNode(`—`));
273
354
  _$effect(_p$ => {
274
355
  var _v$9 = props.theme.textMuted,
275
356
  _v$0 = props.theme.textMuted;
276
- _v$9 !== _p$.e && (_p$.e = _$setProp(_el$18, "fg", _v$9, _p$.e));
277
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$19, "fg", _v$0, _p$.t));
357
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$17, "fg", _v$9, _p$.e));
358
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$18, "fg", _v$0, _p$.t));
278
359
  return _p$;
279
360
  }, {
280
361
  e: undefined,
281
362
  t: undefined
282
363
  });
283
- return _el$17;
364
+ return _el$16;
284
365
  })();
285
366
  },
286
367
  get children() {
@@ -296,16 +377,16 @@ function QuotaRow(props) {
296
377
  _$insertNode(_el$1, _el$10);
297
378
  _$insertNode(_el$1, _el$11);
298
379
  _$setProp(_el$1, "flexDirection", 'row');
299
- _$insert(_el$10, () => props.label.padEnd(3));
380
+ _$insert(_el$10, () => props.label.padEnd(props.labelWidth));
300
381
  _$insert(_el$1, _$createComponent(For, {
301
382
  get each() {
302
383
  return quotaBarSegments(used(), props.appearance, props.pacing);
303
384
  },
304
385
  children: segment => (() => {
305
- var _el$21 = _$createElement("text");
306
- _$insert(_el$21, () => segment.text);
307
- _$effect(_$p => _$setProp(_el$21, "fg", toneColor(props.theme, segment.tone), _$p));
308
- return _el$21;
386
+ var _el$20 = _$createElement("text");
387
+ _$insert(_el$20, () => segment.text);
388
+ _$effect(_$p => _$setProp(_el$20, "fg", toneColor(props.theme, segment.tone), _$p));
389
+ return _el$20;
309
390
  })()
310
391
  }), _el$11);
311
392
  _$insert(_el$11, () => ` ${String(Math.round(used())).padStart(3)}%`);
@@ -338,18 +419,18 @@ function QuotaRow(props) {
338
419
  get children() {
339
420
  var _el$13 = _$createElement("box"),
340
421
  _el$14 = _$createElement("text"),
341
- _el$16 = _$createElement("text");
422
+ _el$15 = _$createElement("text");
342
423
  _$insertNode(_el$13, _el$14);
343
- _$insertNode(_el$13, _el$16);
424
+ _$insertNode(_el$13, _el$15);
344
425
  _$setProp(_el$13, "width", '100%');
345
426
  _$setProp(_el$13, "flexDirection", 'row');
346
- _$insertNode(_el$14, _$createTextNode(` `));
347
- _$insert(_el$16, paceLine);
427
+ _$insert(_el$14, () => ''.padEnd(props.labelWidth));
428
+ _$insert(_el$15, paceLine);
348
429
  _$effect(_p$ => {
349
430
  var _v$7 = props.theme.textMuted,
350
431
  _v$8 = toneColor(props.theme, props.pacing?.state === 'deficit' ? 'warn' : 'muted');
351
432
  _v$7 !== _p$.e && (_p$.e = _$setProp(_el$14, "fg", _v$7, _p$.e));
352
- _v$8 !== _p$.t && (_p$.t = _$setProp(_el$16, "fg", _v$8, _p$.t));
433
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$15, "fg", _v$8, _p$.t));
353
434
  return _p$;
354
435
  }, {
355
436
  e: undefined,
@@ -368,36 +449,36 @@ function QuotaRow(props) {
368
449
  function AccountBlock(props) {
369
450
  const statusWord = () => props.killed ? 'blocked' : props.active ? 'active' : 'idle';
370
451
  const statusTone = () => props.killed ? 'err' : props.active ? 'ok' : 'muted';
371
- const rows = () => buildQuotaRowsForDisplay(props.quota, Date.now(), props.pacingEnabled);
452
+ const rows = () => buildQuotaRowsForDisplay(props.quota, Date.now(), props.pacingEnabled, props.labelWidth);
372
453
  return (() => {
373
- var _el$22 = _$createElement("box"),
374
- _el$23 = _$createElement("box"),
375
- _el$24 = _$createElement("text"),
376
- _el$25 = _$createElement("b"),
377
- _el$26 = _$createElement("text"),
378
- _el$27 = _$createElement("b");
454
+ var _el$21 = _$createElement("box"),
455
+ _el$22 = _$createElement("box"),
456
+ _el$23 = _$createElement("text"),
457
+ _el$24 = _$createElement("b"),
458
+ _el$25 = _$createElement("text"),
459
+ _el$26 = _$createElement("b");
460
+ _$insertNode(_el$21, _el$22);
461
+ _$setProp(_el$21, "width", '100%');
462
+ _$setProp(_el$21, "flexDirection", 'column');
379
463
  _$insertNode(_el$22, _el$23);
464
+ _$insertNode(_el$22, _el$25);
380
465
  _$setProp(_el$22, "width", '100%');
381
- _$setProp(_el$22, "flexDirection", 'column');
466
+ _$setProp(_el$22, "flexDirection", 'row');
467
+ _$setProp(_el$22, "justifyContent", 'space-between');
382
468
  _$insertNode(_el$23, _el$24);
383
- _$insertNode(_el$23, _el$26);
384
- _$setProp(_el$23, "width", '100%');
385
- _$setProp(_el$23, "flexDirection", 'row');
386
- _$setProp(_el$23, "justifyContent", 'space-between');
387
- _$insertNode(_el$24, _el$25);
388
- _$insert(_el$25, () => props.name);
389
- _$insertNode(_el$26, _el$27);
390
- _$insert(_el$27, statusWord);
391
- _$insert(_el$22, _$createComponent(Show, {
469
+ _$insert(_el$24, () => props.name);
470
+ _$insertNode(_el$25, _el$26);
471
+ _$insert(_el$26, statusWord);
472
+ _$insert(_el$21, _$createComponent(Show, {
392
473
  get when() {
393
474
  return isQuotaLoaded(props.quota);
394
475
  },
395
476
  get fallback() {
396
477
  return (() => {
397
- var _el$28 = _$createElement("text");
398
- _$insertNode(_el$28, _$createTextNode(`checking…`));
399
- _$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
400
- return _el$28;
478
+ var _el$27 = _$createElement("text");
479
+ _$insertNode(_el$27, _$createTextNode(`checking…`));
480
+ _$effect(_$p => _$setProp(_el$27, "fg", props.theme.textMuted, _$p));
481
+ return _el$27;
401
482
  })();
402
483
  },
403
484
  get children() {
@@ -407,10 +488,10 @@ function AccountBlock(props) {
407
488
  },
408
489
  get fallback() {
409
490
  return (() => {
410
- var _el$30 = _$createElement("text");
411
- _$insertNode(_el$30, _$createTextNode(`—`));
412
- _$effect(_$p => _$setProp(_el$30, "fg", props.theme.textMuted, _$p));
413
- return _el$30;
491
+ var _el$29 = _$createElement("text");
492
+ _$insertNode(_el$29, _$createTextNode(`—`));
493
+ _$effect(_$p => _$setProp(_el$29, "fg", props.theme.textMuted, _$p));
494
+ return _el$29;
414
495
  })();
415
496
  },
416
497
  get children() {
@@ -428,6 +509,9 @@ function AccountBlock(props) {
428
509
  get label() {
429
510
  return row.label;
430
511
  },
512
+ get labelWidth() {
513
+ return row.labelWidth;
514
+ },
431
515
  get window() {
432
516
  return row.window;
433
517
  },
@@ -440,9 +524,9 @@ function AccountBlock(props) {
440
524
  });
441
525
  }
442
526
  }), null);
443
- _$insert(_el$22, _$createComponent(For, {
527
+ _$insert(_el$21, _$createComponent(For, {
444
528
  get each() {
445
- return getAccountMetadataRows(props.resetCredits);
529
+ return getAccountMetadataRows(props.resetCredits, props.quota?.spendControl);
446
530
  },
447
531
  children: row => _$createComponent(StatRow, {
448
532
  get theme() {
@@ -461,16 +545,16 @@ function AccountBlock(props) {
461
545
  var _v$1 = props.marginTop ?? 0,
462
546
  _v$10 = props.theme.text,
463
547
  _v$11 = toneColor(props.theme, statusTone());
464
- _v$1 !== _p$.e && (_p$.e = _$setProp(_el$22, "marginTop", _v$1, _p$.e));
465
- _v$10 !== _p$.t && (_p$.t = _$setProp(_el$24, "fg", _v$10, _p$.t));
466
- _v$11 !== _p$.a && (_p$.a = _$setProp(_el$26, "fg", _v$11, _p$.a));
548
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$21, "marginTop", _v$1, _p$.e));
549
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$23, "fg", _v$10, _p$.t));
550
+ _v$11 !== _p$.a && (_p$.a = _$setProp(_el$25, "fg", _v$11, _p$.a));
467
551
  return _p$;
468
552
  }, {
469
553
  e: undefined,
470
554
  t: undefined,
471
555
  a: undefined
472
556
  });
473
- return _el$22;
557
+ return _el$21;
474
558
  })();
475
559
  }
476
560
 
@@ -497,27 +581,28 @@ function QuotaDialogContent(props) {
497
581
  const theme = () => props.api.theme.current;
498
582
  const enabledFallbacks = () => (state().fallbacks ?? []).filter(f => f.enabled);
499
583
  const activeId = () => resolveQuotaDialogActiveId(state(), props.sessionId);
584
+ const quotaLabelWidth = () => computeQuotaLabelWidth(renderedQuotas(state()));
500
585
  return (() => {
501
- var _el$32 = _$createElement("box"),
586
+ var _el$31 = _$createElement("box"),
587
+ _el$32 = _$createElement("box"),
502
588
  _el$33 = _$createElement("box"),
503
- _el$34 = _$createElement("box"),
504
- _el$35 = _$createElement("text"),
505
- _el$36 = _$createElement("b");
589
+ _el$34 = _$createElement("text"),
590
+ _el$35 = _$createElement("b");
591
+ _$insertNode(_el$31, _el$32);
592
+ _$setProp(_el$31, "flexDirection", 'column');
593
+ _$setProp(_el$31, "padding", 2);
594
+ _$setProp(_el$31, "width", '100%');
595
+ _$setProp(_el$31, "alignItems", 'center');
506
596
  _$insertNode(_el$32, _el$33);
507
597
  _$setProp(_el$32, "flexDirection", 'column');
508
- _$setProp(_el$32, "padding", 2);
509
- _$setProp(_el$32, "width", '100%');
510
- _$setProp(_el$32, "alignItems", 'center');
598
+ _$setProp(_el$32, "width", 58);
511
599
  _$insertNode(_el$33, _el$34);
512
- _$setProp(_el$33, "flexDirection", 'column');
513
- _$setProp(_el$33, "width", 58);
600
+ _$setProp(_el$33, "width", '100%');
601
+ _$setProp(_el$33, "justifyContent", 'center');
602
+ _$setProp(_el$33, "marginBottom", 1);
514
603
  _$insertNode(_el$34, _el$35);
515
- _$setProp(_el$34, "width", '100%');
516
- _$setProp(_el$34, "justifyContent", 'center');
517
- _$setProp(_el$34, "marginBottom", 1);
518
- _$insertNode(_el$35, _el$36);
519
- _$insertNode(_el$36, _$createTextNode(`Codex Quota`));
520
- _$insert(_el$33, _$createComponent(AccountBlock, {
604
+ _$insertNode(_el$35, _$createTextNode(`Codex Quota`));
605
+ _$insert(_el$32, _$createComponent(AccountBlock, {
521
606
  get theme() {
522
607
  return theme();
523
608
  },
@@ -537,11 +622,14 @@ function QuotaDialogContent(props) {
537
622
  get pacingEnabled() {
538
623
  return prefs().sections.pacing;
539
624
  },
625
+ get labelWidth() {
626
+ return quotaLabelWidth();
627
+ },
540
628
  get resetCredits() {
541
629
  return state().main?.resetCredits;
542
630
  }
543
631
  }), null);
544
- _$insert(_el$33, _$createComponent(Show, {
632
+ _$insert(_el$32, _$createComponent(Show, {
545
633
  get when() {
546
634
  return prefs().sections.fallbackAccounts;
547
635
  },
@@ -572,6 +660,9 @@ function QuotaDialogContent(props) {
572
660
  get pacingEnabled() {
573
661
  return prefs().sections.pacing;
574
662
  },
663
+ get labelWidth() {
664
+ return quotaLabelWidth();
665
+ },
575
666
  get resetCredits() {
576
667
  return fb.resetCredits;
577
668
  },
@@ -580,8 +671,8 @@ function QuotaDialogContent(props) {
580
671
  });
581
672
  }
582
673
  }), null);
583
- _$effect(_$p => _$setProp(_el$35, "fg", theme().text, _$p));
584
- return _el$32;
674
+ _$effect(_$p => _$setProp(_el$34, "fg", theme().text, _$p));
675
+ return _el$31;
585
676
  })();
586
677
  }
587
678
 
@@ -710,6 +801,7 @@ function QuotaSidebar(props) {
710
801
  route: sessionRouting().route
711
802
  });
712
803
  const activeAccount = () => resolveActiveAccount(sessionState());
804
+ const quotaLabelWidth = () => computeQuotaLabelWidth(renderedQuotas(state()));
713
805
  const activeQuotaSummary = () => getCollapsedQuotaSummary(activeAccount().quota);
714
806
  const activePacingDeficit = () => {
715
807
  if (!prefs().sections.pacing) return false;
@@ -730,33 +822,33 @@ function QuotaSidebar(props) {
730
822
  const refreshBackedOff = () => state().main?.refreshBackedOff === true;
731
823
  const degraded = () => killedNames().length > 0 || quotaBackedOff() || refreshBackedOff();
732
824
  return (() => {
733
- var _el$38 = _$createElement("box"),
825
+ var _el$37 = _$createElement("box"),
826
+ _el$38 = _$createElement("box"),
734
827
  _el$39 = _$createElement("box"),
735
- _el$40 = _$createElement("box"),
736
- _el$41 = _$createElement("text"),
737
- _el$42 = _$createElement("b");
828
+ _el$40 = _$createElement("text"),
829
+ _el$41 = _$createElement("b");
830
+ _$insertNode(_el$37, _el$38);
831
+ _$setProp(_el$37, "width", '100%');
832
+ _$setProp(_el$37, "flexDirection", 'column');
833
+ _$setProp(_el$37, "border", SINGLE_BORDER);
834
+ _$setProp(_el$37, "paddingTop", 1);
835
+ _$setProp(_el$37, "paddingBottom", 1);
836
+ _$setProp(_el$37, "paddingLeft", 1);
837
+ _$setProp(_el$37, "paddingRight", 1);
738
838
  _$insertNode(_el$38, _el$39);
739
839
  _$setProp(_el$38, "width", '100%');
740
- _$setProp(_el$38, "flexDirection", 'column');
741
- _$setProp(_el$38, "border", SINGLE_BORDER);
742
- _$setProp(_el$38, "paddingTop", 1);
743
- _$setProp(_el$38, "paddingBottom", 1);
744
- _$setProp(_el$38, "paddingLeft", 1);
745
- _$setProp(_el$38, "paddingRight", 1);
746
- _$insertNode(_el$39, _el$40);
747
- _$setProp(_el$39, "width", '100%');
748
- _$setProp(_el$39, "flexDirection", 'row');
749
- _$setProp(_el$39, "justifyContent", 'space-between');
750
- _$setProp(_el$39, "alignItems", 'center');
751
- _$setProp(_el$39, "onMouseDown", () => {
840
+ _$setProp(_el$38, "flexDirection", 'row');
841
+ _$setProp(_el$38, "justifyContent", 'space-between');
842
+ _$setProp(_el$38, "alignItems", 'center');
843
+ _$setProp(_el$38, "onMouseDown", () => {
752
844
  if (hasData()) props.controller.toggleCollapsed();
753
845
  });
846
+ _$insertNode(_el$39, _el$40);
847
+ _$setProp(_el$39, "paddingLeft", 1);
848
+ _$setProp(_el$39, "paddingRight", 1);
754
849
  _$insertNode(_el$40, _el$41);
755
- _$setProp(_el$40, "paddingLeft", 1);
756
- _$setProp(_el$40, "paddingRight", 1);
757
- _$insertNode(_el$41, _el$42);
758
- _$insert(_el$42, headerLabel);
759
- _$insert(_el$39, _$createComponent(Show, {
850
+ _$insert(_el$41, headerLabel);
851
+ _$insert(_el$38, _$createComponent(Show, {
760
852
  get when() {
761
853
  return degraded();
762
854
  },
@@ -766,36 +858,36 @@ function QuotaSidebar(props) {
766
858
  return prefs().header.showVersion && PLUGIN_VERSION !== '';
767
859
  },
768
860
  get children() {
769
- var _el$51 = _$createElement("text");
770
- _$insert(_el$51, `v${PLUGIN_VERSION}`);
771
- _$effect(_$p => _$setProp(_el$51, "fg", theme().textMuted, _$p));
772
- return _el$51;
861
+ var _el$50 = _$createElement("text");
862
+ _$insert(_el$50, `v${PLUGIN_VERSION}`);
863
+ _$effect(_$p => _$setProp(_el$50, "fg", theme().textMuted, _$p));
864
+ return _el$50;
773
865
  }
774
866
  });
775
867
  },
776
868
  get children() {
777
- var _el$43 = _$createElement("box"),
778
- _el$44 = _$createElement("text"),
779
- _el$45 = _$createElement("b");
869
+ var _el$42 = _$createElement("box"),
870
+ _el$43 = _$createElement("text"),
871
+ _el$44 = _$createElement("b");
872
+ _$insertNode(_el$42, _el$43);
873
+ _$setProp(_el$42, "paddingLeft", 1);
874
+ _$setProp(_el$42, "paddingRight", 1);
780
875
  _$insertNode(_el$43, _el$44);
781
- _$setProp(_el$43, "paddingLeft", 1);
782
- _$setProp(_el$43, "paddingRight", 1);
783
- _$insertNode(_el$44, _el$45);
784
- _$insertNode(_el$45, _$createTextNode(`LIMITED`));
876
+ _$insertNode(_el$44, _$createTextNode(`LIMITED`));
785
877
  _$effect(_p$ => {
786
878
  var _v$12 = theme().warning,
787
879
  _v$13 = theme().background;
788
- _v$12 !== _p$.e && (_p$.e = _$setProp(_el$43, "backgroundColor", _v$12, _p$.e));
789
- _v$13 !== _p$.t && (_p$.t = _$setProp(_el$44, "fg", _v$13, _p$.t));
880
+ _v$12 !== _p$.e && (_p$.e = _$setProp(_el$42, "backgroundColor", _v$12, _p$.e));
881
+ _v$13 !== _p$.t && (_p$.t = _$setProp(_el$43, "fg", _v$13, _p$.t));
790
882
  return _p$;
791
883
  }, {
792
884
  e: undefined,
793
885
  t: undefined
794
886
  });
795
- return _el$43;
887
+ return _el$42;
796
888
  }
797
889
  }), null);
798
- _$insert(_el$38, _$createComponent(Show, {
890
+ _$insert(_el$37, _$createComponent(Show, {
799
891
  get when() {
800
892
  return _$memo(() => !!collapsed())() && hasData();
801
893
  },
@@ -814,41 +906,41 @@ function QuotaSidebar(props) {
814
906
  },
815
907
  get fallback() {
816
908
  return (() => {
817
- var _el$52 = _$createElement("text");
818
- _$insertNode(_el$52, _$createTextNode(`—`));
819
- _$effect(_$p => _$setProp(_el$52, "fg", theme().textMuted, _$p));
820
- return _el$52;
909
+ var _el$51 = _$createElement("text");
910
+ _$insertNode(_el$51, _$createTextNode(`—`));
911
+ _$effect(_$p => _$setProp(_el$51, "fg", theme().textMuted, _$p));
912
+ return _el$51;
821
913
  })();
822
914
  },
823
915
  get children() {
824
- var _el$47 = _$createElement("box"),
825
- _el$48 = _$createElement("text"),
826
- _el$49 = _$createElement("b"),
827
- _el$50 = _$createElement("text");
916
+ var _el$46 = _$createElement("box"),
917
+ _el$47 = _$createElement("text"),
918
+ _el$48 = _$createElement("b"),
919
+ _el$49 = _$createElement("text");
920
+ _$insertNode(_el$46, _el$47);
921
+ _$insertNode(_el$46, _el$49);
922
+ _$setProp(_el$46, "flexDirection", 'row');
828
923
  _$insertNode(_el$47, _el$48);
829
- _$insertNode(_el$47, _el$50);
830
- _$setProp(_el$47, "flexDirection", 'row');
831
- _$insertNode(_el$48, _el$49);
832
- _$insert(_el$49, () => activeQuotaSummary().text);
833
- _$insert(_el$50, () => activeAccount().killed ? ' \u2298' : ' \u25cf');
924
+ _$insert(_el$48, () => activeQuotaSummary().text);
925
+ _$insert(_el$49, () => activeAccount().killed ? ' \u2298' : ' \u25cf');
834
926
  _$effect(_p$ => {
835
927
  var _v$14 = toneColor(theme(), activeQuotaTone()),
836
928
  _v$15 = toneColor(theme(), activeAccount().killed ? 'err' : activeQuotaTone());
837
- _v$14 !== _p$.e && (_p$.e = _$setProp(_el$48, "fg", _v$14, _p$.e));
838
- _v$15 !== _p$.t && (_p$.t = _$setProp(_el$50, "fg", _v$15, _p$.t));
929
+ _v$14 !== _p$.e && (_p$.e = _$setProp(_el$47, "fg", _v$14, _p$.e));
930
+ _v$15 !== _p$.t && (_p$.t = _$setProp(_el$49, "fg", _v$15, _p$.t));
839
931
  return _p$;
840
932
  }, {
841
933
  e: undefined,
842
934
  t: undefined
843
935
  });
844
- return _el$47;
936
+ return _el$46;
845
937
  }
846
938
  });
847
939
  }
848
940
  });
849
941
  }
850
942
  }), null);
851
- _$insert(_el$38, _$createComponent(Show, {
943
+ _$insert(_el$37, _$createComponent(Show, {
852
944
  get when() {
853
945
  return !collapsed() || !hasData();
854
946
  },
@@ -859,14 +951,14 @@ function QuotaSidebar(props) {
859
951
  },
860
952
  get fallback() {
861
953
  return (() => {
862
- var _el$54 = _$createElement("box"),
863
- _el$55 = _$createElement("text");
864
- _$insertNode(_el$54, _el$55);
865
- _$setProp(_el$54, "marginTop", 1);
866
- _$setProp(_el$54, "width", '100%');
867
- _$insertNode(_el$55, _$createTextNode(`Waiting for quota…`));
868
- _$effect(_$p => _$setProp(_el$55, "fg", theme().textMuted, _$p));
869
- return _el$54;
954
+ var _el$53 = _$createElement("box"),
955
+ _el$54 = _$createElement("text");
956
+ _$insertNode(_el$53, _el$54);
957
+ _$setProp(_el$53, "marginTop", 1);
958
+ _$setProp(_el$53, "width", '100%');
959
+ _$insertNode(_el$54, _$createTextNode(`Waiting for quota…`));
960
+ _$effect(_$p => _$setProp(_el$54, "fg", theme().textMuted, _$p));
961
+ return _el$53;
870
962
  })();
871
963
  },
872
964
  get children() {
@@ -900,6 +992,9 @@ function QuotaSidebar(props) {
900
992
  get pacingEnabled() {
901
993
  return prefs().sections.pacing;
902
994
  },
995
+ get labelWidth() {
996
+ return quotaLabelWidth();
997
+ },
903
998
  get resetCredits() {
904
999
  return state().main?.resetCredits;
905
1000
  }
@@ -934,6 +1029,9 @@ function QuotaSidebar(props) {
934
1029
  get pacingEnabled() {
935
1030
  return prefs().sections.pacing;
936
1031
  },
1032
+ get labelWidth() {
1033
+ return quotaLabelWidth();
1034
+ },
937
1035
  get resetCredits() {
938
1036
  return fb.resetCredits;
939
1037
  },
@@ -1058,16 +1156,16 @@ function QuotaSidebar(props) {
1058
1156
  var _v$16 = theme().borderActive,
1059
1157
  _v$17 = theme().accent,
1060
1158
  _v$18 = theme().background;
1061
- _v$16 !== _p$.e && (_p$.e = _$setProp(_el$38, "borderColor", _v$16, _p$.e));
1062
- _v$17 !== _p$.t && (_p$.t = _$setProp(_el$40, "backgroundColor", _v$17, _p$.t));
1063
- _v$18 !== _p$.a && (_p$.a = _$setProp(_el$41, "fg", _v$18, _p$.a));
1159
+ _v$16 !== _p$.e && (_p$.e = _$setProp(_el$37, "borderColor", _v$16, _p$.e));
1160
+ _v$17 !== _p$.t && (_p$.t = _$setProp(_el$39, "backgroundColor", _v$17, _p$.t));
1161
+ _v$18 !== _p$.a && (_p$.a = _$setProp(_el$40, "fg", _v$18, _p$.a));
1064
1162
  return _p$;
1065
1163
  }, {
1066
1164
  e: undefined,
1067
1165
  t: undefined,
1068
1166
  a: undefined
1069
1167
  });
1070
- return _el$38;
1168
+ return _el$37;
1071
1169
  })();
1072
1170
  }
1073
1171
  const tui = async api => {
@@ -85,12 +85,19 @@ function isSecretKey(key: string): boolean {
85
85
  // needed for debugging — so it is intentionally NOT redacted by name. The genuine
86
86
  // ChatGPT id is kept out of logs at the source instead.
87
87
  if (k === 'chatgptaccountid') return true
88
+ // Operator identity carried on a served vault credential. These arrived with
89
+ // the client widening that added `accountId`/`email`/`orgName`/`projectId`;
90
+ // they are personal data with no diagnostic value, so they never reach a log
91
+ // file. The structural guard is not logging a served credential wholesale —
92
+ // this list only closes the fields that exist today.
93
+ if (k === 'email' || k === 'orgname' || k === 'organizationname') return true
88
94
  if (k.includes('apikey')) return true
89
95
  if (k.endsWith('secret') || k.endsWith('password')) return true
90
96
  if (k.endsWith('token') && !k.endsWith('tokens')) return true
91
97
  return false
92
98
  }
93
- const TOKEN_VALUE = /\b(Bearer\s+[\w.-]+|sk-[\w-]+|eyJ[\w.-]+)\b/g
99
+ const TOKEN_VALUE =
100
+ /\b(Bearer\s+[\w.-]+|sk-[\w-]+|eyJ[\w.-]+)\b|ckh_[A-Za-z0-9_-]{20,}/g
94
101
  export function redact(value: unknown): unknown {
95
102
  return redactInner(value, new WeakSet<object>())
96
103
  }
@@ -219,7 +226,7 @@ function emit(channel: string, level: Level, message: string, data?: unknown) {
219
226
  if (logFileSource === undefined) return
220
227
  if (ORDER[level] > ORDER[configuredLevel()]) return
221
228
  const line =
222
- `[${new Date().toISOString()}] ${level.toUpperCase()} [${channel}] ${message}` +
229
+ `[${new Date().toISOString()}] ${level.toUpperCase()} [${channel}] ${redactStrings(message)}` +
223
230
  (data === undefined ? '' : safeSerialize(data)) +
224
231
  '\n'
225
232
  buffer.push(line)