@cortexkit/opencode-anthropic-auth 2.0.1 → 2.0.3

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 (54) hide show
  1. package/README.md +35 -845
  2. package/dist/cli-failure.d.ts +6 -5
  3. package/dist/cli.js +57 -103
  4. package/dist/custody-mode.d.ts +1 -0
  5. package/dist/{index-52r2e1h9.js → index-5hyennzm.js} +1 -1
  6. package/dist/{index-p4wvcwhh.js → index-fncp6r0j.js} +1 -1
  7. package/dist/index-jmjevtm1.js +2 -0
  8. package/dist/index-kd89hcr3.js +2 -0
  9. package/dist/index-mdpyfkv3.js +464 -0
  10. package/dist/index-nfcp0m1t.js +42 -0
  11. package/dist/index-qttfa42y.js +2 -0
  12. package/dist/{index-3xqv3rw3.js → index-rftced5v.js} +1 -1
  13. package/dist/{index-zdgceztz.js → index-vjehtqnb.js} +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/quota-preflight.d.ts +1 -0
  16. package/dist/rpc/port-file.js +1 -1
  17. package/dist/rpc/protocol.js +1 -1
  18. package/dist/rpc/rpc-client.js +1 -1
  19. package/dist/rpc/rpc-dir.js +1 -1
  20. package/dist/setup/command.d.ts +5 -14
  21. package/dist/setup/native-activation.d.ts +14 -6
  22. package/dist/setup/native-enrollment.d.ts +15 -0
  23. package/dist/setup/native-local.d.ts +31 -1
  24. package/dist/setup/process-fence.d.ts +0 -6
  25. package/dist/setup/types.d.ts +9 -0
  26. package/dist/sidebar-state.d.ts +20 -2
  27. package/dist/sidebar-state.js +1 -1
  28. package/dist/transform.d.ts +17 -2
  29. package/dist/tui-preferences.js +1 -1
  30. package/dist/tui.d.ts +0 -2
  31. package/dist/v2/activation.d.ts +2 -0
  32. package/dist/v2/adapter.d.ts +8 -2
  33. package/dist/v2/cachekeep.d.ts +19 -0
  34. package/dist/v2/menu.d.ts +2 -1
  35. package/dist/v2/server.js +4 -4
  36. package/dist/v2/setup.d.ts +2 -0
  37. package/dist/v2/source.d.ts +1 -0
  38. package/dist/v2/tui.js +1 -1
  39. package/package.json +5 -5
  40. package/src/sidebar-state.ts +165 -29
  41. package/src/tui-compiled/sidebar-state.ts +165 -29
  42. package/src/tui-compiled/tui.tsx +363 -239
  43. package/src/tui.tsx +149 -48
  44. package/dist/index-04syas8a.js +0 -2
  45. package/dist/index-b3mxpp4w.js +0 -2
  46. package/dist/index-ynq181e8.js +0 -42
  47. package/dist/index-yxtdke11.js +0 -449
  48. package/dist/setup/activation.d.ts +0 -7
  49. package/dist/setup/command.test.d.ts +0 -1
  50. package/dist/setup/detect.d.ts +0 -8
  51. package/dist/setup/host-executable.d.ts +0 -3
  52. package/dist/setup/jsonc.d.ts +0 -9
  53. package/dist/setup/opencode-config.d.ts +0 -18
  54. package/dist/setup/pi.d.ts +0 -18
@@ -1,6 +1,7 @@
1
1
  import { memo as _$memo } from "opentui:runtime-module:%40opentui%2Fsolid";
2
- import { createTextNode as _$createTextNode } from "opentui:runtime-module:%40opentui%2Fsolid";
3
2
  import { createComponent as _$createComponent } from "opentui:runtime-module:%40opentui%2Fsolid";
3
+ import { createTextNode as _$createTextNode } from "opentui:runtime-module:%40opentui%2Fsolid";
4
+ import { use as _$use } from "opentui:runtime-module:%40opentui%2Fsolid";
4
5
  import { effect as _$effect } from "opentui:runtime-module:%40opentui%2Fsolid";
5
6
  import { insertNode as _$insertNode } from "opentui:runtime-module:%40opentui%2Fsolid";
6
7
  import { insert as _$insert } from "opentui:runtime-module:%40opentui%2Fsolid";
@@ -11,11 +12,12 @@ import { createElement as _$createElement } from "opentui:runtime-module:%40open
11
12
  import { readFileSync } from "node:fs";
12
13
  import { dirname, join } from "node:path";
13
14
  import { fileURLToPath } from "node:url";
14
- import { formatQuotaMoney } from "@cortexkit/anthropic-auth-core";
15
+ import { quotaDisplayProjection, quotaWindowParts } from "@cortexkit/anthropic-auth-core";
16
+ import { TextAttributes } from "opentui:runtime-module:%40opentui%2Fcore";
15
17
  import { createEffect, createSignal, For, onCleanup, Show } from "opentui:runtime-module:solid-js";
16
18
  import { createRpcClient } from "./rpc/rpc-client.js";
17
19
  import { getRpcDir } from "./rpc/rpc-dir.js";
18
- import { computeQuotaPacing, DEFAULT_SIDEBAR_STATE, FIVE_HOUR_MS, formatPrimeAccountValue, formatScopedQuotaLabel, getCollapsedQuotaSummary, getFableRecoverySummary, getSidebarState, resolveActiveAccount, SEVEN_DAY_MS } from "./sidebar-state.js";
20
+ import { computeQuotaPacing, DEFAULT_SIDEBAR_STATE, FIVE_HOUR_MS, formatPrimeAccountValue, formatQuotaRowLabel, getCollapsedAccounts, getCollapsedQuotaSummary, getFableRecoverySummary, getSidebarState, resolveActiveAccount, SEVEN_DAY_MS } from "./sidebar-state.js";
19
21
  import { openCommandDialog, openNativeMenuDialog } from "./tui/command-dialogs.js";
20
22
  import { computeEffectiveOrder, DEFAULT_SLOT_ORDER, PLUGIN_KEY, queueTuiPreferenceUpdate, readTuiPreferencesFile, resolveAnthropicAuthPrefs, watchTuiPreferences } from "./tui-preferences.js";
