@hanzo/ui 8.27.54 → 8.27.55

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 (52) hide show
  1. package/dist/backends/gui/progress.cjs +2 -2
  2. package/dist/backends/gui/progress.d.ts +3 -1
  3. package/dist/backends/gui/progress.d.ts.map +1 -1
  4. package/dist/backends/gui/progress.js +2 -2
  5. package/dist/backends/gui/progress.js.map +1 -1
  6. package/dist/gallery.cjs +17 -1
  7. package/dist/gallery.d.ts.map +1 -1
  8. package/dist/gallery.html +21 -4
  9. package/dist/gallery.js +17 -1
  10. package/dist/gallery.js.map +1 -1
  11. package/dist/marketing/rows.cjs +5 -11
  12. package/dist/marketing/rows.d.ts +2 -1
  13. package/dist/marketing/rows.d.ts.map +1 -1
  14. package/dist/marketing/rows.js +5 -11
  15. package/dist/marketing/rows.js.map +1 -1
  16. package/dist/models/ModelSelector.cjs +7 -3
  17. package/dist/models/ModelSelector.d.ts +9 -1
  18. package/dist/models/ModelSelector.d.ts.map +1 -1
  19. package/dist/models/ModelSelector.js +7 -3
  20. package/dist/models/ModelSelector.js.map +1 -1
  21. package/dist/product/LimitedBanner.cjs +22 -0
  22. package/dist/product/LimitedBanner.d.ts +10 -0
  23. package/dist/product/LimitedBanner.d.ts.map +1 -0
  24. package/dist/product/LimitedBanner.js +20 -0
  25. package/dist/product/LimitedBanner.js.map +1 -0
  26. package/dist/product/UsageMeter.cjs +48 -0
  27. package/dist/product/UsageMeter.d.ts +18 -0
  28. package/dist/product/UsageMeter.d.ts.map +1 -0
  29. package/dist/product/UsageMeter.js +45 -0
  30. package/dist/product/UsageMeter.js.map +1 -0
  31. package/dist/product/index.cjs +6 -0
  32. package/dist/product/index.d.ts +4 -0
  33. package/dist/product/index.d.ts.map +1 -1
  34. package/dist/product/index.js +6 -0
  35. package/dist/product/index.js.map +1 -1
  36. package/dist/product/limits.cjs +246 -0
  37. package/dist/product/limits.d.ts +113 -0
  38. package/dist/product/limits.d.ts.map +1 -0
  39. package/dist/product/limits.js +233 -0
  40. package/dist/product/limits.js.map +1 -0
  41. package/dist/product/pure.cjs +17 -0
  42. package/dist/product/pure.d.ts +1 -0
  43. package/dist/product/pure.d.ts.map +1 -1
  44. package/dist/product/pure.js +3 -0
  45. package/dist/product/pure.js.map +1 -1
  46. package/dist/product/useLimits.cjs +124 -0
  47. package/dist/product/useLimits.d.ts +27 -0
  48. package/dist/product/useLimits.d.ts.map +1 -0
  49. package/dist/product/useLimits.js +120 -0
  50. package/dist/product/useLimits.js.map +1 -0
  51. package/dist/styles.css +17 -0
  52. package/package.json +1 -1
