@cortexkit/opencode-openai-auth 1.0.5 → 1.1.0

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 (102) hide show
  1. package/dist/bin.js +9 -8
  2. package/dist/{pool-lifecycle-C_6YRmsh.d.ts → codex-request-BXDXToyt.d.ts} +158 -27
  3. package/dist/index-0yh85bwb.js +69 -0
  4. package/dist/{index-826s1yxa.js → index-4c8yw54k.js} +2 -2
  5. package/dist/{index-y4gxyxqd.js → index-7c6sxtd6.js} +2 -2
  6. package/dist/index-7eb3dw37.js +90 -0
  7. package/dist/index-8re8rprk.js +2 -0
  8. package/dist/{index-66asrje2.js → index-csky2xpg.js} +1 -1
  9. package/dist/index-edbdscy7.js +65 -0
  10. package/dist/{index-pg305s90.js → index-f2fmb596.js} +1 -1
  11. package/dist/{index-fsxbncpw.js → index-j8v2xwq6.js} +1 -1
  12. package/dist/{index-fsky1rsh.js → index-k6cydkgt.js} +2 -2
  13. package/dist/{index-116q849r.js → index-m5qmvr6c.js} +2 -2
  14. package/dist/index-msx2m78k.js +8 -0
  15. package/dist/{index-nx2qh047.js → index-zpm95mt5.js} +1 -1
  16. package/dist/index.d.ts +15 -7
  17. package/dist/index.js +1 -1
  18. package/dist/{map-m6f5a_IA.d.ts → map-Buq-GW7l.d.ts} +1 -1
  19. package/dist/{protocol-DctqemRI.d.ts → model-YRg7Uowo.d.ts} +67 -25
  20. package/dist/{port-file-ZPlxXB4G.d.ts → port-file-CxEpgSHY.d.ts} +1 -1
  21. package/dist/protocol-CDV1Pc6h.d.ts +29 -0
  22. package/dist/rpc/port-file.d.ts +1 -1
  23. package/dist/rpc/port-file.js +1 -1
  24. package/dist/rpc/protocol.d.ts +1 -1
  25. package/dist/rpc/protocol.js +1 -1
  26. package/dist/rpc/rpc-client.d.ts +3 -3
  27. package/dist/rpc/rpc-client.js +1 -1
  28. package/dist/rpc/rpc-dir.js +1 -1
  29. package/dist/{sidebar-state-z_M7Trnd.d.ts → sidebar-state-DjTWUbmf.d.ts} +15 -9
  30. package/dist/sidebar-state.d.ts +1 -1
  31. package/dist/sidebar-state.js +1 -1
  32. package/dist/{token-bzhkgc29.js → token-rz4t3ay6.js} +1 -1
  33. package/dist/token-util-tpy2c7h6.js +1 -0
  34. package/dist/tui-preferences.js +1 -1
  35. package/dist/tui.d.ts +20 -2
  36. package/dist/v2/server.d.ts +73 -1
  37. package/dist/v2/server.js +3 -3
  38. package/package.json +2 -2
  39. package/src/tui-compiled/raw/shared/0332701351b3eeec-format.js +13 -8
  40. package/src/tui-compiled/raw/shared/0f77ebc3c914c9c6-custody.js +354 -0
  41. package/src/tui-compiled/raw/shared/134b008900698fe0-backoff.js +92 -0
  42. package/src/tui-compiled/raw/shared/169b2b4bf30909bc-consumer.js +393 -0
  43. package/src/tui-compiled/raw/shared/2577ec69f9973ae9-quota-normalize.js +154 -0
  44. package/src/tui-compiled/raw/shared/2dce6e9613993329-quota-manager.js +473 -0
  45. package/src/tui-compiled/raw/shared/30f5bc480f31f51c-roster.js +566 -0
  46. package/src/tui-compiled/raw/shared/43fc9e6b994519c7-refresh-lock.js +0 -1
  47. package/src/tui-compiled/raw/shared/4593a4d71edf69fd-tombstone.js +25 -0
  48. package/src/tui-compiled/raw/shared/4d05c2d7a531aece-oauth.js +500 -0
  49. package/src/tui-compiled/raw/shared/6371b24a0573d79e-any-signal.js +42 -0
  50. package/src/tui-compiled/raw/shared/7c140680fc81be92-interlock.js +29 -0
  51. package/src/tui-compiled/raw/shared/85512cc5263ba259-provider.js +87 -0
  52. package/src/tui-compiled/raw/shared/abd062d633e29fd2-pool-routing.js +192 -0
  53. package/src/tui-compiled/raw/shared/b9588ad4725c1d10-enrollment.js +806 -0
  54. package/src/tui-compiled/raw/shared/bfbdd0f9aae56b47-pool-quota.js +85 -0
  55. package/src/tui-compiled/raw/shared/c852a15cfe489d12-pool.js +0 -1
  56. package/src/tui-compiled/raw/shared/ca0fccaba1d87af4-errors.js +8 -0
  57. package/src/tui-compiled/raw/shared/d0f0b6be200311af-insula.js +152 -0
  58. package/src/tui-compiled/raw/shared/d9d2892a4c371301-host-slot.js +72 -0
  59. package/src/tui-compiled/raw/shared/dbc61cd405941828-accounts.js +1470 -0
  60. package/src/tui-compiled/raw/shared/e8cd4929507508d8-refresh-file-lock.js +26 -12
  61. package/src/tui-compiled/raw/shared/e8d3c8da776ef9cd-index.js +24 -0
  62. package/src/tui-compiled/raw/sidebar-state.js +41 -14
  63. package/src/tui-compiled/raw/tui/command-dialogs.tsx +3 -34
  64. package/src/tui-compiled/raw/tui/section-text.js +21 -0
  65. package/src/tui-compiled/raw/tui/v2-dialog.js +137 -0
  66. package/src/tui-compiled/raw/tui/v2.tsx +133 -0
  67. package/src/tui-compiled/raw/tui.tsx +146 -40
  68. package/src/tui-compiled/runtime/shared/0332701351b3eeec-format.js +13 -8
  69. package/src/tui-compiled/runtime/shared/0f77ebc3c914c9c6-custody.js +354 -0
  70. package/src/tui-compiled/runtime/shared/134b008900698fe0-backoff.js +92 -0
  71. package/src/tui-compiled/runtime/shared/169b2b4bf30909bc-consumer.js +393 -0
  72. package/src/tui-compiled/runtime/shared/2577ec69f9973ae9-quota-normalize.js +154 -0
  73. package/src/tui-compiled/runtime/shared/2dce6e9613993329-quota-manager.js +473 -0
  74. package/src/tui-compiled/runtime/shared/30f5bc480f31f51c-roster.js +566 -0
  75. package/src/tui-compiled/runtime/shared/43fc9e6b994519c7-refresh-lock.js +0 -1
  76. package/src/tui-compiled/runtime/shared/4593a4d71edf69fd-tombstone.js +25 -0
  77. package/src/tui-compiled/runtime/shared/4d05c2d7a531aece-oauth.js +500 -0
  78. package/src/tui-compiled/runtime/shared/6371b24a0573d79e-any-signal.js +42 -0
  79. package/src/tui-compiled/runtime/shared/7c140680fc81be92-interlock.js +29 -0
  80. package/src/tui-compiled/runtime/shared/85512cc5263ba259-provider.js +87 -0
  81. package/src/tui-compiled/runtime/shared/abd062d633e29fd2-pool-routing.js +192 -0
  82. package/src/tui-compiled/runtime/shared/b9588ad4725c1d10-enrollment.js +806 -0
  83. package/src/tui-compiled/runtime/shared/bfbdd0f9aae56b47-pool-quota.js +85 -0
  84. package/src/tui-compiled/runtime/shared/c852a15cfe489d12-pool.js +0 -1
  85. package/src/tui-compiled/runtime/shared/ca0fccaba1d87af4-errors.js +8 -0
  86. package/src/tui-compiled/runtime/shared/d0f0b6be200311af-insula.js +152 -0
  87. package/src/tui-compiled/runtime/shared/d9d2892a4c371301-host-slot.js +72 -0
  88. package/src/tui-compiled/runtime/shared/dbc61cd405941828-accounts.js +1470 -0
  89. package/src/tui-compiled/runtime/shared/e8cd4929507508d8-refresh-file-lock.js +26 -12
  90. package/src/tui-compiled/runtime/shared/e8d3c8da776ef9cd-index.js +24 -0
  91. package/src/tui-compiled/runtime/sidebar-state.js +41 -14
  92. package/src/tui-compiled/runtime/tui/command-dialogs.js +3 -15
  93. package/src/tui-compiled/runtime/tui/section-text.js +21 -0
  94. package/src/tui-compiled/runtime/tui/v2-dialog.js +137 -0
  95. package/src/tui-compiled/runtime/tui/v2.js +95 -0
  96. package/src/tui-compiled/runtime/tui.js +255 -163
  97. package/dist/index-4fnghj9e.js +0 -65
  98. package/dist/index-a69gr76b.js +0 -2
  99. package/dist/index-h263aftt.js +0 -157
  100. package/dist/index-ssj7m2rd.js +0 -8
  101. package/dist/index-ydz3hbhc.js +0 -2
  102. package/dist/token-util-4a2xxnpg.js +0 -1