21
23
  const RPC_POLL_MS = 500;
@@ -198,14 +200,87 @@ function CollapsedRow(props) {
198
200
  return _el$8;
199
201
  })();
200
202
  }
203
+ function CollapsedAccountRow(props) {
204
+ const [width, setWidth] = createSignal(40);
205
+ let row;
206
+ const summary = () => getCollapsedQuotaSummary(props.account.quota);
207
+ const value = () => summary().text ?? '—';
208
+ const labelWidth = () => Math.max(0, width() - Bun.stringWidth(value()) - 1);
209
+ const dim = () => !props.account.active || props.account.quotaDated || summary().stale;
210
+ const attributes = () => dim() ? TextAttributes.DIM : TextAttributes.BOLD;
211
+ const color = () => dim() ? props.theme.textMuted : toneColor(props.theme, props.tone);
212
+ return (() => {
213
+ var _el$0 = _$createElement("box"),
214
+ _el$12 = _$createElement("text");
215
+ _$insertNode(_el$0, _el$12);
216
+ _$use(element => {
217
+ row = element;
218
+ setWidth(element.width || 40);
219
+ }, _el$0);
220
+ _$setProp(_el$0, "width", '100%');
221
+ _$setProp(_el$0, "height", 1);
222
+ _$setProp(_el$0, "flexDirection", 'row');
223
+ _$setProp(_el$0, "onSizeChange", () => setWidth(row?.width || 40));
224
+ _$insert(_el$0, _$createComponent(Show, {
225
+ get when() {
226
+ return labelWidth() > 0;
227
+ },
228
+ get children() {
229
+ return [(() => {
230
+ var _el$1 = _$createElement("text");
231
+ _$setProp(_el$1, "flexShrink", 0);
232
+ _$setProp(_el$1, "wrapMode", 'none');
233
+ _$insert(_el$1, () => formatQuotaRowLabel(props.account.name, labelWidth()));
234
+ _$effect(_p$ => {
235
+ var _v$5 = labelWidth(),
236
+ _v$6 = color(),
237
+ _v$7 = attributes();
238
+ _v$5 !== _p$.e && (_p$.e = _$setProp(_el$1, "width", _v$5, _p$.e));
239
+ _v$6 !== _p$.t && (_p$.t = _$setProp(_el$1, "fg", _v$6, _p$.t));
240
+ _v$7 !== _p$.a && (_p$.a = _$setProp(_el$1, "attributes", _v$7, _p$.a));
241
+ return _p$;
242
+ }, {
243
+ e: undefined,
244
+ t: undefined,
245
+ a: undefined
246
+ });
247
+ return _el$1;
248
+ })(), (() => {
249
+ var _el$10 = _$createElement("text");
250
+ _$insertNode(_el$10, _$createTextNode(` `));
251
+ _$setProp(_el$10, "width", 1);
252
+ _$setProp(_el$10, "flexShrink", 0);
253
+ return _el$10;
254
+ })()];
255
+ }
256
+ }), _el$12);
257
+ _$setProp(_el$12, "flexShrink", 0);
258
+ _$setProp(_el$12, "wrapMode", 'none');
259
+ _$insert(_el$12, value);
260
+ _$effect(_p$ => {
261
+ var _v$8 = Bun.stringWidth(value()),
262
+ _v$9 = color(),
263
+ _v$0 = attributes();
264
+ _v$8 !== _p$.e && (_p$.e = _$setProp(_el$12, "width", _v$8, _p$.e));
265
+ _v$9 !== _p$.t && (_p$.t = _$setProp(_el$12, "fg", _v$9, _p$.t));
266
+ _v$0 !== _p$.a && (_p$.a = _$setProp(_el$12, "attributes", _v$0, _p$.a));
267
+ return _p$;
268
+ }, {
269
+ e: undefined,
270
+ t: undefined,
271
+ a: undefined
272
+ });
273
+ return _el$0;
274
+ })();
275
+ }
201
276
 
202
- // Quota window row: muted label left, tone-colored bar + percentage right,
277
+ // Quota window row: muted label left, tone-colored bar + shared figure right,
203
278
  // with an optional muted reset suffix. When pacing data is present, the bar
204
279
  // gains a pace segment and an off-pace window adds a muted subline with the
205
280
  // reserve/deficit delta and the projected runout.