@@ -0,0 +1,233 @@
1
+ // Plan usage limits — `GET /v1/ai/limits`, the served-call headers and the
2
+ // billing refusals, read into one shape. Shares only: a percent per class and
3
+ // when it resets, never an amount or a count.
4
+ //
5
+ // Classes: `premium` is third-party frontier models, `ours` is Hanzo models
6
+ // (zen, enso, kai, jev), `free` is the free lane. State is `ok` below 80 %,
7
+ // `near` from 80 to 99 %, and `limited` when the class is used up and nothing
8
+ // else pays.
9
+ //
10
+ // No React, no gui: this loads in Node and in a server component.
11
+ export const CLASSES = ['premium', 'ours', 'free'];
12
+ export const CLASS_LABEL = {
13
+ premium: 'Premium models',
14
+ ours: 'Hanzo models',
15
+ free: 'Free models',
16
+ };
17
+ const STATES = ['ok', 'near', 'limited'];
18
+ const PAYERS = ['plan', 'prepaid', 'credits', 'none'];
19
+ const PAID = ['plan', 'prepaid', 'credits', 'free'];
20
+ const RANK = { ok: 0, near: 1, limited: 2 };
21
+ const text = (v) => (typeof v === 'string' ? v : null);
22
+ const one = (set, v) => typeof v === 'string' && set.includes(v) ? v : null;
23
+ const record = (v) => v && typeof v === 'object' && !Array.isArray(v) ? v : null;
24
+ /** The worse of two states. */
25
+ export const worst = (a, b) => (RANK[b] > RANK[a] ? b : a);
26
+ /** A percent as the bar draws it: a whole number from 0 to 100. */
27
+ const share = (v) => typeof v === 'number' && Number.isFinite(v) ? Math.min(100, Math.max(0, Math.round(v))) : null;
28
+ function windowOf(v) {
29
+ const o = record(v);
30
+ const percent = share(o?.percent);
31
+ if (percent === null)
32
+ return null;
33
+ return {
34
+ percent,
35
+ state: one(STATES, o?.state) ?? (percent >= 80 ? 'near' : 'ok'),
36
+ resets_at: text(o?.resets_at),
37
+ };
38
+ }
39
+ function classOfBody(v) {
40
+ const w = windowOf(v);
41
+ if (!w)
42
+ return null;
43
+ const o = record(v);
44
+ const short = windowOf(o?.window);
45
+ return { ...w, paying: one(PAYERS, o?.paying) ?? 'plan', ...(short ? { window: short } : {}) };
46
+ }
47
+ export function actionsOf(v) {
48
+ if (!Array.isArray(v))
49
+ return [];
50
+ return v.flatMap((a) => {
51
+ const o = record(a);
52
+ const kind = one(['upgrade', 'topup'], o?.kind);
53
+ const url = text(o?.url);
54
+ if (!kind || !url)
55
+ return [];
56
+ const plan = text(o?.plan);
57
+ return [{ kind, label: text(o?.label) || (kind === 'upgrade' ? 'Upgrade' : 'Add prepaid credit'), url, ...(plan ? { plan } : {}) }];
58
+ });
59
+ }
60
+ const classList = (v) => Array.isArray(v) ? v.flatMap((c) => (one(CLASSES, c) ? [c] : [])) : [];
61
+ /**
62
+ * `GET /v1/ai/limits`, checked field by field. A body without a string `plan`
63
+ * is not an answer; a class without a numeric percent is left out rather than
64
+ * drawn full or empty.
65
+ */
66
+ export function limitsOf(body) {
67
+ const o = record(body);
68
+ const plan = text(o?.plan);
69
+ if (plan === null)
70
+ return null;
71
+ const classes = {};
72
+ const raw = record(o?.classes);
73
+ for (const c of CLASSES) {
74
+ const got = classOfBody(raw?.[c]);
75
+ if (got)
76
+ classes[c] = got;
77
+ }
78
+ const lim = record(o?.limited);
79
+ const limited = lim
80
+ ? { reason: text(lim.reason) ?? '', classes: classList(lim.classes), message: text(lim.message) ?? '' }
81
+ : undefined;
82
+ const state = one(STATES, o?.state) ??
83
+ Object.values(classes).reduce((s, c) => worst(s, c ? worst(c.state, c.window?.state ?? 'ok') : 'ok'), 'ok');
84
+ return {
85
+ plan,
86
+ period_start: text(o?.period_start) ?? undefined,
87
+ period_end: text(o?.period_end) ?? undefined,
88
+ state,
89
+ classes,
90
+ ...(limited ? { limited } : {}),
91
+ actions: actionsOf(o?.actions),
92
+ upgrade: text(o?.upgrade) ?? undefined,
93
+ };
94
+ }
95
+ /** The usage headers on a served call, or null when it carries none. */
96
+ export function servedOf(headers) {
97
+ const usage = one(STATES, headers.get('x-hanzo-usage'));
98
+ const fallback = headers.get('x-hanzo-fallback') || null;
99
+ if (!usage && !fallback)
100
+ return null;
101
+ return {
102
+ state: usage ?? 'limited',
103
+ class: one(CLASSES, headers.get('x-hanzo-usage-class')),
104
+ paidBy: one(PAID, headers.get('x-hanzo-paid-by')),
105
+ fallback,
106
+ reason: headers.get('x-hanzo-usage-reason') || null,
107
+ };
108
+ }
109
+ /** A billing refusal's envelope, or null for any other error. */
110
+ export function refusalOf(body, status, retryAfter) {
111
+ const e = record(record(body)?.error);
112
+ if (!e || e.type !== 'billing_error')
113
+ return null;
114
+ const retry = retryAfter ? Number(retryAfter) : NaN;
115
+ return {
116
+ status,
117
+ code: text(e.code) ?? '',
118
+ message: text(e.message) ?? '',
119
+ class: one(CLASSES, e.class),
120
+ resets_at: text(e.resets_at),
121
+ actions: actionsOf(e.actions),
122
+ retry: Number.isFinite(retry) ? retry : null,
123
+ };
124
+ }
125
+ /**
126
+ * Which class a model id bills to. Hanzo's own families are `ours`, anything
127
+ * naming the free lane is `free`, and every other model is `premium`.
128
+ */
129
+ export function classOf(id) {
130
+ const bare = id.toLowerCase().replace(/^hanzo\//, '');
131
+ if (bare === 'free' || /(^|[-/:])free($|[-/:])/.test(bare))
132
+ return 'free';
133
+ if (/^(zen|enso|kai|jev)([-.:/0-9]|$)/.test(bare))
134
+ return 'ours';
135
+ return 'premium';
136
+ }
137
+ /** The limits with what served calls said since they were read laid over them. */
138
+ export function overlay(limits, heard) {
139
+ if (!limits)
140
+ return null;
141
+ const classes = { ...limits.classes };
142
+ const { served, refusal } = heard;
143
+ if (served?.class && classes[served.class]) {
144
+ const c = classes[served.class];
145
+ classes[served.class] = { ...c, state: served.state };
146
+ }
147
+ if (refusal?.class && classes[refusal.class]) {
148
+ const c = classes[refusal.class];
149
+ classes[refusal.class] = { ...c, state: 'limited', paying: 'none', resets_at: refusal.resets_at ?? c.resets_at };
150
+ }
151
+ const state = Object.values(classes).reduce((s, c) => worst(s, c ? worst(c.state, c.window?.state ?? 'ok') : 'ok'), heard.served || heard.refusal ? 'ok' : limits.state);
152
+ return { ...limits, classes, state: worst(state, refusal ? 'limited' : 'ok') };
153
+ }
154
+ /** The binding reset of a class: its short window's when that is the one used up. */
155
+ const resetOf = (c) => !c ? null : c.window && RANK[c.window.state] > RANK[c.state] ? c.window.resets_at : c.resets_at;
156
+ const earliest = (all) => all.reduce((a, b) => (!b ? a : !a || Date.parse(b) < Date.parse(a) ? b : a), null);
157
+ /** "Premium models", "Premium and Hanzo models". */
158
+ export function classesLabel(classes) {
159
+ const names = CLASSES.filter((c) => classes.includes(c)).map((c) => CLASS_LABEL[c].replace(/ models$/, ''));
160
+ if (!names.length)
161
+ return 'Models';
162
+ const last = names.pop();
163
+ return `${names.length ? `${names.join(', ')} and ${last}` : last} models`;
164
+ }
165
+ /**
166
+ * When a reset lands, as a sentence says it: a time for one within a day
167
+ * ("5:00 PM"), else a date ("Oct 30"), periods being UTC days. "" for none.
168
+ */
169
+ export function when(iso, now = Date.now()) {
170
+ const t = iso ? Date.parse(iso) : NaN;
171
+ if (Number.isNaN(t))
172
+ return '';
173
+ const d = new Date(t);
174
+ return t - now < 86_400_000
175
+ ? d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })
176
+ : d.toLocaleDateString('en-US', { timeZone: 'UTC', month: 'short', day: 'numeric' });
177
+ }
178
+ const PLAIN = {
179
+ paid_plan_required: 'Premium models need a paid plan.',
180
+ free_plan_cap: "You've used the free plan's usage for now.",
181
+ insufficient_balance: 'Your prepaid credit has run out.',
182
+ };
183
+ /**
184
+ * What to tell a reader whose usage is paused or refused, or null when nothing
185
+ * is. A plan's included usage being used up reads as a pause until the reset;
186
+ * any other reason is the server's own message. A fallback reply adds the free
187
+ * model it was answered on, named by `name`.
188
+ */
189
+ export function noticeOf(limits, heard, name = (id) => id, now = Date.now()) {
190
+ const { served, refusal } = heard;
191
+ const fallback = served?.fallback ?? null;
192
+ const classes = new Set(limits?.limited?.classes ?? []);
193
+ for (const c of CLASSES)
194
+ if (c !== 'free' && limits?.classes[c]?.state === 'limited')
195
+ classes.add(c);
196
+ if (refusal?.class)
197
+ classes.add(refusal.class);
198
+ if (fallback && served?.class && served.class !== 'free')
199
+ classes.add(served.class);
200
+ if (!refusal && !fallback && !limits?.limited && limits?.state !== 'limited')
201
+ return null;
202
+ const list = CLASSES.filter((c) => classes.has(c));
203
+ const reason = refusal?.code || limits?.limited?.reason || served?.reason || '';
204
+ const resets = earliest([...list.map((c) => resetOf(limits?.classes[c])), refusal?.resets_at ?? null]);
205
+ const paused = reason === 'plan_allowance_used' || (!reason && list.length > 0);
206
+ const until = when(resets, now);
207
+ const said = paused
208
+ ? `${classesLabel(list)} are paused${until ? ` until ${until}` : ''}.`
209
+ : refusal?.message || limits?.limited?.message || PLAIN[reason] || 'Usage is paused for now.';
210
+ return {
211
+ reason,
212
+ classes: list,
213
+ message: fallback ? `${said} You're chatting on ${name(fallback)}.` : said,
214
+ actions: limits?.actions.length ? limits.actions : (refusal?.actions ?? []),
215
+ resets_at: resets,
216
+ fallback,
217
+ };
218
+ }
219
+ /** The one-line note for a class close to its included usage, or null. */
220
+ export function nearOf(limits, now = Date.now()) {
221
+ if (!limits || limits.state === 'limited')
222
+ return null;
223
+ const near = CLASSES.filter((c) => {
224
+ const k = limits.classes[c];
225
+ return c !== 'free' && k && (k.state === 'near' || k.window?.state === 'near');
226
+ });
227
+ if (!near.length)
228
+ return null;
229
+ const until = when(earliest(near.map((c) => resetOf(limits.classes[c]))), now);
230
+ const what = classesLabel(near).replace(/ models$/, '').replace('Premium', 'premium');
231
+ return `You're close to your plan's included ${what} model usage.${until ? ` Resets ${until}.` : ''}`;
232
+ }
233
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/product/limits.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,20 @@
16
16
  // import { pages, masked, tone } from '@hanzo/ui/product/pure'