@@ -11,7 +11,7 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
11
11
  import { readFileSync } from "node:fs";
12
12
  import { dirname, join } from "node:path";
13
13
  import { fileURLToPath } from "node:url";
14
- import { formatQuota, quotaTextParts } from "./shared/d5a8f1061ee2f114-index.js";
14
+ import { formatQuota, quotaTextParts, quotaWindowParts } from "./shared/d5a8f1061ee2f114-index.js";
15
15
  import { createEffect, createSignal, For, onCleanup, Show } from "opentui:runtime-module:solid-js";
16
16
  import { createLogger } from "./logger.js";
17
17
  import { isNotifyPayload } from "./rpc/protocol.js";
@@ -19,6 +19,7 @@ import { createRpcClient } from "./rpc/rpc-client.js";
19
19
  import { resolveRpcDir } from "./rpc/rpc-dir.js";
20
20
  import { computeQuotaPacing, DEFAULT_SIDEBAR_STATE, getCollapsedQuotaSummary, getPresentQuotaWindows, getSidebarState, resolveActiveAccount, resolveSessionSidebarRouting, resolveSessionStickyAccount, sidebarQuotaProjection } from "./sidebar-state.js";
21
21
  import { openCommandDialog } from "./tui/command-dialogs.js";
22
+ import { setupTui } from "./tui/v2.js";
22
23
  import { computeEffectiveOrder, DEFAULT_SLOT_ORDER, PLUGIN_KEY, queueTuiPreferenceUpdate, readTuiPreferencesFile, resolveOpenaiAuthPrefs, watchTuiPreferences } from "./tui-preferences.js";
23
24
  const RPC_POLL_MS = 500;
24
25
  let rpcPollStarted = false;
