dsh-subscriptions 0.2.0 → 0.2.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 (105) hide show
  1. package/README.md +220 -180
  2. package/lib/auth/claude-code-creds.js +31 -9
  3. package/lib/auth/device-flow.js +16 -9
  4. package/lib/auth/oauth-flow.js +13 -10
  5. package/lib/auth/rpc.d.ts +8 -4
  6. package/lib/auth/rpc.js +89 -25
  7. package/lib/auth/store.js +80 -31
  8. package/lib/client/CursorCard.d.ts +1 -1
  9. package/lib/client/CursorCard.js +50 -16
  10. package/lib/client/ExternalUsageCards.d.ts +1 -1
  11. package/lib/client/ExternalUsageCards.js +37 -16
  12. package/lib/client/ImageGallery.d.ts +2 -2
  13. package/lib/client/ImageGallery.js +92 -33
  14. package/lib/client/ImageGenerateToolview.js +50 -14
  15. package/lib/client/OllamaCard.d.ts +1 -1
  16. package/lib/client/OllamaCard.js +26 -8
  17. package/lib/client/OllamaSettingsManager.js +113 -30
  18. package/lib/client/ProviderAccountManager.d.ts +1 -1
  19. package/lib/client/ProviderAccountManager.js +164 -49
  20. package/lib/client/ProviderModelEditor.js +137 -34
  21. package/lib/client/SpeedSelect.d.ts +62 -14
  22. package/lib/client/SpeedSelect.js +261 -49
  23. package/lib/client/SubscriptionUsageBadge.d.ts +4 -10
  24. package/lib/client/SubscriptionUsageBadge.js +300 -112
  25. package/lib/client/SubscriptionsSection.d.ts +2 -0
  26. package/lib/client/SubscriptionsSection.js +265 -85
  27. package/lib/client/UsageBadgeDisplaySetting.js +35 -12
  28. package/lib/client/UsageMeter.d.ts +1 -1
  29. package/lib/client/UsageMeter.js +62 -24
  30. package/lib/client/VideoGenerateToolview.js +69 -17
  31. package/lib/client/account-preferences.d.ts +8 -0
  32. package/lib/client/account-preferences.js +20 -5
  33. package/lib/client/host-contract.d.ts +11 -2
  34. package/lib/client/host-contract.js +20 -3
  35. package/lib/client/index.d.ts +5 -5
  36. package/lib/client/index.js +34 -12
  37. package/lib/client/locales.d.ts +22 -0
  38. package/lib/client/locales.js +73 -51
  39. package/lib/client/model-filter.d.ts +37 -0
  40. package/lib/client/model-filter.js +45 -0
  41. package/lib/client/ollama-draft.js +21 -12
  42. package/lib/client/reset-action.js +6 -4
  43. package/lib/client/reset-credits-view.d.ts +1 -1
  44. package/lib/client/reset-credits-view.js +66 -17
  45. package/lib/client/subscription-card-styles.js +94 -24
  46. package/lib/client/usage-color-preferences.js +4 -2
  47. package/lib/client/usage-pace.js +30 -12
  48. package/lib/client/usage-window-filter.d.ts +7 -0
  49. package/lib/client/usage-window-filter.js +12 -0
  50. package/lib/client.js +480 -136
  51. package/lib/client.js.map +1 -1
  52. package/lib/http.js +1 -1
  53. package/lib/index.d.ts +3 -3
  54. package/lib/index.js +167 -76
  55. package/lib/model-defaults.js +4 -2
  56. package/lib/provider-settings.d.ts +17 -0
  57. package/lib/provider-settings.js +79 -16
  58. package/lib/providers/account-preferences.js +51 -22
  59. package/lib/providers/accounts.js +15 -9
  60. package/lib/providers/antigravity-oauth-client.js +2 -2
  61. package/lib/providers/antigravity.js +141 -68
  62. package/lib/providers/catalog-store.js +120 -41
  63. package/lib/providers/claude-cli-version.js +3 -3
  64. package/lib/providers/claude.d.ts +9 -2
  65. package/lib/providers/claude.js +153 -90
  66. package/lib/providers/codex-client-version.js +3 -3
  67. package/lib/providers/codex-search.js +40 -13
  68. package/lib/providers/codex.js +196 -112
  69. package/lib/providers/common.js +71 -39
  70. package/lib/providers/copilot.js +143 -82
  71. package/lib/providers/cursor-adapter.js +42 -18
  72. package/lib/providers/cursor-auth.d.ts +1 -1
  73. package/lib/providers/cursor-auth.js +69 -24
  74. package/lib/providers/cursor-model-settings.js +14 -5
  75. package/lib/providers/cursor-usage.js +27 -13
  76. package/lib/providers/external-usage-controller.js +14 -5
  77. package/lib/providers/external-usage.js +59 -23
  78. package/lib/providers/grok.js +152 -89
  79. package/lib/providers/image-pool.js +29 -11
  80. package/lib/providers/minimax-usage.js +31 -11
  81. package/lib/providers/npm-cli-version.js +10 -3
  82. package/lib/providers/ollama-settings.js +24 -8
  83. package/lib/providers/ollama-web.js +29 -11
  84. package/lib/providers/ollama.js +129 -66
  85. package/lib/providers/pool-family.js +11 -3
  86. package/lib/providers/pool-health.js +28 -8
  87. package/lib/providers/pool-usage.js +16 -9
  88. package/lib/providers/pool.d.ts +8 -0
  89. package/lib/providers/pool.js +81 -42
  90. package/lib/providers/rate-limit.js +8 -2
  91. package/lib/providers/replay.js +40 -17
  92. package/lib/providers/reset-redemption.js +18 -6
  93. package/lib/tools/image-generate.js +123 -65
  94. package/lib/tools/registration.js +5 -2
  95. package/lib/tools/video-generate.js +51 -31
  96. package/lib/tools/x-search.js +50 -22
  97. package/lib/translate/anthropic.js +85 -37
  98. package/lib/translate/antigravity-schema.js +71 -28
  99. package/lib/translate/antigravity-thinking.js +22 -9
  100. package/lib/translate/antigravity.js +151 -52
  101. package/lib/translate/chat-completions.js +67 -23
  102. package/lib/translate/resolved.js +55 -21
  103. package/lib/translate/responses.js +69 -29
  104. package/lib/translate/sse.js +4 -1
  105. package/package.json +27 -4