206
281
  function QuotaRow(props) {
207
- const used = () => props.window?.usedPercent ?? 0;
208
- const reset = () => formatResetIn(props.window?.resetsAt);
282
+ const used = () => props.usedPercent ?? 0;
283
+ const reset = () => props.part?.resetIn;
209
284
  const paceLine = () => {
210
285
  const pacing = props.pacing;
211
286
  if (!pacing || pacing.state === 'on-pace') return null;
@@ -215,105 +290,105 @@ function QuotaRow(props) {
215
290
  };
216
291
  return _$createComponent(Show, {
217
292
  get when() {
218
- return props.window;
293
+ return props.part;
219
294
  },
220
295
  get fallback() {
221
296
  return (() => {
222
- var _el$17 = _$createElement("box"),
223
- _el$18 = _$createElement("text"),
224
- _el$19 = _$createElement("text");
225
- _$insertNode(_el$17, _el$18);
226
- _$insertNode(_el$17, _el$19);
227
- _$setProp(_el$17, "width", '100%');
228
- _$setProp(_el$17, "flexDirection", 'row');
229
- _$insert(_el$18, () => props.label.padEnd(3));
230
- _$insertNode(_el$19, _$createTextNode(`—`));
297
+ var _el$21 = _$createElement("box"),
298
+ _el$22 = _$createElement("text"),
299
+ _el$23 = _$createElement("text");
300
+ _$insertNode(_el$21, _el$22);
301
+ _$insertNode(_el$21, _el$23);
302
+ _$setProp(_el$21, "width", '100%');
303
+ _$setProp(_el$21, "flexDirection", 'row');
304
+ _$insert(_el$22, () => `${formatQuotaRowLabel(props.label)} `);
305
+ _$insertNode(_el$23, _$createTextNode(`—`));
231
306
  _$effect(_p$ => {
232
- var _v$9 = props.theme.textMuted,
233
- _v$0 = props.theme.textMuted;
234
- _v$9 !== _p$.e && (_p$.e = _$setProp(_el$18, "fg", _v$9, _p$.e));
235
- _v$0 !== _p$.t && (_p$.t = _$setProp(_el$19, "fg", _v$0, _p$.t));
307
+ var _v$13 = props.theme.textMuted,
308
+ _v$14 = props.theme.textMuted;
309
+ _v$13 !== _p$.e && (_p$.e = _$setProp(_el$22, "fg", _v$13, _p$.e));
310
+ _v$14 !== _p$.t && (_p$.t = _$setProp(_el$23, "fg", _v$14, _p$.t));
236
311
  return _p$;
237
312
  }, {
238
313
  e: undefined,
239
314
  t: undefined
240
315
  });
241
- return _el$17;
316
+ return _el$21;
242
317
  })();
243
318
  },
244
319
  get children() {
245
320
  return [(() => {
246
- var _el$0 = _$createElement("box"),
247
- _el$1 = _$createElement("box"),
248
- _el$10 = _$createElement("text"),
249
- _el$11 = _$createElement("text");
250
- _$insertNode(_el$0, _el$1);
251
- _$setProp(_el$0, "width", '100%');
252
- _$setProp(_el$0, "flexDirection", 'row');
253
- _$setProp(_el$0, "justifyContent", 'space-between');
254
- _$insertNode(_el$1, _el$10);
255
- _$insertNode(_el$1, _el$11);
256
- _$setProp(_el$1, "flexDirection", 'row');
257
- _$insert(_el$10, () => props.label.padEnd(3));
258
- _$insert(_el$1, _$createComponent(For, {
321
+ var _el$13 = _$createElement("box"),
322
+ _el$14 = _$createElement("box"),
323
+ _el$15 = _$createElement("text"),
324
+ _el$16 = _$createElement("text");
325
+ _$insertNode(_el$13, _el$14);
326
+ _$setProp(_el$13, "width", '100%');
327
+ _$setProp(_el$13, "flexDirection", 'row');
328
+ _$setProp(_el$13, "justifyContent", 'space-between');
329
+ _$insertNode(_el$14, _el$15);
330
+ _$insertNode(_el$14, _el$16);
331
+ _$setProp(_el$14, "flexDirection", 'row');
332
+ _$insert(_el$15, () => `${formatQuotaRowLabel(props.label)} `);
333
+ _$insert(_el$14, _$createComponent(For, {
259
334
  get each() {
260
335
  return quotaBarSegments(used(), props.appearance, props.pacing);
261
336
  },
262
337
  children: segment => (() => {
263
- var _el$21 = _$createElement("text");
264
- _$insert(_el$21, () => segment.text);
265
- _$effect(_$p => _$setProp(_el$21, "fg", toneColor(props.theme, segment.tone), _$p));
266
- return _el$21;
338
+ var _el$25 = _$createElement("text");
339
+ _$insert(_el$25, () => segment.text);
340
+ _$effect(_$p => _$setProp(_el$25, "fg", toneColor(props.theme, segment.tone), _$p));
341
+ return _el$25;
267
342
  })()
268
- }), _el$11);
269
- _$insert(_el$11, () => ` ${String(Math.round(used())).padStart(3)}%${props.binding ? ' •' : ''}`);
270
- _$insert(_el$0, _$createComponent(Show, {
343
+ }), _el$16);
344
+ _$insert(_el$16, () => ` ${props.part?.figure}${props.binding ? ' •' : ''}`);
345
+ _$insert(_el$13, _$createComponent(Show, {
271
346
  get when() {
272
347
  return reset();
273
348
  },
274
349
  get children() {
275
- var _el$12 = _$createElement("text");
276
- _$insert(_el$12, reset);
277
- _$effect(_$p => _$setProp(_el$12, "fg", props.theme.textMuted, _$p));
278
- return _el$12;
350
+ var _el$17 = _$createElement("text");
351
+ _$insert(_el$17, reset);
352
+ _$effect(_$p => _$setProp(_el$17, "fg", props.theme.textMuted, _$p));
353
+ return _el$17;
279
354
  }
280
355
  }), null);
281
356
  _$effect(_p$ => {
282
- var _v$5 = props.theme.textMuted,
283
- _v$6 = toneColor(props.theme, usageTone(used(), props.appearance));
284
- _v$5 !== _p$.e && (_p$.e = _$setProp(_el$10, "fg", _v$5, _p$.e));
285
- _v$6 !== _p$.t && (_p$.t = _$setProp(_el$11, "fg", _v$6, _p$.t));
357
+ var _v$1 = props.theme.textMuted,
358
+ _v$10 = toneColor(props.theme, usageTone(used(), props.appearance));
359
+ _v$1 !== _p$.e && (_p$.e = _$setProp(_el$15, "fg", _v$1, _p$.e));
360
+ _v$10 !== _p$.t && (_p$.t = _$setProp(_el$16, "fg", _v$10, _p$.t));
286
361
  return _p$;
287
362
  }, {
288
363
  e: undefined,
289
364
  t: undefined
290
365
  });
291
- return _el$0;
366
+ return _el$13;
292
367
  })(), _$createComponent(Show, {
293
368
  get when() {
294
369
  return paceLine();
295
370
  },
296
371
  get children() {
297
- var _el$13 = _$createElement("box"),
298
- _el$14 = _$createElement("text"),
299
- _el$16 = _$createElement("text");
300
- _$insertNode(_el$13, _el$14);
301
- _$insertNode(_el$13, _el$16);
302
- _$setProp(_el$13, "width", '100%');
303
- _$setProp(_el$13, "flexDirection", 'row');
304
- _$insertNode(_el$14, _$createTextNode(` `));
305
- _$insert(_el$16, paceLine);
372
+ var _el$18 = _$createElement("box"),
373
+ _el$19 = _$createElement("text"),
374
+ _el$20 = _$createElement("text");
375
+ _$insertNode(_el$18, _el$19);
376
+ _$insertNode(_el$18, _el$20);
377
+ _$setProp(_el$18, "width", '100%');
378
+ _$setProp(_el$18, "flexDirection", 'row');
379
+ _$insert(_el$19, () => formatQuotaRowLabel('', 11));
380
+ _$insert(_el$20, paceLine);
306
381
  _$effect(_p$ => {
307
- var _v$7 = props.theme.textMuted,
308
- _v$8 = toneColor(props.theme, props.pacing?.state === 'deficit' ? 'warn' : 'muted');
309
- _v$7 !== _p$.e && (_p$.e = _$setProp(_el$14, "fg", _v$7, _p$.e));
310
- _v$8 !== _p$.t && (_p$.t = _$setProp(_el$16, "fg", _v$8, _p$.t));
382
+ var _v$11 = props.theme.textMuted,
383
+ _v$12 = toneColor(props.theme, props.pacing?.state === 'deficit' ? 'warn' : 'muted');
384
+ _v$11 !== _p$.e && (_p$.e = _$setProp(_el$19, "fg", _v$11, _p$.e));
385
+ _v$12 !== _p$.t && (_p$.t = _$setProp(_el$20, "fg", _v$12, _p$.t));
311
386
  return _p$;
312
387
  }, {
313
388
  e: undefined,
314
389
  t: undefined
315
390
  });
316
- return _el$13;
391
+ return _el$18;
317
392
  }
318
393
  })];
319
394
  }
@@ -324,38 +399,56 @@ function QuotaRow(props) {
324
399
  // Pacing is computed here — per window, against the wall clock at render time
325
400
  // (re-evaluated on every state poll) — and disabled by passing false.
326
401
  function AccountBlock(props) {
327
- const statusWord = () => props.needsReauth ? 're-login' : props.vaultReauth ? 'vault reauth' : props.active ? 'active' : 'idle';
328
- const statusTone = () => props.needsReauth || props.vaultReauth ? 'warn' : props.active ? 'ok' : 'muted';
329
- const pacingFor = (window, windowMs) => props.pacingEnabled && window ? computeQuotaPacing(window, windowMs, Date.now()) : null;
402
+ const statusWord = () => props.quotaDated && props.quota ? 'dated' : props.needsReauth ? 're-login' : props.vaultReauth ? 'needs sign-in in the vault' : props.active ? 'active' : 'idle';
403
+ const statusTone = () => props.needsReauth || props.vaultReauth || props.stateLine ? 'warn' : props.active ? 'ok' : 'muted';
404
+ const pacingFor = (window, windowMs) => props.pacingEnabled && !props.quotaDated && window ? computeQuotaPacing(window, windowMs, Date.now()) : null;
405
+ const parts = () => {
406
+ const now = Date.now();
407
+ return quotaWindowParts(quotaDisplayProjection(props.quota, now), {
408
+ now
409
+ });
410
+ };
411
+ const partFor = name => parts().windows.find(part => part.name === name);
330
412
  return (() => {
331
- var _el$22 = _$createElement("box"),
332
- _el$23 = _$createElement("box"),
333
- _el$24 = _$createElement("text"),
334
- _el$25 = _$createElement("b"),
335
- _el$26 = _$createElement("text"),
336
- _el$27 = _$createElement("b");
337
- _$insertNode(_el$22, _el$23);
338
- _$setProp(_el$22, "width", '100%');
339
- _$setProp(_el$22, "flexDirection", 'column');
340
- _$insertNode(_el$23, _el$24);
341
- _$insertNode(_el$23, _el$26);
342
- _$setProp(_el$23, "width", '100%');
343
- _$setProp(_el$23, "flexDirection", 'row');
344
- _$setProp(_el$23, "justifyContent", 'space-between');
345
- _$insertNode(_el$24, _el$25);
346
- _$insert(_el$25, () => `${props.name}${props.tierLabel ? ` · ${props.tierLabel}` : ''}`);
413
+ var _el$26 = _$createElement("box"),
414
+ _el$27 = _$createElement("box"),
415
+ _el$28 = _$createElement("text"),
416
+ _el$29 = _$createElement("b"),
417
+ _el$30 = _$createElement("text"),
418
+ _el$31 = _$createElement("b");
347
419
  _$insertNode(_el$26, _el$27);
348
- _$insert(_el$27, statusWord);
349
- _$insert(_el$22, _$createComponent(Show, {
420
+ _$setProp(_el$26, "width", '100%');
421
+ _$setProp(_el$26, "flexDirection", 'column');
422
+ _$insertNode(_el$27, _el$28);
423
+ _$insertNode(_el$27, _el$30);
424
+ _$setProp(_el$27, "width", '100%');
425
+ _$setProp(_el$27, "flexDirection", 'row');
426
+ _$setProp(_el$27, "justifyContent", 'space-between');
427
+ _$insertNode(_el$28, _el$29);
428
+ _$insert(_el$29, () => `${props.name}${props.tierLabel ? ` · ${props.tierLabel}` : ''}`);
429
+ _$insertNode(_el$30, _el$31);
430
+ _$insert(_el$31, statusWord);
431
+ _$insert(_el$26, _$createComponent(Show, {
432
+ get when() {
433
+ return props.stateLine;
434
+ },
435
+ get children() {
436
+ var _el$32 = _$createElement("text");
437
+ _$insert(_el$32, () => props.stateLine);
438
+ _$effect(_$p => _$setProp(_el$32, "fg", props.theme.textMuted, _$p));
439
+ return _el$32;
440
+ }
441
+ }), null);
442
+ _$insert(_el$26, _$createComponent(Show, {
350
443
  get when() {
351
444
  return props.quota;
352
445
  },
353
446
  get fallback() {
354
447
  return (() => {
355
- var _el$30 = _$createElement("text");
356
- _$insertNode(_el$30, _$createTextNode(`checking…`));
357
- _$effect(_$p => _$setProp(_el$30, "fg", props.theme.textMuted, _$p));
358
- return _el$30;
448
+ var _el$36 = _$createElement("text");
449
+ _$insertNode(_el$36, _$createTextNode(`checking…`));
450
+ _$effect(_$p => _$setProp(_el$36, "fg", props.theme.textMuted, _$p));
451
+ return _el$36;
359
452
  })();
360
453
  },
361
454
  get children() {
@@ -367,8 +460,11 @@ function AccountBlock(props) {
367
460
  return props.appearance;
368
461
  },
369
462
  label: "5h",
370
- get window() {
371
- return props.quota?.five_hour;
463
+ get part() {
464
+ return partFor('5h');
465
+ },
466
+ get usedPercent() {
467
+ return props.quota?.five_hour?.usedPercent;
372
468
  },
373
469
  get pacing() {
374
470
  return pacingFor(props.quota?.five_hour, FIVE_HOUR_MS);
@@ -384,8 +480,11 @@ function AccountBlock(props) {
384
480
  return props.appearance;
385
481
  },
386
482
  label: "7d",
387
- get window() {
388
- return props.quota?.seven_day;
483
+ get part() {
484
+ return partFor('7d');
485
+ },
486
+ get usedPercent() {
487
+ return props.quota?.seven_day?.usedPercent;
389
488
  },
390
489
  get pacing() {
391
490
  return pacingFor(props.quota?.seven_day, SEVEN_DAY_MS);
@@ -405,9 +504,14 @@ function AccountBlock(props) {
405
504
  return props.appearance;
406
505
  },
407
506
  get label() {
408
- return formatScopedQuotaLabel(window.title);
507
+ return partFor(window.title)?.name ?? window.title;
508
+ },
509
+ get part() {
510
+ return partFor(window.title);
511
+ },
512
+ get usedPercent() {
513
+ return window.usedPercent;
409
514
  },
410
- window: window,
411
515
  get pacing() {
412
516
  return pacingFor(window, SEVEN_DAY_MS);
413
517
  },
@@ -417,44 +521,53 @@ function AccountBlock(props) {
417
521
  })
418
522
  }), _$createComponent(Show, {
419
523
  get when() {
420
- return props.quota?.extraUsage;
524
+ return partFor('credits');
421
525
  },
422
- children: extraUsage => (() => {
423
- var _el$32 = _$createElement("text");
424
- _$insert(_el$32, () => `credits ${formatQuotaMoney(extraUsage().used)}/${formatQuotaMoney(extraUsage().limit)}${extraUsage().exhausted ? ' · exhausted' : ''}`);
425
- _$effect(_$p => _$setProp(_el$32, "fg", toneColor(props.theme, extraUsage().severity === 'critical' ? 'err' : extraUsage().severity === 'warning' || extraUsage().exhausted ? 'warn' : 'muted'), _$p));
426
- return _el$32;
526
+ children: budget => (() => {
527
+ var _el$38 = _$createElement("text");
528
+ _$insert(_el$38, () => budget().figure);
529
+ _$effect(_$p => _$setProp(_el$38, "fg", toneColor(props.theme, props.quota?.extraUsage?.severity === 'critical' ? 'err' : props.quota?.extraUsage?.severity === 'warning' || props.quota?.extraUsage?.exhausted ? 'warn' : 'muted'), _$p));
530
+ return _el$38;
427
531
  })()
532
+ }), _$createComponent(Show, {
533
+ get when() {
534
+ return parts().age;
535
+ },
536
+ get children() {
537
+ var _el$33 = _$createElement("text");
538
+ _$insert(_el$33, () => parts().age);
539
+ _$effect(_$p => _$setProp(_el$33, "fg", props.theme.textMuted, _$p));
540
+ return _el$33;
541
+ }
428
542
  }), _$createComponent(Show, {
429
543
  get when() {
430
544
  return props.quota?.fallbackAdvised === true;
431
545
  },
432
546
  get children() {
433
- var _el$28 = _$createElement("text");
434
- _$insertNode(_el$28, _$createTextNode(`→ fallback advised`));
435
- _$effect(_$p => _$setProp(_el$28, "fg", props.theme.textMuted, _$p));
436
- return _el$28;
547
+ var _el$34 = _$createElement("text");
548
+ _$insertNode(_el$34, _$createTextNode(`→ fallback advised`));
549
+ _$effect(_$p => _$setProp(_el$34, "fg", props.theme.textMuted, _$p));
550
+ return _el$34;
437
551
  }
438
552
  })];
439
553
  }
440
554
  }), null);
441
555
  _$effect(_p$ => {
442
- var _v$1 = props.marginTop ?? 0,
443
- _v$10 = props.theme.text,
444
- _v$11 = toneColor(props.theme, statusTone());
445
- _v$1 !== _p$.e && (_p$.e = _$setProp(_el$22, "marginTop", _v$1, _p$.e));
446
- _v$10 !== _p$.t && (_p$.t = _$setProp(_el$24, "fg", _v$10, _p$.t));
447
- _v$11 !== _p$.a && (_p$.a = _$setProp(_el$26, "fg", _v$11, _p$.a));
556
+ var _v$15 = props.marginTop ?? 0,
557
+ _v$16 = props.theme.text,
558
+ _v$17 = toneColor(props.theme, statusTone());
559
+ _v$15 !== _p$.e && (_p$.e = _$setProp(_el$26, "marginTop", _v$15, _p$.e));
560
+ _v$16 !== _p$.t && (_p$.t = _$setProp(_el$28, "fg", _v$16, _p$.t));
561
+ _v$17 !== _p$.a && (_p$.a = _$setProp(_el$30, "fg", _v$17, _p$.a));
448
562
  return _p$;
449
563
  }, {
450
564
  e: undefined,
451
565
  t: undefined,
452
566
  a: undefined
453
567
  });
454
- return _el$22;
568
+ return _el$26;
455
569
  })();
456
570
  }
457
- export { formatQuotaMoney };
458
571
 
459
572
  // --- Quota dialog content ---------------------------------------------------
460
573
 
@@ -477,28 +590,28 @@ function QuotaDialogContent(props) {
477
590
  });
478
591
  setTimeout(refresh, 0);
479
592
  const theme = () => props.api.theme.current;
480
- const enabledFallbacks = () => (state().fallbacks ?? []).filter(f => f.enabled);
593
+ const enabledFallbacks = () => (state().fallbacks ?? []).filter(f => f.enabled || f.custodyState && f.custodyState !== 'off');
481
594
  return (() => {
482
- var _el$33 = _$createElement("box"),
483
- _el$34 = _$createElement("box"),
484
- _el$35 = _$createElement("box"),
485
- _el$36 = _$createElement("text"),
486
- _el$37 = _$createElement("b");
487
- _$insertNode(_el$33, _el$34);
488
- _$setProp(_el$33, "flexDirection", 'column');
489
- _$setProp(_el$33, "padding", 2);
490
- _$setProp(_el$33, "width", '100%');
491
- _$setProp(_el$33, "alignItems", 'center');
492
- _$insertNode(_el$34, _el$35);
493
- _$setProp(_el$34, "flexDirection", 'column');
494
- _$setProp(_el$34, "width", 58);
495
- _$insertNode(_el$35, _el$36);
496
- _$setProp(_el$35, "width", '100%');
497
- _$setProp(_el$35, "justifyContent", 'center');
498
- _$setProp(_el$35, "marginBottom", 1);
499
- _$insertNode(_el$36, _el$37);
500
- _$insertNode(_el$37, _$createTextNode(`Quota`));
501
- _$insert(_el$34, _$createComponent(AccountBlock, {
595
+ var _el$39 = _$createElement("box"),
596
+ _el$40 = _$createElement("box"),
597
+ _el$41 = _$createElement("box"),
598
+ _el$42 = _$createElement("text"),
599
+ _el$43 = _$createElement("b");
600
+ _$insertNode(_el$39, _el$40);
601
+ _$setProp(_el$39, "flexDirection", 'column');
602
+ _$setProp(_el$39, "padding", 2);
603
+ _$setProp(_el$39, "width", '100%');
604
+ _$setProp(_el$39, "alignItems", 'center');
605
+ _$insertNode(_el$40, _el$41);
606
+ _$setProp(_el$40, "flexDirection", 'column');
607
+ _$setProp(_el$40, "width", 58);
608
+ _$insertNode(_el$41, _el$42);
609
+ _$setProp(_el$41, "width", '100%');
610
+ _$setProp(_el$41, "justifyContent", 'center');
611
+ _$setProp(_el$41, "marginBottom", 1);
612
+ _$insertNode(_el$42, _el$43);
613
+ _$insertNode(_el$43, _$createTextNode(`Quota`));
614
+ _$insert(_el$40, _$createComponent(AccountBlock, {
502
615
  get theme() {
503
616
  return theme();
504
617
  },
@@ -517,9 +630,15 @@ function QuotaDialogContent(props) {
517
630
  },
518
631
  get tierLabel() {
519
632
  return state().main?.tierLabel;
633
+ },
634
+ get stateLine() {
635
+ return state().main?.stateLine;
636
+ },
637
+ get quotaDated() {
638
+ return state().main?.quotaDated;
520
639
  }
521
640
  }), null);
522
- _$insert(_el$34, _$createComponent(Show, {
641
+ _$insert(_el$40, _$createComponent(Show, {
523
642
  get when() {
524
643
  return prefs().sections.fallbackAccounts;
525
644
  },
@@ -553,13 +672,22 @@ function QuotaDialogContent(props) {
553
672
  get needsReauth() {
554
673
  return fb.needsReauth;
555
674
  },
675
+ get vaultReauth() {
676
+ return fb.vaultReauth;
677
+ },
678
+ get stateLine() {
679
+ return fb.stateLine;
680
+ },
681
+ get quotaDated() {
682
+ return fb.quotaDated;
683
+ },
556
684
  marginTop: 1
557
685
  })
558
686
  });
559
687
  }
560
688
  }), null);
561
- _$effect(_$p => _$setProp(_el$36, "fg", theme().text, _$p));
562
- return _el$33;
689
+ _$effect(_$p => _$setProp(_el$42, "fg", theme().text, _$p));
690
+ return _el$39;
563
691
  })();
564
692
  }
565
693
 
@@ -651,8 +779,8 @@ function QuotaSidebar(props) {
651
779
  for (const u of unsubs) u();
652
780
  });
653
781
  const theme = () => props.api.theme.current;
654
- const enabledFallbacks = () => (state().fallbacks ?? []).filter(f => f.enabled);
655
- const hasData = () => state().main?.quota != null || enabledFallbacks().length > 0;
782
+ const enabledFallbacks = () => (state().fallbacks ?? []).filter(f => f.enabled || f.custodyState && f.custodyState !== 'off');
783
+ const hasData = () => state().main?.quota != null || state().main?.stateLine != null || enabledFallbacks().length > 0;
656
784
  const headerLabel = () => {
657
785
  const name = prefs().header.label;
658
786
  return !hasData() ? name : collapsed() ? `\u25b6 ${name}` : `\u25bc ${name}`;
@@ -661,6 +789,7 @@ function QuotaSidebar(props) {
661
789
  const activeQuotaSummary = () => getCollapsedQuotaSummary(activeAccount().quota);
662
790
  const activePacingDeficit = () => {
663
791
  if (!prefs().sections.pacing) return false;
792
+ if (activeAccount().quotaDated) return null;
664
793
  const quota = activeAccount().quota;
665
794
  if (!quota) return false;
666
795
  const now = Date.now();
@@ -695,33 +824,33 @@ function QuotaSidebar(props) {
695
824
  return `${r.transport} \u00b7 ${r.enabled ? 'on' : 'off'}`;
696
825
  };
697
826
  return (() => {
698
- var _el$39 = _$createElement("box"),
699
- _el$40 = _$createElement("box"),
700
- _el$41 = _$createElement("box"),
701
- _el$42 = _$createElement("text"),
702
- _el$43 = _$createElement("b");
703
- _$insertNode(_el$39, _el$40);
704
- _$setProp(_el$39, "width", '100%');
705
- _$setProp(_el$39, "flexDirection", 'column');
706
- _$setProp(_el$39, "border", SINGLE_BORDER);
707
- _$setProp(_el$39, "paddingTop", 1);
708
- _$setProp(_el$39, "paddingBottom", 1);
709
- _$setProp(_el$39, "paddingLeft", 1);
710
- _$setProp(_el$39, "paddingRight", 1);
711
- _$insertNode(_el$40, _el$41);
712
- _$setProp(_el$40, "width", '100%');
713
- _$setProp(_el$40, "flexDirection", 'row');
714
- _$setProp(_el$40, "justifyContent", 'space-between');
715
- _$setProp(_el$40, "alignItems", 'center');
716
- _$setProp(_el$40, "onMouseDown", () => {
827
+ var _el$45 = _$createElement("box"),
828
+ _el$46 = _$createElement("box"),
829
+ _el$47 = _$createElement("box"),
830
+ _el$48 = _$createElement("text"),
831
+ _el$49 = _$createElement("b");
832
+ _$insertNode(_el$45, _el$46);
833
+ _$setProp(_el$45, "width", '100%');
834
+ _$setProp(_el$45, "flexDirection", 'column');
835
+ _$setProp(_el$45, "border", SINGLE_BORDER);
836
+ _$setProp(_el$45, "paddingTop", 1);
837
+ _$setProp(_el$45, "paddingBottom", 1);
838
+ _$setProp(_el$45, "paddingLeft", 1);
839
+ _$setProp(_el$45, "paddingRight", 1);
840
+ _$insertNode(_el$46, _el$47);
841
+ _$setProp(_el$46, "width", '100%');
842
+ _$setProp(_el$46, "flexDirection", 'row');
843
+ _$setProp(_el$46, "justifyContent", 'space-between');
844
+ _$setProp(_el$46, "alignItems", 'center');
845
+ _$setProp(_el$46, "onMouseDown", () => {
717
846
  if (hasData()) props.controller.toggleCollapsed();
718
847
  });
719
- _$insertNode(_el$41, _el$42);
720
- _$setProp(_el$41, "paddingLeft", 1);
721
- _$setProp(_el$41, "paddingRight", 1);
722
- _$insertNode(_el$42, _el$43);
723
- _$insert(_el$43, headerLabel);
724
- _$insert(_el$40, _$createComponent(Show, {
848
+ _$insertNode(_el$47, _el$48);
849
+ _$setProp(_el$47, "paddingLeft", 1);
850
+ _$setProp(_el$47, "paddingRight", 1);
851
+ _$insertNode(_el$48, _el$49);
852
+ _$insert(_el$49, headerLabel);
853
+ _$insert(_el$46, _$createComponent(Show, {
725
854
  get when() {
726
855
  return degraded();
727
856
  },
@@ -731,70 +860,53 @@ function QuotaSidebar(props) {
731
860
  return prefs().header.showVersion && PLUGIN_VERSION !== '';
732
861
  },
733
862
  get children() {
734
- var _el$53 = _$createElement("text");
735
- _$insert(_el$53, `v${PLUGIN_VERSION}`);
736
- _$effect(_$p => _$setProp(_el$53, "fg", theme().textMuted, _$p));
737
- return _el$53;
863
+ var _el$57 = _$createElement("text");
864
+ _$insert(_el$57, `v${PLUGIN_VERSION}`);
865
+ _$effect(_$p => _$setProp(_el$57, "fg", theme().textMuted, _$p));
866
+ return _el$57;
738
867
  }
739
868
  });
740
869
  },
741
870
  get children() {
742
- var _el$44 = _$createElement("box"),
743
- _el$45 = _$createElement("text"),
744
- _el$46 = _$createElement("b");
745
- _$insertNode(_el$44, _el$45);
746
- _$setProp(_el$44, "paddingLeft", 1);
747
- _$setProp(_el$44, "paddingRight", 1);
748
- _$insertNode(_el$45, _el$46);
749
- _$insertNode(_el$46, _$createTextNode(`LIMITED`));
871
+ var _el$50 = _$createElement("box"),
872
+ _el$51 = _$createElement("text"),
873
+ _el$52 = _$createElement("b");
874
+ _$insertNode(_el$50, _el$51);
875
+ _$setProp(_el$50, "paddingLeft", 1);
876
+ _$setProp(_el$50, "paddingRight", 1);
877
+ _$insertNode(_el$51, _el$52);
878
+ _$insertNode(_el$52, _$createTextNode(`LIMITED`));
750
879
  _$effect(_p$ => {
751
- var _v$12 = theme().warning,
752
- _v$13 = theme().background;
753
- _v$12 !== _p$.e && (_p$.e = _$setProp(_el$44, "backgroundColor", _v$12, _p$.e));
754
- _v$13 !== _p$.t && (_p$.t = _$setProp(_el$45, "fg", _v$13, _p$.t));
880
+ var _v$18 = theme().warning,
881
+ _v$19 = theme().background;
882
+ _v$18 !== _p$.e && (_p$.e = _$setProp(_el$50, "backgroundColor", _v$18, _p$.e));
883
+ _v$19 !== _p$.t && (_p$.t = _$setProp(_el$51, "fg", _v$19, _p$.t));
755
884
  return _p$;
756
885
  }, {
757
886
  e: undefined,
758
887
  t: undefined
759
888
  });
760
- return _el$44;
889
+ return _el$50;
761
890
  }
762
891
  }), null);
763
- _$insert(_el$39, _$createComponent(Show, {
892
+ _$insert(_el$45, _$createComponent(Show, {
764
893
  get when() {
765
894
  return _$memo(() => !!collapsed())() && hasData();
766
895
  },
767
896
  get children() {
768
- return [_$createComponent(CollapsedRow, {
769
- get theme() {
770
- return theme();
771
- },
772
- get label() {
773
- return activeAccount().name;
897
+ return [_$createComponent(For, {
898
+ get each() {
899
+ return getCollapsedAccounts(state(), prefs().sections.fallbackAccounts);
774
900
  },
775
- get children() {
776
- return _$createComponent(Show, {
777
- get when() {
778
- return activeQuotaSummary().text != null;
779
- },
780
- get fallback() {
781
- return (() => {
782
- var _el$54 = _$createElement("text");
783
- _$insertNode(_el$54, _$createTextNode(`—`));
784
- _$effect(_$p => _$setProp(_el$54, "fg", theme().textMuted, _$p));
785
- return _el$54;
786
- })();
787
- },
788
- get children() {
789
- var _el$48 = _$createElement("text"),
790
- _el$49 = _$createElement("b");
791
- _$insertNode(_el$48, _el$49);
792
- _$insert(_el$49, () => activeQuotaSummary().text);
793
- _$effect(_$p => _$setProp(_el$48, "fg", toneColor(theme(), activeQuotaTone()), _$p));
794
- return _el$48;
795
- }
796
- });
797
- }
901
+ children: account => _$createComponent(CollapsedAccountRow, {
902
+ get theme() {
903
+ return theme();
904
+ },
905
+ account: account,
906
+ get tone() {
907
+ return activeQuotaTone();
908
+ }
909
+ })
798
910
  }), _$createComponent(Show, {
799
911
  get when() {
800
912
  return state().fastMode;
@@ -806,12 +918,12 @@ function QuotaSidebar(props) {
806
918
  },
807
919
  label: "Mode",
808
920
  get children() {
809
- var _el$50 = _$createElement("text"),
810
- _el$51 = _$createElement("b");
811
- _$insertNode(_el$50, _el$51);
812
- _$insertNode(_el$51, _$createTextNode(`fast`));
813
- _$effect(_$p => _$setProp(_el$50, "fg", toneColor(theme(), 'accent'), _$p));
814
- return _el$50;
921
+ var _el$54 = _$createElement("text"),
922
+ _el$55 = _$createElement("b");
923
+ _$insertNode(_el$54, _el$55);
924
+ _$insertNode(_el$55, _$createTextNode(`fast`));
925
+ _$effect(_$p => _$setProp(_el$54, "fg", toneColor(theme(), 'accent'), _$p));
926
+ return _el$54;
815
927
  }
816
928
  });
817
929
  }
@@ -825,18 +937,18 @@ function QuotaSidebar(props) {
825
937
  },
826
938
  label: "Recovery",
827
939
  get children() {
828
- var _el$56 = _$createElement("text"),
829
- _el$57 = _$createElement("b");
830
- _$insertNode(_el$56, _el$57);
831
- _$insert(_el$57, summary);
832
- _$effect(_$p => _$setProp(_el$56, "fg", toneColor(theme(), fableRecoveryTone()), _$p));
833
- return _el$56;
940
+ var _el$58 = _$createElement("text"),
941
+ _el$59 = _$createElement("b");
942
+ _$insertNode(_el$58, _el$59);
943
+ _$insert(_el$59, summary);
944
+ _$effect(_$p => _$setProp(_el$58, "fg", toneColor(theme(), fableRecoveryTone()), _$p));
945
+ return _el$58;
834
946
  }
835
947
  })
836
948
  })];
837
949
  }
838
950
  }), null);
839
- _$insert(_el$39, _$createComponent(Show, {
951
+ _$insert(_el$45, _$createComponent(Show, {
840
952
  get when() {
841
953
  return !collapsed() || !hasData();
842
954
  },
@@ -847,14 +959,14 @@ function QuotaSidebar(props) {
847
959
  },
848
960
  get fallback() {
849
961
  return (() => {
850
- var _el$58 = _$createElement("box"),
851
- _el$59 = _$createElement("text");
852
- _$insertNode(_el$58, _el$59);
853
- _$setProp(_el$58, "marginTop", 1);
854
- _$setProp(_el$58, "width", '100%');
855
- _$insertNode(_el$59, _$createTextNode(`Waiting for quota…`));
856
- _$effect(_$p => _$setProp(_el$59, "fg", theme().textMuted, _$p));
857
- return _el$58;
962
+ var _el$60 = _$createElement("box"),
963
+ _el$61 = _$createElement("text");
964
+ _$insertNode(_el$60, _el$61);
965
+ _$setProp(_el$60, "marginTop", 1);
966
+ _$setProp(_el$60, "width", '100%');
967
+ _$insertNode(_el$61, _$createTextNode(`Waiting for quota…`));
968
+ _$effect(_$p => _$setProp(_el$61, "fg", theme().textMuted, _$p));
969
+ return _el$60;
858
970
  })();
859
971
  },
860
972
  get children() {
@@ -887,6 +999,12 @@ function QuotaSidebar(props) {
887
999
  },
888
1000
  get tierLabel() {
889
1001
  return state().main?.tierLabel;
1002
+ },
1003
+ get stateLine() {
1004
+ return state().main?.stateLine;
1005
+ },
1006
+ get quotaDated() {
1007
+ return state().main?.quotaDated;
890
1008
  }
891
1009
  }), _$createComponent(Show, {
892
1010
  get when() {
@@ -925,6 +1043,12 @@ function QuotaSidebar(props) {
925
1043
  get vaultReauth() {
926
1044
  return fb.vaultReauth;
927
1045
  },
1046
+ get stateLine() {
1047
+ return fb.stateLine;
1048
+ },
1049
+ get quotaDated() {
1050
+ return fb.quotaDated;
1051
+ },
928
1052
  marginTop: 1
929
1053
  })
930
1054
  });
@@ -1118,19 +1242,19 @@ function QuotaSidebar(props) {
1118
1242
  }
1119
1243
  }), null);
1120
1244
  _$effect(_p$ => {
1121
- var _v$14 = theme().borderActive,
1122
- _v$15 = theme().accent,
1123
- _v$16 = theme().background;
1124
- _v$14 !== _p$.e && (_p$.e = _$setProp(_el$39, "borderColor", _v$14, _p$.e));
1125
- _v$15 !== _p$.t && (_p$.t = _$setProp(_el$41, "backgroundColor", _v$15, _p$.t));
1126
- _v$16 !== _p$.a && (_p$.a = _$setProp(_el$42, "fg", _v$16, _p$.a));
1245
+ var _v$20 = theme().borderActive,
1246
+ _v$21 = theme().accent,
1247
+ _v$22 = theme().background;
1248
+ _v$20 !== _p$.e && (_p$.e = _$setProp(_el$45, "borderColor", _v$20, _p$.e));
1249
+ _v$21 !== _p$.t && (_p$.t = _$setProp(_el$47, "backgroundColor", _v$21, _p$.t));
1250
+ _v$22 !== _p$.a && (_p$.a = _$setProp(_el$48, "fg", _v$22, _p$.a));
1127
1251
  return _p$;
1128
1252
  }, {
1129
1253
  e: undefined,
1130
1254
  t: undefined,
1131
1255
  a: undefined
1132
1256
  });
1133
- return _el$39;
1257
+ return _el$45;
1134
1258
  })();
1135
1259
  }
1136
1260
  const tui = async api => {