@@ -244,7 +245,7 @@ function quotaRowLabels(quota) {
244
245
  */
245
246
  export function renderedQuotas(state) {
246
247
  // In vault mode only the vault accounts are rendered.
247
- if (state.vaultAccounts !== undefined) return state.vaultAccounts.filter(account => account.enabled).map(account => account.quota);
248
+ if (state.vaultAccounts !== undefined) return state.vaultAccounts.map(account => account.quota);
248
249
  return [state.main?.quota ?? null, ...(state.fallbacks ?? []).filter(fallback => fallback.enabled).map(fallback => fallback.quota)];
249
250
  }
250
251
  export function computeQuotaLabelWidth(quotas) {
@@ -263,34 +264,48 @@ export function computeQuotaLabelWidth(quotas) {
263
264
  // that only inspect pacing may omit it and get this row set's own width.
264
265
  export function buildQuotaRowsForDisplay(quota, now, pacingEnabled, labelWidth) {
265
266
  const projection = sidebarQuotaProjection(quota, now);
266
- const rows = getPresentQuotaWindows(quota).map(row => ({
267
- key: row.key,
268
- label: row.label,
269
- window: row.window,
270
- text: formatQuota(projection && {
267
+ const rows = getPresentQuotaWindows(quota).map(row => {
268
+ const rowProjection = projection && {
271
269
  ...projection,
272
270
  budget: undefined,
273
271
  limits: projection.limits.filter(limit => limit.label === row.key)
274
- }, {
272
+ };
273
+ const reset = quotaWindowParts(rowProjection, {
275
274
  now,
276
- form: 'compact',
277
275
  staleAfterMs: Number.POSITIVE_INFINITY
278
- }),
279
- pacing: pacingEnabled && row.windowMs !== null ? computeQuotaPacing(row.window, row.windowMs, now) : null
280
- }));
276
+ }).windows[0];
277
+ return {
278
+ key: row.key,
279
+ label: row.label,
280
+ window: row.window,
281
+ text: formatQuota(rowProjection, {
282
+ now,
283
+ form: 'compact',
284
+ staleAfterMs: Number.POSITIVE_INFINITY
285
+ }),
286
+ resetText: reset?.resetIn ?? (reset?.resetSinceReading ? 'reset' : undefined),
287
+ pacing: pacingEnabled && row.windowMs !== null ? computeQuotaPacing(row.window, row.windowMs, now) : null
288
+ };
289
+ });
281
290
  const spendControl = quota?.spendControl;
282
291
  if (spendControl) {
292
+ const rowProjection = projection && {
293
+ ...projection,
294
+ limits: []
295
+ };
296
+ const reset = quotaWindowParts(rowProjection, {
297
+ now,
298
+ staleAfterMs: Number.POSITIVE_INFINITY
299
+ }).windows[0];
283
300
  rows.push({
284
301
  key: 'spendControl',
285
302
  label: SPEND_CONTROL_LABEL,
286
- text: formatQuota(projection && {
287
- ...projection,
288
- limits: []
289
- }, {
303
+ text: formatQuota(rowProjection, {
290
304
  now,
291
305
  form: 'compact',
292
306
  staleAfterMs: Number.POSITIVE_INFINITY
293
307
  }),
308
+ resetText: reset?.resetIn ?? (reset?.resetSinceReading ? 'reset' : undefined),
294
309
  window: {
295
310
  usedPercent: spendControl.usedPercent,
296
311
  remainingPercent: spendControl.remainingPercent,
@@ -378,26 +393,26 @@ function QuotaRow(props) {
378
393
  },
379
394
  get fallback() {
380
395
  return (() => {
381
- var _el$15 = _$createElement("box"),
382
- _el$16 = _$createElement("text"),
383
- _el$17 = _$createElement("text");
384
- _$insertNode(_el$15, _el$16);
385
- _$insertNode(_el$15, _el$17);
386
- _$setProp(_el$15, "width", '100%');
387
- _$setProp(_el$15, "flexDirection", 'row');
388
- _$insert(_el$16, () => props.label.padEnd(props.labelWidth));
389
- _$insertNode(_el$17, _$createTextNode(`—`));
396
+ var _el$16 = _$createElement("box"),
397
+ _el$17 = _$createElement("text"),
398
+ _el$18 = _$createElement("text");
399
+ _$insertNode(_el$16, _el$17);
400
+ _$insertNode(_el$16, _el$18);
401
+ _$setProp(_el$16, "width", '100%');
402
+ _$setProp(_el$16, "flexDirection", 'row');
403
+ _$insert(_el$17, () => props.label.padEnd(props.labelWidth));
404
+ _$insertNode(_el$18, _$createTextNode(`—`));
390
405
  _$effect(_p$ => {
391
406
  var _v$9 = props.theme.textMuted,
392
407
  _v$0 = props.theme.textMuted;
393
- _v$9 !== _p$.e && (_p$.e = _$setProp(_el$16, "fg", _v$9, _p$.e));
394
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$17, "fg", _v$0, _p$.t));
408
+ _v$9 !== _p$.e && (_p$.e = _$setProp(_el$17, "fg", _v$9, _p$.e));
409
+ _v$0 !== _p$.t && (_p$.t = _$setProp(_el$18, "fg", _v$0, _p$.t));
395
410
  return _p$;
396
411
  }, {
397
412
  e: undefined,
398
413
  t: undefined
399
414
  });
400
- return _el$15;
415
+ return _el$16;
401
416
  })();
402
417
  },
403
418
  get children() {
@@ -419,13 +434,24 @@ function QuotaRow(props) {
419
434
  return quotaBarSegments(used(), props.appearance, props.pacing);
420
435
  },
421
436
  children: segment => (() => {
422
- var _el$19 = _$createElement("text");
423
- _$insert(_el$19, () => segment.text);
424
- _$effect(_$p => _$setProp(_el$19, "fg", toneColor(props.theme, segment.tone), _$p));
425
- return _el$19;
437
+ var _el$20 = _$createElement("text");
438
+ _$insert(_el$20, () => segment.text);
439
+ _$effect(_$p => _$setProp(_el$20, "fg", toneColor(props.theme, segment.tone), _$p));
440
+ return _el$20;
426
441
  })()
427
442
  }), _el$11);
428
443
  _$insert(_el$11, () => ` ${props.text.slice(props.label.length + 1)}`);
444
+ _$insert(_el$0, _$createComponent(Show, {
445
+ get when() {
446
+ return props.resetText;
447
+ },
448
+ get children() {
449
+ var _el$12 = _$createElement("text");
450
+ _$insert(_el$12, () => props.resetText);
451
+ _$effect(_$p => _$setProp(_el$12, "fg", props.theme.textMuted, _$p));
452
+ return _el$12;
453
+ }
454
+ }), null);
429
455
  _$effect(_p$ => {
430
456
  var _v$5 = props.theme.textMuted,
431
457
  _v$6 = toneColor(props.theme, usageTone(used(), props.appearance));
@@ -442,26 +468,26 @@ function QuotaRow(props) {
442
468
  return paceLine();
443
469
  },
444
470
  get children() {
445
- var _el$12 = _$createElement("box"),
446
- _el$13 = _$createElement("text"),
447
- _el$14 = _$createElement("text");
448
- _$insertNode(_el$12, _el$13);
449
- _$insertNode(_el$12, _el$14);
450
- _$setProp(_el$12, "width", '100%');
451
- _$setProp(_el$12, "flexDirection", 'row');
452
- _$insert(_el$13, () => ''.padEnd(props.labelWidth));
453
- _$insert(_el$14, paceLine);
471
+ var _el$13 = _$createElement("box"),
472
+ _el$14 = _$createElement("text"),
473
+ _el$15 = _$createElement("text");
474
+ _$insertNode(_el$13, _el$14);
475
+ _$insertNode(_el$13, _el$15);
476
+ _$setProp(_el$13, "width", '100%');
477
+ _$setProp(_el$13, "flexDirection", 'row');
478
+ _$insert(_el$14, () => ''.padEnd(props.labelWidth));
479
+ _$insert(_el$15, paceLine);
454
480
  _$effect(_p$ => {
455
481
  var _v$7 = props.theme.textMuted,
456
482
  _v$8 = toneColor(props.theme, props.pacing?.state === 'deficit' ? 'warn' : 'muted');
457
- _v$7 !== _p$.e && (_p$.e = _$setProp(_el$13, "fg", _v$7, _p$.e));
458
- _v$8 !== _p$.t && (_p$.t = _$setProp(_el$14, "fg", _v$8, _p$.t));
483
+ _v$7 !== _p$.e && (_p$.e = _$setProp(_el$14, "fg", _v$7, _p$.e));
484
+ _v$8 !== _p$.t && (_p$.t = _$setProp(_el$15, "fg", _v$8, _p$.t));
459
485
  return _p$;
460
486
  }, {
461
487
  e: undefined,
462
488
  t: undefined
463
489
  });
464
- return _el$12;
490
+ return _el$13;
465
491
  }
466
492
  })];
467
493
  }
@@ -476,34 +502,56 @@ function AccountBlock(props) {
476
502
  const statusTone = () => props.killed ? 'err' : props.active ? 'ok' : 'muted';
477
503
  const rows = () => buildQuotaRowsForDisplay(props.quota, Date.now(), props.pacingEnabled, props.labelWidth);
478
504
  return (() => {
479
- var _el$20 = _$createElement("box"),
480
- _el$21 = _$createElement("box"),
481
- _el$22 = _$createElement("text"),
482
- _el$23 = _$createElement("b"),
483
- _el$24 = _$createElement("text"),
484
- _el$25 = _$createElement("b");
485
- _$insertNode(_el$20, _el$21);
486
- _$setProp(_el$20, "width", '100%');
487
- _$setProp(_el$20, "flexDirection", 'column');
505
+ var _el$21 = _$createElement("box"),
506
+ _el$22 = _$createElement("box"),
507
+ _el$23 = _$createElement("text"),
508
+ _el$24 = _$createElement("b"),
509
+ _el$25 = _$createElement("text"),
510
+ _el$26 = _$createElement("b");
488
511
  _$insertNode(_el$21, _el$22);
489
- _$insertNode(_el$21, _el$24);
490
512
  _$setProp(_el$21, "width", '100%');
491
- _$setProp(_el$21, "flexDirection", 'row');
492
- _$setProp(_el$21, "justifyContent", 'space-between');
513
+ _$setProp(_el$21, "flexDirection", 'column');
493
514
  _$insertNode(_el$22, _el$23);
494
- _$insert(_el$23, () => props.name);
495
- _$insertNode(_el$24, _el$25);
496
- _$insert(_el$25, statusWord);
497
- _$insert(_el$20, _$createComponent(Show, {
515
+ _$insertNode(_el$22, _el$25);
516
+ _$setProp(_el$22, "width", '100%');
517
+ _$setProp(_el$22, "flexDirection", 'row');
518
+ _$setProp(_el$22, "justifyContent", 'space-between');
519
+ _$insertNode(_el$23, _el$24);
520
+ _$insert(_el$24, () => props.name);
521
+ _$insertNode(_el$25, _el$26);
522
+ _$insert(_el$26, statusWord);
523
+ _$insert(_el$21, _$createComponent(Show, {
524
+ get when() {
525
+ return props.vaultState;
526
+ },
527
+ get children() {
528
+ var _el$27 = _$createElement("text");
529
+ _$insert(_el$27, () => props.vaultState);
530
+ _$effect(_$p => _$setProp(_el$27, "fg", props.theme.warning, _$p));
531
+ return _el$27;
532
+ }
533
+ }), null);
534
+ _$insert(_el$21, _$createComponent(Show, {
535
+ get when() {
536
+ return props.hostDisabled;
537
+ },
538
+ get children() {
539
+ var _el$28 = _$createElement("text");
540
+ _$insertNode(_el$28, _$createTextNode(`off in /openai`));
541
+ _$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
542
+ return _el$28;
543
+ }
544
+ }), null);
545
+ _$insert(_el$21, _$createComponent(Show, {
498
546
  get when() {
499
547
  return isQuotaLoaded(props.quota);
500
548
  },
501
549
  get fallback() {
502
550
  return (() => {
503
- var _el$26 = _$createElement("text");
504
- _$insertNode(_el$26, _$createTextNode(`checking…`));
505
- _$effect(_$p => _$setProp(_el$26, "fg", props.theme.textMuted, _$p));
506
- return _el$26;
551
+ var _el$30 = _$createElement("text");
552
+ _$insertNode(_el$30, _$createTextNode(`checking…`));
553
+ _$effect(_$p => _$setProp(_el$30, "fg", props.theme.textMuted, _$p));
554
+ return _el$30;
507
555
  })();
508
556
  },
509
557
  get children() {
@@ -513,10 +561,10 @@ function AccountBlock(props) {
513
561
  },
514
562
  get fallback() {
515
563
  return (() => {
516
- var _el$28 = _$createElement("text");
517
- _$insertNode(_el$28, _$createTextNode(`—`));
518
- _$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
519
- return _el$28;
564
+ var _el$32 = _$createElement("text");
565
+ _$insertNode(_el$32, _$createTextNode(`—`));
566
+ _$effect(_$p => _$setProp(_el$32, "fg", props.theme.textMuted, _$p));
567
+ return _el$32;
520
568
  })();
521
569
  },
522
570
  get children() {
@@ -540,6 +588,9 @@ function AccountBlock(props) {
540
588
  get text() {
541
589
  return row.text;
542
590
  },
591
+ get resetText() {
592
+ return row.resetText;
593
+ },
543
594
  get window() {
544
595
  return row.window;
545
596
  },
@@ -552,7 +603,7 @@ function AccountBlock(props) {
552
603
  });
553
604
  }
554
605
  }), null);
555
- _$insert(_el$20, _$createComponent(For, {
606
+ _$insert(_el$21, _$createComponent(For, {
556
607
  get each() {
557
608
  return quotaTextParts(sidebarQuotaProjection(props.quota, Date.now()), {
558
609
  now: Date.now(),
@@ -560,13 +611,13 @@ function AccountBlock(props) {
560
611
  }).filter(part => part.startsWith('checked '));
561
612
  },
562
613
  children: age => (() => {
563
- var _el$30 = _$createElement("text");
564
- _$insert(_el$30, age);
565
- _$effect(_$p => _$setProp(_el$30, "fg", props.theme.textMuted, _$p));
566
- return _el$30;
614
+ var _el$34 = _$createElement("text");
615
+ _$insert(_el$34, age);
616
+ _$effect(_$p => _$setProp(_el$34, "fg", props.theme.textMuted, _$p));
617
+ return _el$34;
567
618
  })()
568
619
  }), null);
569
- _$insert(_el$20, _$createComponent(For, {
620
+ _$insert(_el$21, _$createComponent(For, {
570
621
  get each() {
571
622
  return getAccountMetadataRows(props.resetCredits, props.quota?.spendControl);
572
623
  },
@@ -587,16 +638,16 @@ function AccountBlock(props) {
587
638
  var _v$1 = props.marginTop ?? 0,
588
639
  _v$10 = props.theme.text,
589
640
  _v$11 = toneColor(props.theme, statusTone());
590
- _v$1 !== _p$.e && (_p$.e = _$setProp(_el$20, "marginTop", _v$1, _p$.e));
591
- _v$10 !== _p$.t && (_p$.t = _$setProp(_el$22, "fg", _v$10, _p$.t));
592
- _v$11 !== _p$.a && (_p$.a = _$setProp(_el$24, "fg", _v$11, _p$.a));
641
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$21, "marginTop", _v$1, _p$.e));
642
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$23, "fg", _v$10, _p$.t));
643
+ _v$11 !== _p$.a && (_p$.a = _$setProp(_el$25, "fg", _v$11, _p$.a));
593
644
  return _p$;
594
645
  }, {
595
646
  e: undefined,
596
647
  t: undefined,
597
648
  a: undefined
598
649
  });
599
- return _el$20;
650
+ return _el$21;
600
651
  })();
601
652
  }
602
653
 
@@ -643,15 +694,13 @@ function createSidebarController(initialPrefs) {
643
694
  const [collapsed, setCollapsed] = createSignal(seedCollapsed);
644
695
  let lastPersistedCollapsed = initialPrefs.collapsed;
645
696
  let lastApplied = JSON.stringify(initialPrefs);
646
-
647
- // The watcher lives for the plugin/process lifetime — it is intentionally
648
- // never disposed. Collapse guard mirrors the race-fix in toggleCollapsed:
649
- // lastPersistedCollapsed is advanced only once our own write lands, so
650
- // watcher echoes of the previous persisted value are rejected by the
651
- // `!==` check and cannot revert a user click.
652
- watchTuiPreferences(() => {
697
+ let disposed = false;
698
+ // Remember the last value written to disk, not an unpersisted click. A watcher
699
+ // echo of the previous disk value must not undo a click whose write is pending.
700
+ const unwatch = watchTuiPreferences(() => {
653
701
  void (async () => {
654
702
  const next = resolveOpenaiAuthPrefs(await readTuiPreferencesFile());
703
+ if (disposed) return;
655
704
  const serialized = JSON.stringify(next);
656
705
  if (serialized === lastApplied) return;
657
706
  lastApplied = serialized;
@@ -674,7 +723,11 @@ function createSidebarController(initialPrefs) {
674
723
  return {
675
724
  prefs,
676
725
  collapsed,
677
- toggleCollapsed
726
+ toggleCollapsed,
727
+ dispose() {
728
+ disposed = true;
729
+ unwatch();
730
+ }
678
731
  };
679
732
  }
680
733
  function QuotaSidebar(props) {
@@ -683,9 +736,11 @@ function QuotaSidebar(props) {
683
736
  const [state, setState] = createSignal(DEFAULT_SIDEBAR_STATE);
684
737
  let lastUpdated = 0;
685
738
  let debounce = null;
739
+ let disposed = false;
686
740
  async function refresh() {
741
+ if (disposed) return;
687
742
  const next = await readStateFromFile();
688
- if (next.lastUpdated !== lastUpdated) {
743
+ if (!disposed && next.lastUpdated !== lastUpdated) {
689
744
  lastUpdated = next.lastUpdated;
690
745
  setState(next);
691
746
  }
@@ -706,8 +761,10 @@ function QuotaSidebar(props) {
706
761
  onCleanup(() => clearInterval(timer));
707
762
  });
708
763
  const unsubs = [props.api.event.on('session.updated', scheduleRefresh), props.api.event.on('message.updated', scheduleRefresh)];
709
- setTimeout(refresh, 300);
764
+ const initialRefresh = setTimeout(refresh, 300);
710
765
  onCleanup(() => {
766
+ disposed = true;
767
+ clearTimeout(initialRefresh);
711
768
  if (debounce) clearTimeout(debounce);
712
769
  for (const u of unsubs) u();
713
770
  });
@@ -716,8 +773,8 @@ function QuotaSidebar(props) {
716
773
  // Vault mode: the host uses only the vault's accounts, which the file lists
717
774
  // in `vaultAccounts`; main and the local fallbacks are not shown.
718
775
  const vaultMode = () => state().vaultAccounts !== undefined;
719
- const enabledVaultAccounts = () => (state().vaultAccounts ?? []).filter(account => account.enabled);
720
- const hasData = () => vaultMode() ? enabledVaultAccounts().length > 0 : state().main?.quota != null || enabledFallbacks().length > 0;
776
+ const vaultAccounts = () => state().vaultAccounts ?? [];
777
+ const hasData = () => vaultMode() ? vaultAccounts().length > 0 : state().main?.quota != null || enabledFallbacks().length > 0;
721
778
  const headerLabel = () => {
722
779
  const name = prefs().header.label;
723
780
  return !hasData() ? name : collapsed() ? `\u25b6 ${name}` : `\u25bc ${name}`;
@@ -745,38 +802,38 @@ function QuotaSidebar(props) {
745
802
  if (!activePacingDeficit()) return base;
746
803
  return base === 'ok' || base === 'muted' ? 'warn' : base;
747
804
  };
748
- const killedNames = () => [state().main?.killed ? 'main' : '', ...enabledFallbacks().filter(f => f.killed).map(f => f.label ?? f.id)].filter(Boolean);
805
+ const killedNames = () => [!vaultMode() && state().main?.killed ? 'main' : '', ...(vaultMode() ? vaultAccounts() : enabledFallbacks()).filter(f => f.killed).map(f => f.label ?? f.id)].filter(Boolean);
749
806
  const quotaBackedOff = () => state().main?.quotaBackedOff === true;
750
807
  const refreshBackedOff = () => state().main?.refreshBackedOff === true;
751
808
  const degraded = () => killedNames().length > 0 || quotaBackedOff() || refreshBackedOff();
752
809
  return (() => {
753
- var _el$31 = _$createElement("box"),
754
- _el$32 = _$createElement("box"),
755
- _el$33 = _$createElement("box"),
756
- _el$34 = _$createElement("text"),
757
- _el$35 = _$createElement("b");
758
- _$insertNode(_el$31, _el$32);
759
- _$setProp(_el$31, "width", '100%');
760
- _$setProp(_el$31, "flexDirection", 'column');
761
- _$setProp(_el$31, "border", SINGLE_BORDER);
762
- _$setProp(_el$31, "paddingTop", 1);
763
- _$setProp(_el$31, "paddingBottom", 1);
764
- _$setProp(_el$31, "paddingLeft", 1);
765
- _$setProp(_el$31, "paddingRight", 1);
766
- _$insertNode(_el$32, _el$33);
767
- _$setProp(_el$32, "width", '100%');
768
- _$setProp(_el$32, "flexDirection", 'row');
769
- _$setProp(_el$32, "justifyContent", 'space-between');
770
- _$setProp(_el$32, "alignItems", 'center');
771
- _$setProp(_el$32, "onMouseDown", () => {
810
+ var _el$35 = _$createElement("box"),
811
+ _el$36 = _$createElement("box"),
812
+ _el$37 = _$createElement("box"),
813
+ _el$38 = _$createElement("text"),
814
+ _el$39 = _$createElement("b");
815
+ _$insertNode(_el$35, _el$36);
816
+ _$setProp(_el$35, "width", '100%');
817
+ _$setProp(_el$35, "flexDirection", 'column');
818
+ _$setProp(_el$35, "border", SINGLE_BORDER);
819
+ _$setProp(_el$35, "paddingTop", 1);
820
+ _$setProp(_el$35, "paddingBottom", 1);
821
+ _$setProp(_el$35, "paddingLeft", 1);
822
+ _$setProp(_el$35, "paddingRight", 1);
823
+ _$insertNode(_el$36, _el$37);
824
+ _$setProp(_el$36, "width", '100%');
825
+ _$setProp(_el$36, "flexDirection", 'row');
826
+ _$setProp(_el$36, "justifyContent", 'space-between');
827
+ _$setProp(_el$36, "alignItems", 'center');
828
+ _$setProp(_el$36, "onMouseDown", () => {
772
829
  if (hasData()) props.controller.toggleCollapsed();
773
830
  });
774
- _$insertNode(_el$33, _el$34);
775
- _$setProp(_el$33, "paddingLeft", 1);
776
- _$setProp(_el$33, "paddingRight", 1);
777
- _$insertNode(_el$34, _el$35);
778
- _$insert(_el$35, headerLabel);
779
- _$insert(_el$32, _$createComponent(Show, {
831
+ _$insertNode(_el$37, _el$38);
832
+ _$setProp(_el$37, "paddingLeft", 1);
833
+ _$setProp(_el$37, "paddingRight", 1);
834
+ _$insertNode(_el$38, _el$39);
835
+ _$insert(_el$39, headerLabel);
836
+ _$insert(_el$36, _$createComponent(Show, {
780
837
  get when() {
781
838
  return degraded();
782
839
  },
@@ -786,36 +843,36 @@ function QuotaSidebar(props) {
786
843
  return prefs().header.showVersion && PLUGIN_VERSION !== '';
787
844
  },
788
845
  get children() {
789
- var _el$44 = _$createElement("text");
790
- _$insert(_el$44, `v${PLUGIN_VERSION}`);
791
- _$effect(_$p => _$setProp(_el$44, "fg", theme().textMuted, _$p));
792
- return _el$44;
846
+ var _el$48 = _$createElement("text");
847
+ _$insert(_el$48, `v${PLUGIN_VERSION}`);
848
+ _$effect(_$p => _$setProp(_el$48, "fg", theme().textMuted, _$p));
849
+ return _el$48;
793
850
  }
794
851
  });
795
852
  },
796
853
  get children() {
797
- var _el$36 = _$createElement("box"),
798
- _el$37 = _$createElement("text"),
799
- _el$38 = _$createElement("b");
800
- _$insertNode(_el$36, _el$37);
801
- _$setProp(_el$36, "paddingLeft", 1);
802
- _$setProp(_el$36, "paddingRight", 1);
803
- _$insertNode(_el$37, _el$38);
804
- _$insertNode(_el$38, _$createTextNode(`LIMITED`));
854
+ var _el$40 = _$createElement("box"),
855
+ _el$41 = _$createElement("text"),
856
+ _el$42 = _$createElement("b");
857
+ _$insertNode(_el$40, _el$41);
858
+ _$setProp(_el$40, "paddingLeft", 1);
859
+ _$setProp(_el$40, "paddingRight", 1);
860
+ _$insertNode(_el$41, _el$42);
861
+ _$insertNode(_el$42, _$createTextNode(`LIMITED`));
805
862
  _$effect(_p$ => {
806
863
  var _v$12 = theme().warning,
807
864
  _v$13 = theme().background;
808
- _v$12 !== _p$.e && (_p$.e = _$setProp(_el$36, "backgroundColor", _v$12, _p$.e));
809
- _v$13 !== _p$.t && (_p$.t = _$setProp(_el$37, "fg", _v$13, _p$.t));
865
+ _v$12 !== _p$.e && (_p$.e = _$setProp(_el$40, "backgroundColor", _v$12, _p$.e));
866
+ _v$13 !== _p$.t && (_p$.t = _$setProp(_el$41, "fg", _v$13, _p$.t));
810
867
  return _p$;
811
868
  }, {
812
869
  e: undefined,
813
870
  t: undefined
814
871
  });
815
- return _el$36;
872
+ return _el$40;
816
873
  }
817
874
  }), null);
818
- _$insert(_el$31, _$createComponent(Show, {
875
+ _$insert(_el$35, _$createComponent(Show, {
819
876
  get when() {
820
877
  return _$memo(() => !!collapsed())() && hasData();
821
878
  },
@@ -834,41 +891,41 @@ function QuotaSidebar(props) {
834
891
  },
835
892
  get fallback() {
836
893
  return (() => {
837
- var _el$45 = _$createElement("text");
838
- _$insertNode(_el$45, _$createTextNode(`—`));
839
- _$effect(_$p => _$setProp(_el$45, "fg", theme().textMuted, _$p));
840
- return _el$45;
894
+ var _el$49 = _$createElement("text");
895
+ _$insertNode(_el$49, _$createTextNode(`—`));
896
+ _$effect(_$p => _$setProp(_el$49, "fg", theme().textMuted, _$p));
897
+ return _el$49;
841
898
  })();
842
899
  },
843
900
  get children() {
844
- var _el$40 = _$createElement("box"),
845
- _el$41 = _$createElement("text"),
846
- _el$42 = _$createElement("b"),
847
- _el$43 = _$createElement("text");
848
- _$insertNode(_el$40, _el$41);
849
- _$insertNode(_el$40, _el$43);
850
- _$setProp(_el$40, "flexDirection", 'row');
851
- _$insertNode(_el$41, _el$42);
852
- _$insert(_el$42, () => activeQuotaSummary().text);
853
- _$insert(_el$43, () => activeAccount().killed ? ' \u2298' : ' \u25cf');
901
+ var _el$44 = _$createElement("box"),
902
+ _el$45 = _$createElement("text"),
903
+ _el$46 = _$createElement("b"),
904
+ _el$47 = _$createElement("text");
905
+ _$insertNode(_el$44, _el$45);
906
+ _$insertNode(_el$44, _el$47);
907
+ _$setProp(_el$44, "flexDirection", 'row');
908
+ _$insertNode(_el$45, _el$46);
909
+ _$insert(_el$46, () => activeQuotaSummary().text);
910
+ _$insert(_el$47, () => activeAccount().killed ? ' \u2298' : ' \u25cf');
854
911
  _$effect(_p$ => {
855
912
  var _v$14 = toneColor(theme(), activeQuotaTone()),
856
913
  _v$15 = toneColor(theme(), activeAccount().killed ? 'err' : activeQuotaTone());
857
- _v$14 !== _p$.e && (_p$.e = _$setProp(_el$41, "fg", _v$14, _p$.e));
858
- _v$15 !== _p$.t && (_p$.t = _$setProp(_el$43, "fg", _v$15, _p$.t));
914
+ _v$14 !== _p$.e && (_p$.e = _$setProp(_el$45, "fg", _v$14, _p$.e));
915
+ _v$15 !== _p$.t && (_p$.t = _$setProp(_el$47, "fg", _v$15, _p$.t));
859
916
  return _p$;
860
917
  }, {
861
918
  e: undefined,
862
919
  t: undefined
863
920
  });
864
- return _el$40;
921
+ return _el$44;
865
922
  }
866
923
  });
867
924
  }
868
925
  });
869
926
  }
870
927
  }), null);
871
- _$insert(_el$31, _$createComponent(Show, {
928
+ _$insert(_el$35, _$createComponent(Show, {
872
929
  get when() {
873
930
  return !collapsed() || !hasData();
874
931
  },
@@ -879,14 +936,14 @@ function QuotaSidebar(props) {
879
936
  },
880
937
  get fallback() {
881
938
  return (() => {
882
- var _el$47 = _$createElement("box"),
883
- _el$48 = _$createElement("text");
884
- _$insertNode(_el$47, _el$48);
885
- _$setProp(_el$47, "marginTop", 1);
886
- _$setProp(_el$47, "width", '100%');
887
- _$insertNode(_el$48, _$createTextNode(`Waiting for quota…`));
888
- _$effect(_$p => _$setProp(_el$48, "fg", theme().textMuted, _$p));
889
- return _el$47;
939
+ var _el$51 = _$createElement("box"),
940
+ _el$52 = _$createElement("text");
941
+ _$insertNode(_el$51, _el$52);
942
+ _$setProp(_el$51, "marginTop", 1);
943
+ _$setProp(_el$51, "width", '100%');
944
+ _$insertNode(_el$52, _$createTextNode(`Waiting for quota…`));
945
+ _$effect(_$p => _$setProp(_el$52, "fg", theme().textMuted, _$p));
946
+ return _el$51;
890
947
  })();
891
948
  },
892
949
  get children() {
@@ -907,7 +964,7 @@ function QuotaSidebar(props) {
907
964
  get fallback() {
908
965
  return _$createComponent(For, {
909
966
  get each() {
910
- return enabledVaultAccounts();
967
+ return vaultAccounts();
911
968
  },
912
969
  children: (account, index) => _$createComponent(AccountBlock, {
913
970
  get theme() {
@@ -925,6 +982,12 @@ function QuotaSidebar(props) {
925
982
  get killed() {
926
983
  return account.killed;
927
984
  },
985
+ get vaultState() {
986
+ return account.vaultState;
987
+ },
988
+ get hostDisabled() {
989
+ return !account.enabled;
990
+ },
928
991
  get active() {
929
992
  return sessionRouting().activeId === account.id;
930
993
  },
@@ -1130,16 +1193,16 @@ function QuotaSidebar(props) {
1130
1193
  var _v$16 = theme().borderActive,
1131
1194
  _v$17 = theme().accent,
1132
1195
  _v$18 = theme().background;
1133
- _v$16 !== _p$.e && (_p$.e = _$setProp(_el$31, "borderColor", _v$16, _p$.e));
1134
- _v$17 !== _p$.t && (_p$.t = _$setProp(_el$33, "backgroundColor", _v$17, _p$.t));
1135
- _v$18 !== _p$.a && (_p$.a = _$setProp(_el$34, "fg", _v$18, _p$.a));
1196
+ _v$16 !== _p$.e && (_p$.e = _$setProp(_el$35, "borderColor", _v$16, _p$.e));
1197
+ _v$17 !== _p$.t && (_p$.t = _$setProp(_el$37, "backgroundColor", _v$17, _p$.t));
1198
+ _v$18 !== _p$.a && (_p$.a = _$setProp(_el$38, "fg", _v$18, _p$.a));
1136
1199
  return _p$;
1137
1200
  }, {
1138
1201
  e: undefined,
1139
1202
  t: undefined,
1140
1203
  a: undefined
1141
1204
  });
1142
- return _el$31;
1205
+ return _el$35;
1143
1206
  })();
1144
1207
  }
1145
1208
  const tui = async api => {
@@ -1196,8 +1259,37 @@ const tui = async api => {
1196
1259
  }, RPC_POLL_MS);
1197
1260
  }
1198
1261
  };
1262
+ async function setup(context, options = {}) {
1263
+ if (options.sidebarText !== undefined || options.sidebar) return setupTui(context, options);
1264
+ const root = await readTuiPreferencesFile();
1265
+ const controller = createSidebarController(resolveOpenaiAuthPrefs(root));
1266
+ const api = {
1267
+ theme: {
1268
+ get current() {
1269
+ return context.theme;
1270
+ }
1271
+ },
1272
+ event: {
1273
+ on: (type, listener) => context.data.on(type === 'session.updated' ? 'session.metadata.updated' : 'session.usage.updated', listener)
1274
+ }
1275
+ };
1276
+ return setupTui(context, {
1277
+ ...options,
1278
+ sidebar: {
1279
+ render: input => _$createComponent(QuotaSidebar, {
1280
+ api: api,
1281
+ controller: controller,
1282
+ get sessionId() {
1283
+ return input.sessionID;
1284
+ }
1285
+ }),
1286
+ dispose: controller.dispose
1287
+ }
1288
+ });
1289
+ }
1199
1290
  const plugin = {
1200
1291
  id: ID,
1292
+ setup,
1201
1293
  tui
1202
1294
  };
1203
1295
  export default plugin;