@goodandready/dsh-subscriptions 0.6.56 → 0.6.58

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.
package/lib/client.js CHANGED
@@ -60,7 +60,7 @@ window.__ModuleLoader__.load({
60
60
  '.dsub-helpBox{margin-top:8px;padding:12px 14px;border-radius:8px;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l1);font-size:12px;line-height:1.6}' +
61
61
  '.dsub-helpHead{display:flex;align-items:center;justify-content:space-between;font-weight:600;margin-bottom:8px;color:var(--dsw-alias-brand-primary)}' +
62
62
  '.dsub-helpStep{margin-bottom:6px;color:var(--dsw-alias-label-primary)}' +
63
- '.dsub-btnActive{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-text-contrast);border-color:var(--dsw-alias-brand-primary)}' +
63
+ '.dsub-btnActive{background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary-foreground);border-color:var(--dsw-alias-brand-primary)}' +
64
64
  '.dsub-h{font-size:13.5px;font-weight:600;color:var(--dsw-alias-label-primary)}' +
65
65
  '.dsub-sub{font-size:12px;color:var(--dsw-alias-label-secondary)}' +
66
66
  '.dsub-dim{font-size:11.5px;color:var(--dsw-alias-label-tertiary)}' +
@@ -74,14 +74,14 @@ window.__ModuleLoader__.load({
74
74
  '.dsub-inp{height:30px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);color:var(--dsw-alias-label-primary);border-radius:6px;padding:0 8px;font-size:12px;min-width:180px}' +
75
75
  '.dsub-inp:focus{outline:none;border-color:var(--dsw-alias-brand-primary)}' +
76
76
  '.dsub-box{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:10px;margin-top:8px;background:var(--dsw-alias-bg-layer-2)}' +
77
- '.dsub-cooldown{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-bg-layer-1);font-size:11px;font-weight:600}' +
77
+ '.dsub-cooldown{display:inline-block;padding:2px 6px;border-radius:4px;background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-bg-layer-1);font-size:11px;font-weight:600}' +
78
78
  '.dsub-bar{position:relative;height:6px;border-radius:3px;background:var(--dsw-alias-bg-layer-1);overflow:hidden;flex:1;min-width:80px}' +
79
79
  '.dsub-barFill{height:100%;border-radius:3px;background:var(--dsw-alias-state-success-primary);transition:width .2s}' +
80
- '.dsub-barWarn .dsub-barFill{background:var(--dsw-alias-state-warning-primary)}' +
80
+ '.dsub-barWarn .dsub-barFill{background:var(--dsw-alias-state-warn-primary)}' +
81
81
  '.dsub-barFull .dsub-barFill{background:var(--dsw-alias-state-error-primary)}' +
82
82
  '.dsub-barRow{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--dsw-alias-label-secondary)}' +
83
83
  '.dsub-manual{display:flex;flex-direction:column;gap:6px;margin-top:4px;padding-top:10px;border-top:1px solid var(--dsw-alias-border-l2)}' +
84
- '.dsub-verify{font-size:12px;color:var(--dsw-alias-state-warning-primary)}' +
84
+ '.dsub-verify{font-size:12px;color:var(--dsw-alias-state-warn-primary)}' +
85
85
  '.dsub-verify a{color:var(--dsw-alias-brand-primary)}' +
86
86
  '.dsub-pill{display:inline-flex;align-items:center;gap:7px;height:28px;padding:0 11px;border:1px solid var(--dsw-alias-border-l2);border-radius:999px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);font-size:12px;font-weight:600;cursor:pointer;box-shadow:0 1px 3px color-mix(in srgb, black 15%, transparent),inset 0 1px 0 color-mix(in srgb, white 6%, transparent);transition:all .16s ease;user-select:none}' +
87
87
  '.dsub-pill:hover{background:var(--dsw-alias-bg-layer-3);border-color:var(--dsw-alias-label-tertiary);transform:translateY(-1px);box-shadow:0 3px 8px color-mix(in srgb, black 25%, transparent),inset 0 1px 0 color-mix(in srgb, white 10%, transparent)}' +
@@ -89,7 +89,7 @@ window.__ModuleLoader__.load({
89
89
  '.dsub-pillTag{padding:1px 5px;border-radius:4px;font-size:10.5px;font-weight:700;letter-spacing:.02em;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary)}' +
90
90
  '.dsub-led{width:7px;height:7px;border-radius:50%;flex:none;transition:all .2s ease}' +
91
91
  '.dsub-ledOk{background:var(--dsw-alias-state-success-primary);box-shadow:0 0 6px color-mix(in srgb,var(--dsw-alias-state-success-primary) 70%,transparent)}' +
92
- '.dsub-ledWarn{background:var(--dsw-alias-state-warning-primary);box-shadow:0 0 6px color-mix(in srgb,var(--dsw-alias-state-warning-primary) 70%,transparent)}' +
92
+ '.dsub-ledWarn{background:var(--dsw-alias-state-warn-primary);box-shadow:0 0 6px color-mix(in srgb,var(--dsw-alias-state-warn-primary) 70%,transparent)}' +
93
93
  '.dsub-ledBad{background:var(--dsw-alias-state-error-primary);box-shadow:0 0 6px color-mix(in srgb,var(--dsw-alias-state-error-primary) 70%,transparent)}' +
94
94
  '.dsub-ledOff{background:var(--dsw-alias-label-tertiary)}' +
95
95
  '.dsub-modalWrap{position:fixed;inset:0;z-index:10020;display:grid;place-items:center;background:color-mix(in srgb, black 65%, transparent);backdrop-filter:blur(10px);animation:dsubFadeIn .16s ease-out}' +
@@ -111,7 +111,7 @@ window.__ModuleLoader__.load({
111
111
  '.dsub-header-bar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;padding:8px 0 12px;margin-bottom:8px;border-bottom:1px solid var(--dsw-alias-border-l2)}' +
112
112
  '.dsub-badge{font-size:12px;padding:3px 10px;border-radius:999px;border:1px solid var(--dsw-alias-border-l2);display:inline-flex;align-items:center;gap:5px;font-weight:500}' +
113
113
  '.dsub-badge-ok{border-color:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 10%,transparent)}' +
114
- '.dsub-badge-warn{border-color:var(--dsw-alias-state-warning-primary);color:var(--dsw-alias-state-warning-primary);background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 10%,transparent)}' +
114
+ '.dsub-badge-warn{border-color:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 10%,transparent)}' +
115
115
  '.dsub-badge-bad{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 10%,transparent)}' +
116
116
  '.dsub-badge-neutral{border-color:var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);background:var(--dsw-alias-bg-layer-2)}' +
117
117
  '.dsub-section-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:10px;margin-top:12px}' +
@@ -134,7 +134,7 @@ window.__ModuleLoader__.load({
134
134
  '.dsub-barTrack{height:6px;border-radius:3px;background:var(--dsw-alias-bg-layer-1);overflow:hidden}' +
135
135
  '.dsub-barFillGrad{height:100%;border-radius:3px;transition:width .3s ease}' +
136
136
  '.dsub-panel-box{margin-top:10px;padding:12px 14px;border-radius:10px;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-2);display:flex;flex-direction:column;gap:8px}' +
137
- '.dsub-panel-warn{border-color:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 40%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 5%,transparent)}' +
137
+ '.dsub-panel-warn{border-color:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 40%,transparent);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 5%,transparent)}' +
138
138
  '.dsub-panel-title{font-size:13px;font-weight:600;color:var(--dsw-alias-label-primary);display:flex;align-items:center;justify-content:space-between}' +
139
139
  '.dsub-panel-desc{font-size:12px;color:var(--dsw-alias-label-secondary);line-height:1.4}' +
140
140
  '.dsub-usage-grid{display:flex;flex-direction:column;gap:8px;margin-top:4px}' +
@@ -144,12 +144,12 @@ window.__ModuleLoader__.load({
144
144
  '.dsub-usage-fill{height:100%;border-radius:999px;transition:width .3s ease}' +
145
145
  '.dsub-usage-meta{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--dsw-alias-label-secondary)}' +
146
146
  '.dsub-tag-ok{border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 30%,transparent);color:var(--dsw-alias-state-success-primary);background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 8%,transparent);padding:1px 7px;border-radius:999px;font-size:11px;font-weight:600;border-style:solid;border-width:1px}' +
147
- '.dsub-tag-warn{border-color:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 40%,transparent);color:var(--dsw-alias-state-warning-primary);background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 8%,transparent);padding:1px 7px;border-radius:999px;font-size:11px;font-weight:600;border-style:solid;border-width:1px}' +
147
+ '.dsub-tag-warn{border-color:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 40%,transparent);color:var(--dsw-alias-state-warn-primary);background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 8%,transparent);padding:1px 7px;border-radius:999px;font-size:11px;font-weight:600;border-style:solid;border-width:1px}' +
148
148
  '.dsub-tag-bad{border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,transparent);color:var(--dsw-alias-state-error-primary);background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 8%,transparent);padding:1px 7px;border-radius:999px;font-size:11px;font-weight:600;border-style:solid;border-width:1px}' +
149
149
  '.dsub-slot-meta-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:12px;padding-top:10px;border-top:1px solid var(--dsw-alias-border-l2);font-size:12px}' +
150
150
  '.dsub-ref-tag{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;color:var(--dsw-alias-label-secondary)}' +
151
151
  '.dsub-ref-tag code{padding:2px 6px;border-radius:4px;background:var(--dsw-alias-bg-layer-1);border:1px solid var(--dsw-alias-border-l2);font-family:ui-monospace,monospace;color:var(--dsw-alias-label-primary);font-size:11px}' +
152
- '.dsub-speed-tag{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;color:var(--dsw-alias-brand-default);background:color-mix(in srgb,var(--dsw-alias-brand-default) 8%,transparent);padding:2px 8px;border-radius:6px;font-weight:500;border:1px solid color-mix(in srgb,var(--dsw-alias-brand-default) 20%,transparent)}' +
152
+ '.dsub-speed-tag{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;color:var(--dsw-alias-brand-primary);background:color-mix(in srgb,var(--dsw-alias-brand-primary) 8%,transparent);padding:2px 8px;border-radius:6px;font-weight:500;border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary) 20%,transparent)}' +
153
153
  '.dsub-btn-danger{border-color:color-mix(in srgb,var(--dsw-alias-state-error-primary) 40%,transparent)!important;color:var(--dsw-alias-state-error-primary)!important}' +
154
154
  '.dsub-btn-danger:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 12%,transparent)!important}' +
155
155
  '.dsub-poolTitle{margin-top:16px;margin-bottom:8px;font-size:11.5px;font-weight:700;color:var(--dsw-alias-label-secondary);text-transform:uppercase;letter-spacing:.05em}' +
@@ -157,12 +157,12 @@ window.__ModuleLoader__.load({
157
157
  '.dsub-accountCard:hover{background:var(--dsw-alias-bg-layer-3);border-color:var(--dsw-alias-label-tertiary)}' +
158
158
  '.dsub-brandBadge{width:32px;height:32px;border-radius:8px;display:grid;place-items:center;font-size:12px;font-weight:700;flex-shrink:0}' +
159
159
  '.dsub-brandCodex{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 15%,transparent);color:var(--dsw-alias-state-success-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-state-success-primary) 30%,transparent)}' +
160
- '.dsub-brandClaude{background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 15%,transparent);color:var(--dsw-alias-state-warning-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-state-warning-primary) 30%,transparent)}' +
161
- '.dsub-brandGrok{background:color-mix(in srgb,var(--dsw-alias-accent-primary, var(--dsw-alias-brand-primary)) 15%,transparent);color:var(--dsw-alias-accent-primary, var(--dsw-alias-brand-primary));border:1px solid color-mix(in srgb,var(--dsw-alias-accent-primary, var(--dsw-alias-brand-primary)) 30%,transparent)}' +
160
+ '.dsub-brandClaude{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 15%,transparent);color:var(--dsw-alias-state-warn-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary) 30%,transparent)}' +
161
+ '.dsub-brandGrok{background:color-mix(in srgb,var(--dsw-alias-state-business-primary, var(--dsw-alias-brand-primary)) 15%,transparent);color:var(--dsw-alias-state-business-primary, var(--dsw-alias-brand-primary));border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary, var(--dsw-alias-brand-primary)) 30%,transparent)}' +
162
162
  '.dsub-brandAgy{background:color-mix(in srgb,var(--dsw-alias-brand-primary) 15%,transparent);color:var(--dsw-alias-brand-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary) 30%,transparent)}' +
163
163
  '.dsub-brandOllama{background:color-mix(in srgb,var(--dsw-alias-label-tertiary) 15%,transparent);color:var(--dsw-alias-label-secondary);border:1px solid color-mix(in srgb,var(--dsw-alias-label-tertiary) 30%,transparent)}' +
164
- '.dsub-brandKimi{background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 15%,transparent);color:var(--dsw-alias-state-warning-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-state-warning-primary) 30%,transparent)}' +
165
- '.dsub-brandGlm{background:color-mix(in srgb,var(--dsw-alias-state-info-primary, var(--dsw-alias-brand-primary)) 15%,transparent);color:var(--dsw-alias-state-info-primary, var(--dsw-alias-brand-primary));border:1px solid color-mix(in srgb,var(--dsw-alias-state-info-primary, var(--dsw-alias-brand-primary)) 30%,transparent)}' +
164
+ '.dsub-brandKimi{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 15%,transparent);color:var(--dsw-alias-state-warn-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-state-warn-primary) 30%,transparent)}' +
165
+ '.dsub-brandGlm{background:color-mix(in srgb,var(--dsw-alias-state-business-primary, var(--dsw-alias-brand-primary)) 15%,transparent);color:var(--dsw-alias-state-business-primary, var(--dsw-alias-brand-primary));border:1px solid color-mix(in srgb,var(--dsw-alias-state-business-primary, var(--dsw-alias-brand-primary)) 30%,transparent)}' +
166
166
  '.dsub-planBadge{display:inline-flex;align-items:center;padding:1px 6px;border-radius:4px;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.5px;background:color-mix(in srgb,var(--dsw-alias-brand-primary) 15%,transparent);color:var(--dsw-alias-brand-primary);border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary) 30%,transparent);margin-left:6px}' +
167
167
 
168
168
  '.dsub-accInfo{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}' +
@@ -170,18 +170,18 @@ window.__ModuleLoader__.load({
170
170
  '.dsub-accName{font-size:13px;font-weight:600}' +
171
171
  '.dsub-accStatusTag{font-size:10.5px;font-weight:600;padding:1px 6px;border-radius:4px}' +
172
172
  '.dsub-statusOk{background:color-mix(in srgb,var(--dsw-alias-state-success-primary) 15%,transparent);color:var(--dsw-alias-state-success-primary)}' +
173
- '.dsub-statusWarn{background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 15%,transparent);color:var(--dsw-alias-state-warning-primary)}' +
173
+ '.dsub-statusWarn{background:color-mix(in srgb,var(--dsw-alias-state-warn-primary) 15%,transparent);color:var(--dsw-alias-state-warn-primary)}' +
174
174
  '.dsub-statusBad{background:color-mix(in srgb,var(--dsw-alias-state-error-primary) 15%,transparent);color:var(--dsw-alias-state-error-primary)}' +
175
175
  '.dsub-statusOff{background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-tertiary)}' +
176
176
  '.dsub-modalFoot{display:flex;align-items:center;justify-content:space-between;margin-top:16px;padding-top:12px;border-top:1px solid var(--dsw-alias-border-l2)}' +
177
- '.dsub-btnPrimary{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:8px;font-size:12px;font-weight:600;background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-text-contrast);border:0;cursor:pointer;transition:opacity .15s}' +
177
+ '.dsub-btnPrimary{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:8px;font-size:12px;font-weight:600;background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary-foreground);border:0;cursor:pointer;transition:opacity .15s}' +
178
178
  '.dsub-btnPrimary:hover{opacity:.9}' +
179
179
  '.dsub-btnSec{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:7px;font-size:11.5px;font-weight:500;background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);border:1px solid var(--dsw-alias-border-l2);cursor:pointer;text-decoration:none;transition:all .15s}' +
180
180
  '.dsub-btnSec:hover{background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-primary);border-color:var(--dsw-alias-label-tertiary)}' +
181
181
  '.dsub-cq{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--dsw-alias-label-secondary);padding:0 6px}' +
182
182
  '.dsub-cqBar{position:relative;width:40px;height:5px;border-radius:3px;background:var(--dsw-alias-bg-layer-1);overflow:hidden}' +
183
183
  '.dsub-cqBarFill{height:100%;border-radius:3px;background:var(--dsw-alias-state-success-primary)}' +
184
- '.dsub-cqBarWarn .dsub-cqBarFill{background:var(--dsw-alias-state-warning-primary)}' +
184
+ '.dsub-cqBarWarn .dsub-cqBarFill{background:var(--dsw-alias-state-warn-primary)}' +
185
185
  '.dsub-cqBarFull .dsub-cqBarFill{background:var(--dsw-alias-state-error-primary)}' +
186
186
  '.dsub-cqB{font-variant-numeric:tabular-nums;font-weight:600;color:var(--dsw-alias-label-primary)}' +
187
187
  '.dsub-diag{font:11px/1.5 ui-monospace,SFMono-Regular,monospace;max-height:260px;overflow:auto;white-space:pre-wrap;word-break:break-word;border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:10px;background:var(--dsw-alias-bg-layer-2);color:var(--dsw-alias-label-secondary)}'
@@ -1413,7 +1413,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
1413
1413
  React.createElement('div', { style: { padding: '8px 0', overflowX: 'auto' } },
1414
1414
  React.createElement('table', { style: { width: '100%', fontSize: '12px', borderCollapse: 'collapse' } },
1415
1415
  React.createElement('thead', null,
1416
- React.createElement('tr', { style: { borderBottom: '1px solid var(--dsw-alias-border-primary)', textAlign: 'left', opacity: 0.7 } },
1416
+ React.createElement('tr', { style: { borderBottom: '1px solid var(--dsw-alias-border-l2)', textAlign: 'left', opacity: 0.7 } },
1417
1417
  React.createElement('th', { style: { padding: '6px' } }, t('healthAccount')),
1418
1418
  React.createElement('th', { style: { padding: '6px' } }, t('healthScore')),
1419
1419
  React.createElement('th', { style: { padding: '6px' } }, t('healthLatency')),
@@ -1424,11 +1424,11 @@ const cssId = 'dsh-subscriptions/settings.module.css'
1424
1424
  React.createElement('tbody', null,
1425
1425
  accounts.map((acc, idx) => {
1426
1426
  const sc = acc.healthScore != null ? acc.healthScore : 100
1427
- const healthColor = sc >= 80 ? 'var(--dsw-alias-state-success-primary)' : (sc >= 50 ? 'var(--dsw-alias-state-warning-primary)' : 'var(--dsw-alias-state-error-primary)')
1427
+ const healthColor = sc >= 80 ? 'var(--dsw-alias-state-success-primary)' : (sc >= 50 ? 'var(--dsw-alias-state-warn-primary)' : 'var(--dsw-alias-state-error-primary)')
1428
1428
  const isQ = acc.status === 'quarantine' || (acc.quarantineUntil && Number(acc.quarantineUntil) > Date.now())
1429
1429
  const statusLabel = isQ ? ('⛔ ' + t('healthQuarantine')) : (acc.status === 'probing' ? ('🟡 ' + t('healthWarmup')) : (acc.configured ? ('🟢 ' + t('healthActive')) : ('⚪ ' + t('healthIdle'))))
1430
1430
  const pct = acc.usagePercent != null ? Math.round(acc.usagePercent) : null
1431
- return React.createElement('tr', { key: (acc.ref || acc.provider + acc.index || idx), style: { borderBottom: '1px solid var(--dsw-alias-border-secondary)' } },
1431
+ return React.createElement('tr', { key: (acc.ref || acc.provider + acc.index || idx), style: { borderBottom: '1px solid var(--dsw-alias-border-l3)' } },
1432
1432
  React.createElement('td', { style: { padding: '6px', fontWeight: 600 } }, (acc.provider ? acc.provider.toUpperCase() : 'LLM') + ' #' + (acc.index || 1) + (acc.label ? ' (' + acc.label + ')' : '')),
1433
1433
  React.createElement('td', { style: { padding: '6px', color: healthColor } }, sc + '%'),
1434
1434
  React.createElement('td', { style: { padding: '6px' } }, acc.latencyMs ? acc.latencyMs + ' ms' : '—'),
@@ -1976,7 +1976,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
1976
1976
  function renderItem(label, pct, detail){
1977
1977
  var p = Math.min(100, Math.max(0, Math.round(pct)))
1978
1978
  var tagCls = p >= 90 ? 'dsub-tag-bad' : (p >= 70 ? 'dsub-tag-warn' : 'dsub-tag-ok')
1979
- var fillBg = p >= 90 ? 'var(--dsw-alias-state-error-primary)' : (p >= 70 ? 'var(--dsw-alias-state-warning-primary)' : 'var(--dsw-alias-state-success-primary)')
1979
+ var fillBg = p >= 90 ? 'var(--dsw-alias-state-error-primary)' : (p >= 70 ? 'var(--dsw-alias-state-warn-primary)' : 'var(--dsw-alias-state-success-primary)')
1980
1980
  return React.createElement('div', { key: label, className: 'dsub-usage-card' },
1981
1981
  React.createElement('div', { className: 'dsub-usage-head' },
1982
1982
  React.createElement('span', null, label),
@@ -2105,7 +2105,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
2105
2105
  React.createElement('div', { className: 'dsub-header', style: { cursor: 'default' } },
2106
2106
  React.createElement('div', { className: 'dsub-headText' },
2107
2107
  React.createElement('div', { className: 'dsub-name' }, cardT('title')),
2108
- React.createElement('div', { className: 'dsub-description', style: { color: 'var(--dsw-alias-state-warning-primary)' } },
2108
+ React.createElement('div', { className: 'dsub-description', style: { color: 'var(--dsw-alias-state-warn-primary)' } },
2109
2109
  cardT('unavailable') || cardT('settingsUnavailable') || 'Settings are unavailable',
2110
2110
  ),
2111
2111
  ),
@@ -2529,7 +2529,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
2529
2529
  React.createElement('div', { className: 'dsub-heroTitle' },
2530
2530
  React.createElement('span', { className: 'dsub-brandBadge ' + b.cls, style: { width: 24, height: 24, fontSize: 11 } }, b.icon),
2531
2531
  React.createElement('span', null, (a.provider ? a.provider.toUpperCase() : 'LLM') + (a.index ? ' #' + a.index : '')),
2532
- a.fastMode ? React.createElement('span', { className: 'dsub-pillTag', style: { background: 'color-mix(in srgb,var(--dsw-alias-state-warning-primary) 15%,transparent)', color: 'var(--dsw-alias-state-warning-primary)' } }, '⚡ FAST 1.5x') : null,
2532
+ a.fastMode ? React.createElement('span', { className: 'dsub-pillTag', style: { background: 'color-mix(in srgb,var(--dsw-alias-state-warn-primary) 15%,transparent)', color: 'var(--dsw-alias-state-warn-primary)' } }, '⚡ FAST 1.5x') : null,
2533
2533
  ),
2534
2534
  React.createElement('span', { className: 'dsub-heroModel' }, a.model || 'active model'),
2535
2535
  ),
@@ -2544,7 +2544,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
2544
2544
  className: 'dsub-barFillGrad',
2545
2545
  style: {
2546
2546
  width: Math.min(100, Math.max(0, primPct)) + '%',
2547
- background: primPct >= 90 ? 'var(--dsw-alias-state-error-primary)' : (primPct >= 50 ? 'var(--dsw-alias-state-warning-primary)' : 'var(--dsw-alias-state-success-primary)'),
2547
+ background: primPct >= 90 ? 'var(--dsw-alias-state-error-primary)' : (primPct >= 50 ? 'var(--dsw-alias-state-warn-primary)' : 'var(--dsw-alias-state-success-primary)'),
2548
2548
  },
2549
2549
  }),
2550
2550
  ),
@@ -2559,7 +2559,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
2559
2559
  className: 'dsub-barFillGrad',
2560
2560
  style: {
2561
2561
  width: Math.min(100, Math.max(0, secPct)) + '%',
2562
- background: secPct >= 90 ? 'var(--dsw-alias-state-error-primary)' : (secPct >= 50 ? 'var(--dsw-alias-state-warning-primary)' : 'var(--dsw-alias-brand-primary)'),
2562
+ background: secPct >= 90 ? 'var(--dsw-alias-state-error-primary)' : (secPct >= 50 ? 'var(--dsw-alias-state-warn-primary)' : 'var(--dsw-alias-brand-primary)'),
2563
2563
  },
2564
2564
  }),
2565
2565
  ),
@@ -2608,7 +2608,7 @@ const cssId = 'dsh-subscriptions/settings.module.css'
2608
2608
  className: 'dsub-barFillGrad',
2609
2609
  style: {
2610
2610
  width: Math.min(100, Math.max(0, pct)) + '%',
2611
- background: pct >= 90 ? 'var(--dsw-alias-state-error-primary)' : (pct >= 50 ? 'var(--dsw-alias-state-warning-primary)' : 'var(--dsw-alias-state-success-primary)'),
2611
+ background: pct >= 90 ? 'var(--dsw-alias-state-error-primary)' : (pct >= 50 ? 'var(--dsw-alias-state-warn-primary)' : 'var(--dsw-alias-state-success-primary)'),
2612
2612
  },
2613
2613
  }),
2614
2614
  ) : null,
@@ -94,6 +94,8 @@ export const Config = z.object({
94
94
  .description('Custom model catalog for Codex.'),
95
95
  claudeSystemPrefix: z.string().volatile().default('')
96
96
  .description('System prompt prefix for Claude.'),
97
+ claudeCcVersion: z.string().volatile().default('')
98
+ .description('Claude Code version header for billing attribution (default: 2.1.289.7e2).'),
97
99
  claudeModels: z.array(z.any()).volatile().default([])
98
100
  .description('Custom model catalog for Claude.'),
99
101
  grokModels: z.array(z.any()).volatile().default([])
package/lib/usage.js CHANGED
@@ -3,8 +3,9 @@ export function numberOrNull(value) {
3
3
  return Number.isFinite(n) ? n : null
4
4
  }
5
5
 
6
- export function windowPercent(obj) {
6
+ export function windowPercent(obj, key) {
7
7
  if (!obj || typeof obj !== 'object') return null
8
+ if (key === 'extra_usage' || (obj.monthly_limit != null && obj.used_credits != null)) return null
8
9
  return numberOrNull(
9
10
  obj.utilization ?? obj.used_percent ?? obj.usedPercent ?? obj.creditUsagePercent ?? obj.used_percentage,
10
11
  )
@@ -12,9 +13,9 @@ export function windowPercent(obj) {
12
13
 
13
14
  export function deepestUsedPercent(obj) {
14
15
  let max = null
15
- function walk(value, depth) {
16
+ function walk(value, key, depth) {
16
17
  if (!value || typeof value !== 'object' || depth > 8) return
17
- const here = windowPercent(value)
18
+ const here = windowPercent(value, key)
18
19
  if (here != null) max = max == null ? here : Math.max(max, here)
19
20
  const remaining = numberOrNull(value.remainingFraction)
20
21
  if (remaining != null) {
@@ -26,11 +27,11 @@ export function deepestUsedPercent(obj) {
26
27
  const used = usedFrac * 100
27
28
  max = max == null ? used : Math.max(max, used)
28
29
  }
29
- for (const child of Object.values(value)) {
30
- if (child && typeof child === 'object') walk(child, depth + 1)
30
+ for (const [k, child] of Object.entries(value)) {
31
+ if (child && typeof child === 'object') walk(child, k, depth + 1)
31
32
  }
32
33
  }
33
- walk(obj, 0)
34
+ walk(obj, '', 0)
34
35
  return max
35
36
  }
36
37
 
@@ -81,6 +82,7 @@ const WINDOW_LABELS = {
81
82
  secondary_window: { zh: "7天", en: "7d" },
82
83
  monthly: { zh: "月度", en: "month" },
83
84
  credits: { zh: "点数", en: "credits" },
85
+ extra_usage: { zh: "额外用量", en: "extra" },
84
86
  }
85
87
 
86
88
  export function windowLabel(id) {
@@ -56,6 +56,7 @@ export function defaults() {
56
56
  return {
57
57
  clientId: '9d1c250a-e61b-44d9-88ed-5944d1962f5e',
58
58
  redirectUri: 'https://console.anthropic.com/oauth/code/callback',
59
+ claudeCcVersion: '2.1.289.7e2',
59
60
  models: [
60
61
  { id: 'claude-opus-5', name: 'Claude Opus 5' },
61
62
  { id: 'claude-sonnet-5', name: 'Claude Sonnet 5' },
@@ -137,7 +138,9 @@ export async function listModels(blob, cfg, fetchImpl) {
137
138
  "Accept": "application/json",
138
139
  "anthropic-version": "2023-06-01",
139
140
  }
140
- if (blob.accessToken.startsWith("sk-ant-")) {
141
+ if (blob.accessToken.startsWith("sk-ant-oat") || blob.accessToken.startsWith("sk-ant-ort")) {
142
+ headers["Authorization"] = `Bearer ${blob.accessToken}`
143
+ } else if (blob.accessToken.startsWith("sk-ant-")) {
141
144
  headers["x-api-key"] = blob.accessToken
142
145
  } else {
143
146
  headers["Authorization"] = `Bearer ${blob.accessToken}`
@@ -200,9 +203,37 @@ export async function usage(blob, _cfg, fetchImpl) {
200
203
  }
201
204
  }
202
205
 
206
+ export function makeClaudeBillingHeader(cfg) {
207
+ const ccVersion = (cfg && cfg.claudeCcVersion) || '2.1.289.7e2'
208
+ const cch = (globalThis.__DSH_CC_H__ || (() => {
209
+ globalThis.__DSH_CC_H__ = Math.random().toString(16).slice(2, 6)
210
+ return globalThis.__DSH_CC_H__
211
+ })())
212
+ const turnIndex = (globalThis.__DSH_CC_TURN__ = (globalThis.__DSH_CC_TURN__ || 0) + 1)
213
+ return `x-anthropic-billing-header: cc_version=${ccVersion}; cc_entrypoint=sdk-cli; cch=${cch}; cc_turn_origin=sdk; cc_prompt_index=0; cc_turn_index=${turnIndex};`
214
+ }
215
+
216
+ export function applyClaudeBillingHeader(payload, cfg) {
217
+ if (process.env.CLAUDE_CODE_ATTRIBUTION_HEADER === '0') return payload
218
+ if (!payload) return payload
219
+ const headerText = makeClaudeBillingHeader(cfg)
220
+ const headerBlock = { type: 'text', text: headerText }
221
+ if (Array.isArray(payload.system)) {
222
+ if (!payload.system.some((b) => typeof b === 'object' && b && typeof b.text === 'string' && b.text.startsWith('x-anthropic-billing-header:'))) {
223
+ payload.system = [headerBlock, ...payload.system]
224
+ }
225
+ } else if (typeof payload.system === 'string' && payload.system.trim()) {
226
+ payload.system = [headerBlock, { type: 'text', text: payload.system }]
227
+ } else if (!payload.system) {
228
+ payload.system = [headerBlock]
229
+ }
230
+ return payload
231
+ }
232
+
203
233
  export async function* streamOnce({ blob, options, fetchImpl, headers, config, signal }) {
204
234
  const payload = anthropicPayload(options, config.systemPrefix || IDENTITY)
205
235
  applyClaudeThinking(payload, options)
236
+ applyClaudeBillingHeader(payload, config)
206
237
  const res = await fetchImpl(API, {
207
238
  method: 'POST',
208
239
  headers: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@goodandready/dsh-subscriptions",
3
- "version": "0.6.56",
3
+ "version": "0.6.58",
4
4
  "description": "Use ChatGPT Codex, Claude, Grok, Antigravity, Kimi, GLM, Cursor, Kiro, Copilot, Qwen, ERNIE, Spark, JetBrains, Perplexity, Replit, and Cody subscriptions as DeepSeek Harness LLM providers via OAuth.",
5
5
  "license": "MIT",
6
6
  "type": "module",