@@ -1,48 +1,118 @@
1
1
  /** Shared visual language for OAuth, Cursor, and built-in provider cards. */
2
2
  export const subscriptionCardStyles = {
3
3
  card: {
4
- border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 12,
5
- padding: '12px 14px', display: 'flex', flexDirection: 'column', gap: 6,
4
+ border: '1px solid var(--dsw-alias-border-l2)',
5
+ borderRadius: 12,
6
+ padding: '12px 14px',
7
+ display: 'flex',
8
+ flexDirection: 'column',
9
+ gap: 6,
6
10
  color: 'var(--dsw-alias-label-primary)',
7
11
  },
8
12
  header: { display: 'flex', alignItems: 'center', gap: 8 },
9
13
  dot: { width: 8, height: 8, borderRadius: '50%', flexShrink: 0 },
10
- name: { fontWeight: 500, fontSize: 14, lineHeight: '22px', color: 'var(--dsw-alias-label-primary)' },
11
- status: { margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-tertiary)' },
12
- error: { margin: 0, fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-state-error-primary)' },
13
- actions: { display: 'flex', gap: 8, marginTop: 4, alignItems: 'center', flexWrap: 'wrap' },
14
+ name: {
15
+ fontWeight: 500,
16
+ fontSize: 14,
17
+ lineHeight: '22px',
18
+ color: 'var(--dsw-alias-label-primary)',
19
+ },
20
+ status: {
21
+ margin: 0,
22
+ fontSize: 12,
23
+ lineHeight: '18px',
24
+ color: 'var(--dsw-alias-label-tertiary)',
25
+ },
26
+ error: {
27
+ margin: 0,
28
+ fontSize: 12,
29
+ lineHeight: '18px',
30
+ color: 'var(--dsw-alias-state-error-primary)',
31
+ },
32
+ actions: {
33
+ display: 'flex',
34
+ gap: 8,
35
+ marginTop: 4,
36
+ alignItems: 'center',
37
+ flexWrap: 'wrap',
38
+ },
14
39
  button: {
15
- boxSizing: 'border-box', display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
16
- height: 28, padding: '0 10px', borderRadius: 14,
17
- border: '1px solid var(--dsw-alias-border-l2)', background: 'transparent',
18
- color: 'var(--dsw-alias-label-primary)', font: 'inherit', fontSize: 12, lineHeight: '18px',
40
+ boxSizing: 'border-box',
41
+ display: 'inline-flex',
42
+ alignItems: 'center',
43
+ justifyContent: 'center',
44
+ height: 28,
45
+ padding: '0 10px',
46
+ borderRadius: 14,
47
+ border: '1px solid var(--dsw-alias-border-l2)',
48
+ background: 'transparent',
49
+ color: 'var(--dsw-alias-label-primary)',
50
+ font: 'inherit',
51
+ fontSize: 12,
52
+ lineHeight: '18px',
19
53
  cursor: 'pointer',
20
54
  },
21
55
  account: {
22
- display: 'flex', flexDirection: 'column', gap: 6,
23
- border: '1px solid var(--dsw-alias-border-l2)', borderRadius: 8,
24
- padding: '8px 10px', marginTop: 4,
56
+ display: 'flex',
57
+ flexDirection: 'column',
58
+ gap: 6,
59
+ border: '1px solid var(--dsw-alias-border-l2)',
60
+ borderRadius: 8,
61
+ padding: '8px 10px',
62
+ marginTop: 4,
25
63
  },
26
64
  accountHeader: { display: 'flex', alignItems: 'center', gap: 8 },
27
- accountName: { fontSize: 13, lineHeight: '20px', color: 'var(--dsw-alias-label-primary)', userSelect: 'all' },
65
+ accountName: {
66
+ fontSize: 13,
67
+ lineHeight: '20px',
68
+ color: 'var(--dsw-alias-label-primary)',
69
+ userSelect: 'all',
70
+ },
28
71
  defaultStar: { color: 'var(--dsw-alias-state-warn-label)' },
29
72
  usage: {
30
- display: 'flex', flexDirection: 'column', gap: 6, marginTop: 4,
31
- borderTop: '1px solid var(--dsw-alias-border-l2)', paddingTop: 8,
73
+ display: 'flex',
74
+ flexDirection: 'column',
75
+ gap: 6,
76
+ marginTop: 4,
77
+ borderTop: '1px solid var(--dsw-alias-border-l2)',
78
+ paddingTop: 8,
32
79
  },
33
80
  usageHeader: { display: 'flex', alignItems: 'center', gap: 8 },
34
- usageTitle: { fontSize: 12, lineHeight: '18px', fontWeight: 500, color: 'var(--dsw-alias-label-secondary)' },
35
- usagePlan: { fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-tertiary)' },
81
+ usageTitle: {
82
+ fontSize: 12,
83
+ lineHeight: '18px',
84
+ fontWeight: 500,
85
+ color: 'var(--dsw-alias-label-secondary)',
86
+ },
87
+ usagePlan: {
88
+ fontSize: 12,
89
+ lineHeight: '18px',
90
+ color: 'var(--dsw-alias-label-tertiary)',
91
+ },
36
92
  usageRefresh: {
37
- boxSizing: 'border-box', display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
38
- height: 22, padding: '0 8px', borderRadius: 11, marginLeft: 'auto',
39
- border: '1px solid var(--dsw-alias-border-l2)', background: 'transparent',
40
- color: 'var(--dsw-alias-label-secondary)', font: 'inherit', fontSize: 12, lineHeight: '18px',
93
+ boxSizing: 'border-box',
94
+ display: 'inline-flex',
95
+ alignItems: 'center',
96
+ justifyContent: 'center',
97
+ height: 22,
98
+ padding: '0 8px',
99
+ borderRadius: 11,
100
+ marginLeft: 'auto',
101
+ border: '1px solid var(--dsw-alias-border-l2)',
102
+ background: 'transparent',
103
+ color: 'var(--dsw-alias-label-secondary)',
104
+ font: 'inherit',
105
+ fontSize: 12,
106
+ lineHeight: '18px',
41
107
  cursor: 'pointer',
42
108
  },
43
109
  usageRow: { display: 'flex', flexDirection: 'column', gap: 3 },
44
110
  usageMeta: {
45
- display: 'flex', justifyContent: 'space-between', gap: 8,
46
- fontSize: 12, lineHeight: '18px', color: 'var(--dsw-alias-label-tertiary)',
111
+ display: 'flex',
112
+ justifyContent: 'space-between',
113
+ gap: 8,
114
+ fontSize: 12,
115
+ lineHeight: '18px',
116
+ color: 'var(--dsw-alias-label-tertiary)',
47
117
  },
48
118
  };