17
17
  //
18
18
  // A component belongs in `@hanzo/ui/product`. A rule belongs here.
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
31
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
32
+ };
19
33
  Object.defineProperty(exports, "__esModule", { value: true });
20
34
  exports.SLACK = exports.pinned = exports.sends = exports.ready = exports.wordmarkText = exports.wordmarkStyle = exports.isExpanded = exports.HOUSE_EASE = exports.DEFAULT_INTRO_MS = exports.DEFAULT_GAP = exports.DEFAULT_DURATION_MS = exports.resolveBrand = exports.PARS = exports.ZOO = exports.LUX = exports.HANZO = exports.BRANDS = exports.isKnownOption = exports.filterOptions = exports.filterOrgs = exports.orgScope = exports.tone = exports.TONE = exports.displayName = exports.masked = exports.pages = exports.GAP = void 0;
21
35
  // Paging — the fixed-width page run, and the ellipsis standing in for the rest.
@@ -70,3 +84,6 @@ Object.defineProperty(exports, "sends", { enumerable: true, get: function () { r
70
84
  var stick_1 = require("../chat/stick.cjs");
71
85
  Object.defineProperty(exports, "pinned", { enumerable: true, get: function () { return stick_1.pinned; } });
72
86
  Object.defineProperty(exports, "SLACK", { enumerable: true, get: function () { return stick_1.SLACK; } });
87
+ // Plan usage limits — the `/v1/ai/limits` contract, the served-call headers and
88
+ // the billing refusal, and what each tells the reader.
89
+ __exportStar(require("./limits.cjs"), exports);
@@ -8,4 +8,5 @@ export { BRANDS, HANZO, LUX, ZOO, PARS, resolveBrand, type BrandIdentity } from
8
8
  export { DEFAULT_DURATION_MS, DEFAULT_GAP, DEFAULT_INTRO_MS, HOUSE_EASE, isExpanded, wordmarkStyle, wordmarkText, type WordmarkStyle, type WordmarkStyleInput, } from './animatedLogo.logic.js';
9
9
  export { ready, sends, type Mods } from '../chat/send.js';
10
10
  export { pinned, SLACK, type Track } from '../chat/stick.js';
11
+ export * from './limits.js';
11
12
  //# sourceMappingURL=pure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pure.d.ts","sourceRoot":"","sources":["../../src/product/pure.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAIpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAA;AAI9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAG5F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGlF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAIzF,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAA;AAK7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"pure.d.ts","sourceRoot":"","sources":["../../src/product/pure.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAG7C,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAIpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAA;AAI9C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAG5F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAGlF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAIzF,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAA;AAK7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,EAAE,MAAM,eAAe,CAAA;AAIzD,cAAc,UAAU,CAAA"}
@@ -40,4 +40,7 @@ export { DEFAULT_DURATION_MS, DEFAULT_GAP, DEFAULT_INTRO_MS, HOUSE_EASE, isExpan
40
40
  // command palette all ask the first one — so the general entry point is here.
41
41
  export { ready, sends } from '../chat/send.js';
42
42
  export { pinned, SLACK } from '../chat/stick.js';
43
+ // Plan usage limits — the `/v1/ai/limits` contract, the served-call headers and
44
+ // the billing refusal, and what each tells the reader.
45
+ export * from './limits.js';
43
46
  //# sourceMappingURL=pure.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pure.js","sourceRoot":"","sources":["../../src/product/pure.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,uEAAuE;AACvE,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,iEAAiE;AACjE,EAAE;AACF,iEAAiE;AACjE,EAAE;AACF,mEAAmE;AAEnE,gFAAgF;AAChF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,yEAAyE;AACzE,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,qEAAqE;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,iFAAiF;AACjF,uEAAuE;AACvE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAa,MAAM,QAAQ,CAAA;AAE9C,+EAA+E;AAC/E,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAgD,MAAM,SAAS,CAAA;AAE5F,uEAAuE;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAA;AAElF,kFAAkF;AAClF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAsB,MAAM,SAAS,CAAA;AAEzF,yEAAyE;AACzE,yDAAyD;AACzD,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,GAGb,MAAM,sBAAsB,CAAA;AAE7B,uEAAuE;AACvE,yEAAyE;AACzE,8EAA8E;AAC9E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAa,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAc,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"pure.js","sourceRoot":"","sources":["../../src/product/pure.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,4EAA4E;AAC5E,+EAA+E;AAC/E,uEAAuE;AACvE,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,+EAA+E;AAC/E,iEAAiE;AACjE,EAAE;AACF,iEAAiE;AACjE,EAAE;AACF,mEAAmE;AAEnE,gFAAgF;AAChF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,yEAAyE;AACzE,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAE7C,qEAAqE;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,iFAAiF;AACjF,uEAAuE;AACvE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAa,MAAM,QAAQ,CAAA;AAE9C,+EAA+E;AAC/E,aAAa;AACb,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAgD,MAAM,SAAS,CAAA;AAE5F,uEAAuE;AACvE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAA;AAElF,kFAAkF;AAClF,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAsB,MAAM,SAAS,CAAA;AAEzF,yEAAyE;AACzE,yDAAyD;AACzD,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,UAAU,EACV,aAAa,EACb,YAAY,GAGb,MAAM,sBAAsB,CAAA;AAE7B,uEAAuE;AACvE,yEAAyE;AACzE,8EAA8E;AAC9E,OAAO,EAAE,KAAK,EAAE,KAAK,EAAa,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAc,MAAM,eAAe,CAAA;AAEzD,gFAAgF;AAChF,uDAAuD;AACvD,cAAc,UAAU,CAAA"}
@@ -0,0 +1,124 @@
1
+ 'use client';"use strict";
2
+ 'use client';
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.observe = observe;
5
+ exports.forget = forget;
6
+ exports.useLimits = useLimits;
7
+ // The signed-in payer's plan usage, held: read from `GET /v1/ai/limits` and
8
+ // kept current by every served call's usage headers and every billing refusal
9
+ // a host hands to `observe`.
10
+ //
11
+ // const read = (signal) => fetch(`${api}/v1/ai/limits`, { headers, signal }).then(...)
12
+ // const { limits, notice, near } = useLimits(read, org)
13
+ // observe(response) // in the host's fetch, for each AI call
14
+ //
15
+ // The host owns the request — its base URL, bearer and org — so this never
16
+ // learns how a surface authenticates.
17
+ const react_1 = require("react");
18
+ const limits_1 = require("./limits.cjs");
19
+ let held = { served: null, refusal: null, at: 0 };
20
+ const listeners = new Set();
21
+ const tell = (next) => {
22
+ held = next;
23
+ for (const l of listeners)
24
+ l();
25
+ };
26
+ const subscribe = (l) => {
27
+ listeners.add(l);
28
+ return () => {
29
+ listeners.delete(l);
30
+ };
31
+ };
32
+ const snapshot = () => held;
33
+ const EMPTY = { served: null, refusal: null, at: 0 };
34
+ const server = () => EMPTY;
35
+ /**
36
+ * Reads the usage headers off an AI call's response, and the billing envelope
37
+ * off a 402 or 429. Never throws and never consumes the body.
38
+ */
39
+ function observe(res) {
40
+ const served = (0, limits_1.servedOf)(res.headers);
41
+ if (res.ok) {
42
+ if (served)
43
+ tell({ served, refusal: null, at: Date.now() });
44
+ return;
45
+ }
46
+ if (res.status !== 402 && res.status !== 429)
47
+ return;
48
+ const retry = res.headers.get('retry-after');
49
+ res
50
+ .clone()
51
+ .json()
52
+ .then((body) => {
53
+ const refusal = (0, limits_1.refusalOf)(body, res.status, retry);
54
+ if (refusal)
55
+ tell({ served: served ?? held.served, refusal, at: Date.now() });
56
+ })
57
+ .catch(() => { });
58
+ }
59
+ /** Forgets every heard header and refusal: a sign-out, or another payer. */
60
+ function forget() {
61
+ tell(EMPTY);
62
+ }
63
+ /**
64
+ * The plan usage for whoever `read` asks as. `read` answers the parsed body of
65
+ * `GET /v1/ai/limits` or throws; null reads nothing (signed out). `key` reads
66
+ * again when it changes (the org). `name` turns a fallback model id into the
67
+ * name the reader knows it by.
68
+ */
69
+ function useLimits(read, key = null, name) {
70
+ const [limits, setLimits] = (0, react_1.useState)(null);
71
+ const [answered, setAnswered] = (0, react_1.useState)(false);
72
+ const [readAt, setReadAt] = (0, react_1.useState)(0);
73
+ const [nonce, setNonce] = (0, react_1.useState)(0);
74
+ const reader = (0, react_1.useRef)(read);
75
+ reader.current = read;
76
+ const on = read !== null;
77
+ const heard = (0, react_1.useSyncExternalStore)(subscribe, snapshot, server);
78
+ (0, react_1.useEffect)(() => {
79
+ const go = reader.current;
80
+ if (!go) {
81
+ setLimits(null);
82
+ return;
83
+ }
84
+ const stop = new AbortController();
85
+ const started = Date.now();
86
+ go(stop.signal)
87
+ .then((body) => {
88
+ if (stop.signal.aborted)
89
+ return;
90
+ setLimits((0, limits_1.limitsOf)(body));
91
+ setReadAt(started);
92
+ })
93
+ .catch(() => {
94
+ if (!stop.signal.aborted)
95
+ setLimits(null);
96
+ })
97
+ .finally(() => {
98
+ if (!stop.signal.aborted)
99
+ setAnswered(true);
100
+ });
101
+ return () => stop.abort();
102
+ }, [on, key, nonce]);
103
+ // A served call whose state differs from what was read, or a refusal, means
104
+ // the read is stale: read again for the percent, the reset and the actions.
105
+ const fresh = heard.at > readAt;
106
+ const drift = fresh &&
107
+ (heard.refusal !== null ||
108
+ (heard.served !== null &&
109
+ (heard.served.fallback !== null ||
110
+ (heard.served.class !== null && limits?.classes[heard.served.class]?.state !== heard.served.state))));
111
+ (0, react_1.useEffect)(() => {
112
+ if (drift && on)
113
+ setNonce((n) => n + 1);
114
+ }, [drift, on, heard.at]);
115
+ // Once read again, a header still counts only while the limits agree the
116
+ // reader is limited: an upgrade or a top-up clears the notice at once.
117
+ const effective = (0, react_1.useMemo)(() => (fresh ? heard : { served: limits?.state === 'limited' ? heard.served : null, refusal: null }), [fresh, heard, limits?.state]);
118
+ const shown = (0, react_1.useMemo)(() => (0, limits_1.overlay)(limits, effective), [limits, effective]);
119
+ const nameRef = (0, react_1.useRef)(name);
120
+ nameRef.current = name;
121
+ const notice = (0, react_1.useMemo)(() => (0, limits_1.noticeOf)(shown, effective, (id) => nameRef.current?.(id) ?? id), [shown, effective]);
122
+ const near = (0, react_1.useMemo)(() => (notice ? null : (0, limits_1.nearOf)(shown)), [notice, shown]);
123
+ return { limits: shown, answered, notice, near, reload: (0, react_1.useCallback)(() => setNonce((n) => n + 1), []) };
124
+ }
@@ -0,0 +1,27 @@
1
+ import { type LimitNotice, type Limits } from './limits.js';
2
+ /**
3
+ * Reads the usage headers off an AI call's response, and the billing envelope
4
+ * off a 402 or 429. Never throws and never consumes the body.
5
+ */
6
+ export declare function observe(res: Response): void;
7
+ /** Forgets every heard header and refusal: a sign-out, or another payer. */
8
+ export declare function forget(): void;
9
+ export interface UseLimits {
10
+ /** The limits with what served calls said since laid over them; null until read, or when the read failed. */
11
+ limits: Limits | null;
12
+ /** The first read has come back, either way. */
13
+ answered: boolean;
14
+ /** A class paused or refused: the message and its actions. */
15
+ notice: LimitNotice | null;
16
+ /** The one-line note for a class close to its included usage. */
17
+ near: string | null;
18
+ reload: () => void;
19
+ }
20
+ /**
21
+ * The plan usage for whoever `read` asks as. `read` answers the parsed body of
22
+ * `GET /v1/ai/limits` or throws; null reads nothing (signed out). `key` reads
23
+ * again when it changes (the org). `name` turns a fallback model id into the
24
+ * name the reader knows it by.
25
+ */
26
+ export declare function useLimits(read: ((signal: AbortSignal) => Promise<unknown>) | null, key?: unknown, name?: (id: string) => string): UseLimits;
27
+ //# sourceMappingURL=useLimits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLimits.d.ts","sourceRoot":"","sources":["../../src/product/useLimits.ts"],"names":[],"mappings":"AAcA,OAAO,EAQL,KAAK,WAAW,EAChB,KAAK,MAAM,EACZ,MAAM,UAAU,CAAA;AAyBjB;;;GAGG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAgB3C;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,MAAM,WAAW,SAAS;IACxB,6GAA6G;IAC7G,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,gDAAgD;IAChD,QAAQ,EAAE,OAAO,CAAA;IACjB,8DAA8D;IAC9D,MAAM,EAAE,WAAW,GAAG,IAAI,CAAA;IAC1B,iEAAiE;IACjE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,MAAM,EAAE,MAAM,IAAI,CAAA;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,EACxD,GAAG,GAAE,OAAc,EACnB,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,GAC5B,SAAS,CA2DX"}
@@ -0,0 +1,120 @@
1
+ 'use client';
2
+ // The signed-in payer's plan usage, held: read from `GET /v1/ai/limits` and
3
+ // kept current by every served call's usage headers and every billing refusal
4
+ // a host hands to `observe`.
5
+ //
6
+ // const read = (signal) => fetch(`${api}/v1/ai/limits`, { headers, signal }).then(...)
7
+ // const { limits, notice, near } = useLimits(read, org)
8
+ // observe(response) // in the host's fetch, for each AI call
9
+ //
10
+ // The host owns the request — its base URL, bearer and org — so this never
11
+ // learns how a surface authenticates.
12
+ import { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
13
+ import { limitsOf, nearOf, noticeOf, overlay, refusalOf, servedOf, } from './limits.js';
14
+ let held = { served: null, refusal: null, at: 0 };
15
+ const listeners = new Set();
16
+ const tell = (next) => {
17
+ held = next;
18
+ for (const l of listeners)
19
+ l();
20
+ };
21
+ const subscribe = (l) => {
22
+ listeners.add(l);
23
+ return () => {
24
+ listeners.delete(l);
25
+ };
26
+ };
27
+ const snapshot = () => held;
28
+ const EMPTY = { served: null, refusal: null, at: 0 };
29
+ const server = () => EMPTY;
30
+ /**
31
+ * Reads the usage headers off an AI call's response, and the billing envelope
32
+ * off a 402 or 429. Never throws and never consumes the body.
33
+ */
34
+ export function observe(res) {
35
+ const served = servedOf(res.headers);
36
+ if (res.ok) {
37
+ if (served)
38
+ tell({ served, refusal: null, at: Date.now() });
39
+ return;
40
+ }
41
+ if (res.status !== 402 && res.status !== 429)
42
+ return;
43
+ const retry = res.headers.get('retry-after');
44
+ res
45
+ .clone()
46
+ .json()
47
+ .then((body) => {
48
+ const refusal = refusalOf(body, res.status, retry);
49
+ if (refusal)
50
+ tell({ served: served ?? held.served, refusal, at: Date.now() });
51
+ })
52
+ .catch(() => { });
53
+ }
54
+ /** Forgets every heard header and refusal: a sign-out, or another payer. */
55
+ export function forget() {
56
+ tell(EMPTY);
57
+ }
58
+ /**
59
+ * The plan usage for whoever `read` asks as. `read` answers the parsed body of
60
+ * `GET /v1/ai/limits` or throws; null reads nothing (signed out). `key` reads
61
+ * again when it changes (the org). `name` turns a fallback model id into the
62
+ * name the reader knows it by.
63
+ */
64
+ export function useLimits(read, key = null, name) {
65
+ const [limits, setLimits] = useState(null);
66
+ const [answered, setAnswered] = useState(false);
67
+ const [readAt, setReadAt] = useState(0);
68
+ const [nonce, setNonce] = useState(0);
69
+ const reader = useRef(read);
70
+ reader.current = read;
71
+ const on = read !== null;
72
+ const heard = useSyncExternalStore(subscribe, snapshot, server);
73
+ useEffect(() => {
74
+ const go = reader.current;
75
+ if (!go) {
76
+ setLimits(null);
77
+ return;
78
+ }
79
+ const stop = new AbortController();
80
+ const started = Date.now();
81
+ go(stop.signal)
82
+ .then((body) => {
83
+ if (stop.signal.aborted)
84
+ return;
85
+ setLimits(limitsOf(body));
86
+ setReadAt(started);
87
+ })
88
+ .catch(() => {
89
+ if (!stop.signal.aborted)
90
+ setLimits(null);
91
+ })
92
+ .finally(() => {
93
+ if (!stop.signal.aborted)
94
+ setAnswered(true);
95
+ });
96
+ return () => stop.abort();
97
+ }, [on, key, nonce]);
98
+ // A served call whose state differs from what was read, or a refusal, means
99
+ // the read is stale: read again for the percent, the reset and the actions.
100
+ const fresh = heard.at > readAt;
101
+ const drift = fresh &&
102
+ (heard.refusal !== null ||
103
+ (heard.served !== null &&
104
+ (heard.served.fallback !== null ||
105
+ (heard.served.class !== null && limits?.classes[heard.served.class]?.state !== heard.served.state))));
106
+ useEffect(() => {
107
+ if (drift && on)
108
+ setNonce((n) => n + 1);
109
+ }, [drift, on, heard.at]);
110
+ // Once read again, a header still counts only while the limits agree the
111
+ // reader is limited: an upgrade or a top-up clears the notice at once.
112
+ const effective = useMemo(() => (fresh ? heard : { served: limits?.state === 'limited' ? heard.served : null, refusal: null }), [fresh, heard, limits?.state]);
113
+ const shown = useMemo(() => overlay(limits, effective), [limits, effective]);
114
+ const nameRef = useRef(name);
115
+ nameRef.current = name;
116
+ const notice = useMemo(() => noticeOf(shown, effective, (id) => nameRef.current?.(id) ?? id), [shown, effective]);
117
+ const near = useMemo(() => (notice ? null : nearOf(shown)), [notice, shown]);
118
+ return { limits: shown, answered, notice, near, reload: useCallback(() => setNonce((n) => n + 1), []) };
119
+ }
120
+ //# sourceMappingURL=useLimits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLimits.js","sourceRoot":"","sources":["../../src/product/useLimits.ts"],"names":[],"mappings":"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"}