@@ -24,8 +24,10 @@ export function setUsageColorPreset(value) {
24
24
  window.dispatchEvent(new Event(EVENT));
25
25
  }
26
26
  export function subscribeUsageColorPreset(notify) {
27
- const storage = (event) => { if (event.key === KEY || event.key === null)
28
- notify(); };
27
+ const storage = (event) => {
28
+ if (event.key === KEY || event.key === null)
29
+ notify();
30
+ };
29
31
  window.addEventListener(EVENT, notify);
30
32
  window.addEventListener('storage', storage);
31
33
  return () => {
@@ -21,7 +21,7 @@ export function resetCountdownParts(ms) {
21
21
  { unit: 'hour', count: Math.floor((total % 1440) / 60) },
22
22
  { unit: 'minute', count: total % 60 },
23
23
  ];
24
- return parts.filter(part => part.count > 0).slice(0, 2);
24
+ return parts.filter((part) => part.count > 0).slice(0, 2);
25
25
  }
26
26
  /**
27
27
  * Whether the reported percentage still describes the window now. Only a fresh
@@ -30,10 +30,14 @@ export function resetCountdownParts(ms) {
30
30
  * drawn: where the window stands in time never depends on the reading.
31
31
  */
32
32
  export function isUsageFresh(window, observation, now = Date.now()) {
33
- return validUsage(window.usedPercent) && observation.stale !== true
34
- && observation.observedAt !== undefined && Number.isFinite(observation.observedAt)
35
- && observation.observedAt <= now && now - observation.observedAt <= USAGE_FRESHNESS_MS
36
- && (window.resetsAt === undefined || Number.isFinite(window.resetsAt) && window.resetsAt > now);
33
+ return (validUsage(window.usedPercent) &&
34
+ observation.stale !== true &&
35
+ observation.observedAt !== undefined &&
36
+ Number.isFinite(observation.observedAt) &&
37
+ observation.observedAt <= now &&
38
+ now - observation.observedAt <= USAGE_FRESHNESS_MS &&
39
+ (window.resetsAt === undefined ||
40
+ (Number.isFinite(window.resetsAt) && window.resetsAt > now)));
37
41
  }
38
42
  /**
39
43
  * How far through its window the clock is, from the window's own timing alone.
@@ -48,10 +52,19 @@ export function elapsedPercent(window, now = Date.now()) {
48
52
  if (end === undefined || !Number.isFinite(end) || end <= now)
49
53
  return undefined;
50
54
  const duration = window.windowDurationMs;
51
- const start = window.startsAt ?? (window.fixedWindow === true && duration !== undefined && Number.isFinite(duration) && duration > 0 ? end - duration : undefined);
52
- if (start === undefined || !Number.isFinite(start) || start >= end || start > now)
55
+ const start = window.startsAt ??
56
+ (window.fixedWindow === true &&
57
+ duration !== undefined &&
58
+ Number.isFinite(duration) &&
59
+ duration > 0
60
+ ? end - duration
61
+ : undefined);
62
+ if (start === undefined ||
63
+ !Number.isFinite(start) ||
64
+ start >= end ||
65
+ start > now)
53
66
  return undefined;
54
- return Math.min(100, Math.max(0, (now - start) / (end - start) * 100));
67
+ return Math.min(100, Math.max(0, ((now - start) / (end - start)) * 100));
55
68
  }
56
69
  export function usageColorState(used, elapsed, preset, fresh) {
57
70
  if (!validUsage(used))
@@ -65,8 +78,10 @@ export function usageColorState(used, elapsed, preset, fresh) {
65
78
  }
66
79
  export function usageBarColor(used, elapsed, preset = 'standard', fresh = true) {
67
80
  const state = usageColorState(used, elapsed, preset, fresh);
68
- return state === 'red' ? 'var(--dsw-alias-state-error-primary)'
69
- : state === 'yellow' ? 'var(--dsw-alias-state-warn-label)'
81
+ return state === 'red'
82
+ ? 'var(--dsw-alias-state-error-primary)'
83
+ : state === 'yellow'
84
+ ? 'var(--dsw-alias-state-warn-label)'
70
85
  : 'var(--dsw-alias-state-success-primary)';
71
86
  }
72
87
  /**
@@ -80,7 +95,10 @@ export function displayStartPercent(window, now = Date.now()) {
80
95
  const start = window.displayStartsAt;
81
96
  if (end === undefined || !Number.isFinite(end) || end <= now)
82
97
  return undefined;
83
- if (start === undefined || !Number.isFinite(start) || start >= end || start > now)
98
+ if (start === undefined ||
99
+ !Number.isFinite(start) ||
100
+ start >= end ||
101
+ start > now)
84
102
  return undefined;
85
- return Math.min(100, Math.max(0, (now - start) / (end - start) * 100));
103
+ return Math.min(100, Math.max(0, ((now - start) / (end - start)) * 100));
86
104
  }
@@ -0,0 +1,7 @@
1
+ import type { UsageWindow } from './SubscriptionsSection.js';
2
+ /**
3
+ * Keep model-scoped Google quotas aligned with the saved model-picker selection.
4
+ * Account-wide windows and other providers are unaffected; an absent selection
5
+ * follows discovery, while an empty selection hides every model-scoped window.
6
+ */
7
+ export declare function visibleUsageWindows(provider: string, windows: UsageWindow[] | undefined, visibleModels: string[] | undefined): UsageWindow[];
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Keep model-scoped Google quotas aligned with the saved model-picker selection.
3
+ * Account-wide windows and other providers are unaffected; an absent selection
4
+ * follows discovery, while an empty selection hides every model-scoped window.
5
+ */
6
+ export function visibleUsageWindows(provider, windows, visibleModels) {
7
+ if (windows === undefined)
8
+ return [];
9
+ if (provider !== 'antigravity' || visibleModels === undefined)
10
+ return windows;
11
+ return windows.filter((window) => !window.scope || visibleModels.includes(window.scope));
12
+ }