@genesislcap/ai-assistant 15.13.1 → 15.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-assistant.d.ts +31 -13
- package/dist/dts/main/main.d.ts +31 -13
- package/dist/dts/main/main.d.ts.map +1 -1
- package/dist/esm/main/blocked-state.test.js +56 -5
- package/dist/esm/main/main.js +106 -27
- package/docs/migration-GENC-1464.md +19 -8
- package/package.json +17 -17
- package/src/main/blocked-state.test.ts +73 -5
- package/src/main/main.ts +98 -25
package/dist/ai-assistant.d.ts
CHANGED
|
@@ -2314,9 +2314,9 @@ export declare interface FallbackAgentConfig extends BaseAgentConfig {
|
|
|
2314
2314
|
*
|
|
2315
2315
|
* @internal
|
|
2316
2316
|
*/
|
|
2317
|
-
export declare function formatBlockedReason(budget?: Extract<ChatDriverResult, {
|
|
2317
|
+
export declare function formatBlockedReason(budget?: Partial<Extract<ChatDriverResult, {
|
|
2318
2318
|
reason: 'done';
|
|
2319
|
-
}>['budget']
|
|
2319
|
+
}>['budget']>, vendor?: AIProviderType): string | undefined;
|
|
2320
2320
|
|
|
2321
2321
|
/**
|
|
2322
2322
|
* Foundation AI Assistant component.
|
|
@@ -2778,11 +2778,18 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
2778
2778
|
*/
|
|
2779
2779
|
private get relevantBlockedVendors();
|
|
2780
2780
|
/**
|
|
2781
|
-
* Whether the blocked banner has anything to say — a vendor-agnostic block,
|
|
2782
|
-
*
|
|
2783
|
-
*
|
|
2784
|
-
*
|
|
2785
|
-
*
|
|
2781
|
+
* Whether the blocked banner has anything to say — a vendor-agnostic block, or
|
|
2782
|
+
* a partial wall that the NEXT send would actually hit.
|
|
2783
|
+
*
|
|
2784
|
+
* Partial exhaustion is announced only while the ACTIVE vendor (the registry
|
|
2785
|
+
* default the next send resolves to) is among the walled ones. A user who has
|
|
2786
|
+
* switched to a vendor with headroom has already acted on the advice —
|
|
2787
|
+
* keeping the banner up past that point nagged about a vendor they just left
|
|
2788
|
+
* (GENC-1464 tester feedback), while switching BACK to the walled vendor
|
|
2789
|
+
* brings the banner straight back. Two conservative fallbacks keep it
|
|
2790
|
+
* fail-informative: while the statuses are still loading the active vendor is
|
|
2791
|
+
* unknowable, so any reachable-and-walled vendor still announces; and a
|
|
2792
|
+
* vendor-agnostic block announces always, exactly as before.
|
|
2786
2793
|
*
|
|
2787
2794
|
* Reads the reachability-filtered list for the same reason the copy does — a
|
|
2788
2795
|
* host that has swapped its registry away from the walled vendor has nothing
|
|
@@ -2809,6 +2816,15 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
2809
2816
|
* @internal
|
|
2810
2817
|
*/
|
|
2811
2818
|
get suggestionsBlocked(): boolean;
|
|
2819
|
+
/**
|
|
2820
|
+
* The vendor the NEXT send resolves to — the registry default's provider, as
|
|
2821
|
+
* reported through `providerStatuses`. `undefined` while the statuses are
|
|
2822
|
+
* still loading (or when the default reports the `'none'` sentinel), which
|
|
2823
|
+
* every consumer treats conservatively.
|
|
2824
|
+
*
|
|
2825
|
+
* @internal
|
|
2826
|
+
*/
|
|
2827
|
+
private get activeVendor();
|
|
2812
2828
|
/**
|
|
2813
2829
|
* Explanation shown in the blocked banner, or `null` for the element's default
|
|
2814
2830
|
* copy. Only meaningful while {@link FoundationAiAssistant.blocked} is true;
|
|
@@ -2957,12 +2973,14 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
2957
2973
|
* vendors watched all of it vanish the moment a second one walled — replaced by
|
|
2958
2974
|
* generic copy, at the exact moment the situation got worse.
|
|
2959
2975
|
*
|
|
2960
|
-
* The compact
|
|
2961
|
-
*
|
|
2962
|
-
*
|
|
2963
|
-
*
|
|
2964
|
-
*
|
|
2965
|
-
*
|
|
2976
|
+
* The compact list is the DEFAULT shape for several walls, now carrying each
|
|
2977
|
+
* vendor's figures: "AI usage limits are reached for Gemini ($62.34 of $50.00)
|
|
2978
|
+
* and Anthropic ($31.10 of $30.00)." A driver latch stores no copy of its own
|
|
2979
|
+
* (it stores the figures, which this composes from), so that shape is what the
|
|
2980
|
+
* real budget flow produces. As soon as any walled vendor carries HOST copy,
|
|
2981
|
+
* which cannot be folded into a list item, the branch lists one statement per
|
|
2982
|
+
* vendor instead — falling back to composed copy for the ones that have none, so
|
|
2983
|
+
* the sentence set stays complete rather than silently naming a subset.
|
|
2966
2984
|
*
|
|
2967
2985
|
* @internal
|
|
2968
2986
|
*/
|
package/dist/dts/main/main.d.ts
CHANGED
|
@@ -36,9 +36,9 @@ export declare const genesisIconSvg = "<svg viewBox=\"-4 0 30 26\" fill=\"none\"
|
|
|
36
36
|
*
|
|
37
37
|
* @internal
|
|
38
38
|
*/
|
|
39
|
-
export declare function formatBlockedReason(budget?: Extract<ChatDriverResult, {
|
|
39
|
+
export declare function formatBlockedReason(budget?: Partial<Extract<ChatDriverResult, {
|
|
40
40
|
reason: 'done';
|
|
41
|
-
}>['budget']
|
|
41
|
+
}>['budget']>, vendor?: AIProviderType): string | undefined;
|
|
42
42
|
/**
|
|
43
43
|
* Whole-number percentage of a budget consumed, for the meter (GENC-1464).
|
|
44
44
|
*
|
|
@@ -513,11 +513,18 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
513
513
|
*/
|
|
514
514
|
private get relevantBlockedVendors();
|
|
515
515
|
/**
|
|
516
|
-
* Whether the blocked banner has anything to say — a vendor-agnostic block,
|
|
517
|
-
*
|
|
518
|
-
*
|
|
519
|
-
*
|
|
520
|
-
*
|
|
516
|
+
* Whether the blocked banner has anything to say — a vendor-agnostic block, or
|
|
517
|
+
* a partial wall that the NEXT send would actually hit.
|
|
518
|
+
*
|
|
519
|
+
* Partial exhaustion is announced only while the ACTIVE vendor (the registry
|
|
520
|
+
* default the next send resolves to) is among the walled ones. A user who has
|
|
521
|
+
* switched to a vendor with headroom has already acted on the advice —
|
|
522
|
+
* keeping the banner up past that point nagged about a vendor they just left
|
|
523
|
+
* (GENC-1464 tester feedback), while switching BACK to the walled vendor
|
|
524
|
+
* brings the banner straight back. Two conservative fallbacks keep it
|
|
525
|
+
* fail-informative: while the statuses are still loading the active vendor is
|
|
526
|
+
* unknowable, so any reachable-and-walled vendor still announces; and a
|
|
527
|
+
* vendor-agnostic block announces always, exactly as before.
|
|
521
528
|
*
|
|
522
529
|
* Reads the reachability-filtered list for the same reason the copy does — a
|
|
523
530
|
* host that has swapped its registry away from the walled vendor has nothing
|
|
@@ -544,6 +551,15 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
544
551
|
* @internal
|
|
545
552
|
*/
|
|
546
553
|
get suggestionsBlocked(): boolean;
|
|
554
|
+
/**
|
|
555
|
+
* The vendor the NEXT send resolves to — the registry default's provider, as
|
|
556
|
+
* reported through `providerStatuses`. `undefined` while the statuses are
|
|
557
|
+
* still loading (or when the default reports the `'none'` sentinel), which
|
|
558
|
+
* every consumer treats conservatively.
|
|
559
|
+
*
|
|
560
|
+
* @internal
|
|
561
|
+
*/
|
|
562
|
+
private get activeVendor();
|
|
547
563
|
/**
|
|
548
564
|
* Explanation shown in the blocked banner, or `null` for the element's default
|
|
549
565
|
* copy. Only meaningful while {@link FoundationAiAssistant.blocked} is true;
|
|
@@ -692,12 +708,14 @@ export declare class FoundationAiAssistant extends GenesisElement {
|
|
|
692
708
|
* vendors watched all of it vanish the moment a second one walled — replaced by
|
|
693
709
|
* generic copy, at the exact moment the situation got worse.
|
|
694
710
|
*
|
|
695
|
-
* The compact
|
|
696
|
-
*
|
|
697
|
-
*
|
|
698
|
-
*
|
|
699
|
-
*
|
|
700
|
-
*
|
|
711
|
+
* The compact list is the DEFAULT shape for several walls, now carrying each
|
|
712
|
+
* vendor's figures: "AI usage limits are reached for Gemini ($62.34 of $50.00)
|
|
713
|
+
* and Anthropic ($31.10 of $30.00)." A driver latch stores no copy of its own
|
|
714
|
+
* (it stores the figures, which this composes from), so that shape is what the
|
|
715
|
+
* real budget flow produces. As soon as any walled vendor carries HOST copy,
|
|
716
|
+
* which cannot be folded into a list item, the branch lists one statement per
|
|
717
|
+
* vendor instead — falling back to composed copy for the ones that have none, so
|
|
718
|
+
* the sentence set stays complete rather than silently naming a subset.
|
|
701
719
|
*
|
|
702
720
|
* @internal
|
|
703
721
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/main/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -211,6 +211,32 @@ Suite('the transcript override is passed only when a blockedReason actually exis
|
|
|
211
211
|
el.setBlocked(false);
|
|
212
212
|
assert.is(read(el), undefined, 'unblocking hands composition back to the driver');
|
|
213
213
|
});
|
|
214
|
+
Suite('the partial-wall banner follows the ACTIVE vendor', () => {
|
|
215
|
+
// The tester feedback this pins: after switching to a vendor with headroom,
|
|
216
|
+
// the banner about the vendor you LEFT must stop nagging — and switching back
|
|
217
|
+
// must bring it straight back. The active vendor is the registry default the
|
|
218
|
+
// next send resolves to (providerStatuses' isDefault entry).
|
|
219
|
+
const walledGemini = { vendorLabel: 'Gemini', budgetUsd: 25, spentUsd: 25.4 };
|
|
220
|
+
const active = element();
|
|
221
|
+
reachable(active, 'gemini', 'anthropic'); // default = gemini
|
|
222
|
+
latch(active, 'budget-exhausted', walledGemini);
|
|
223
|
+
assert.is(active.bannerVisible, true, 'a walled ACTIVE vendor announces');
|
|
224
|
+
const switched = element();
|
|
225
|
+
reachable(switched, 'anthropic', 'gemini'); // default = anthropic, with headroom
|
|
226
|
+
latch(switched, 'budget-exhausted', walledGemini);
|
|
227
|
+
assert.is(switched.bannerVisible, false, 'a user who switched away is not nagged');
|
|
228
|
+
reachable(switched, 'gemini', 'anthropic'); // switch back to the walled vendor
|
|
229
|
+
assert.is(switched.bannerVisible, true, 'switching back brings the banner back');
|
|
230
|
+
// Conservative fallbacks: unknown active vendor (statuses still loading)
|
|
231
|
+
// announces; a vendor-agnostic block announces regardless of the default.
|
|
232
|
+
const loading = element();
|
|
233
|
+
latch(loading, 'budget-exhausted', walledGemini);
|
|
234
|
+
assert.is(loading.bannerVisible, true, 'unknown active vendor stays fail-informative');
|
|
235
|
+
const agnostic = element();
|
|
236
|
+
reachable(agnostic, 'anthropic', 'gemini');
|
|
237
|
+
agnostic.setBlocked(true, 'capped for this desk');
|
|
238
|
+
assert.is(agnostic.bannerVisible, true, 'a vendor-agnostic block always announces');
|
|
239
|
+
});
|
|
214
240
|
Suite('a wall with figures snaps the vendor meter at latch time', () => {
|
|
215
241
|
// The GENC-1464 stale-meter finding: hosts refresh the meter on
|
|
216
242
|
// `tool-loop-end`, which a walled turn may never reach — the 402's own
|
|
@@ -480,6 +506,30 @@ Suite('the per-vendor guard lets a SECOND vendor wall land', () => {
|
|
|
480
506
|
assert.equal(el.blockedVendors, ['anthropic', 'gemini'], 'both walls are recorded, in order');
|
|
481
507
|
assert.is(el.blocked, true);
|
|
482
508
|
});
|
|
509
|
+
Suite('two walls with figures read as ONE sentence, not two of the same', () => {
|
|
510
|
+
// The shape a user actually meets once both pots are gone. Composing each wall's
|
|
511
|
+
// own sentence repeated the boilerplate verbatim — "Gemini's AI usage limit is
|
|
512
|
+
// reached (…). Anthropic's AI usage limit is reached (…)." — which reads as a
|
|
513
|
+
// stutter and buries the one clause that differs: the figures.
|
|
514
|
+
const el = element();
|
|
515
|
+
reachable(el, 'anthropic', 'gemini');
|
|
516
|
+
latch(el, 'budget-exhausted', { budgetUsd: 25, spentUsd: 25.4, vendorLabel: 'Gemini' });
|
|
517
|
+
latch(el, 'budget-exhausted', { budgetUsd: 50, spentUsd: 62.34, vendorLabel: 'Anthropic' });
|
|
518
|
+
assert.is(el.effectiveBlockedReason, 'AI usage limits are reached for Gemini ($25.40 of $25.00) and Anthropic ($62.34 of $50.00). ' +
|
|
519
|
+
'Contact your administrator to raise them.');
|
|
520
|
+
});
|
|
521
|
+
Suite('host copy is never folded into the list — it survives beside composed copy', () => {
|
|
522
|
+
// The fold is only ever applied to copy the banner could have written itself.
|
|
523
|
+
// A host that set its own sentence for one vendor keeps it word for word, and
|
|
524
|
+
// the vendor with no copy gets a composed statement rather than being dropped.
|
|
525
|
+
const el = element();
|
|
526
|
+
reachable(el, 'anthropic', 'gemini');
|
|
527
|
+
el.setVendorBlocked('anthropic', true, 'Anthropic spend is capped for this desk.');
|
|
528
|
+
latch(el, 'budget-exhausted', { budgetUsd: 25, spentUsd: 25.4, vendorLabel: 'Gemini' });
|
|
529
|
+
assert.is(el.effectiveBlockedReason, 'Anthropic spend is capped for this desk. ' +
|
|
530
|
+
"Gemini's AI usage limit is reached ($25.40 of $25.00). " +
|
|
531
|
+
'Contact your administrator to raise them.');
|
|
532
|
+
});
|
|
483
533
|
Suite('a re-latch of an already-walled vendor never clobbers host copy', () => {
|
|
484
534
|
const el = element();
|
|
485
535
|
reachable(el, 'anthropic', 'gemini');
|
|
@@ -747,11 +797,12 @@ Suite('`otherVendorAvailable: false` vetoes the "switch to X" advice', () => {
|
|
|
747
797
|
vendorLabel: 'Anthropic',
|
|
748
798
|
otherVendorAvailable: false,
|
|
749
799
|
});
|
|
750
|
-
//
|
|
751
|
-
//
|
|
752
|
-
//
|
|
753
|
-
|
|
754
|
-
|
|
800
|
+
// One sentence, not one per vendor: the refuser carries the 402's figures and the
|
|
801
|
+
// swept vendor carries none (only the proxy's word that it has nothing left), so
|
|
802
|
+
// the list names each with whatever it actually has rather than repeating
|
|
803
|
+
// "X's AI usage limit is reached" twice.
|
|
804
|
+
assert.is(el.effectiveBlockedReason, 'AI usage limits are reached for Anthropic ($500.00 of $500.00) and Gemini. ' +
|
|
805
|
+
'Contact your administrator to raise them.');
|
|
755
806
|
assert.not.ok(el.effectiveBlockedReason.includes('Switch to'), 'nowhere to switch to');
|
|
756
807
|
});
|
|
757
808
|
Suite('`otherVendorAvailable: true` leaves the inference exactly as it was', () => {
|
package/dist/esm/main/main.js
CHANGED
|
@@ -141,19 +141,28 @@ const RAISE_LIMITS_ACTION = 'Contact your administrator to raise them.';
|
|
|
141
141
|
*
|
|
142
142
|
* @internal
|
|
143
143
|
*/
|
|
144
|
-
export function formatBlockedReason(
|
|
144
|
+
export function formatBlockedReason(
|
|
145
|
+
// `Partial`, so the store's `VendorBudgetFigures` satisfies it as well as a live
|
|
146
|
+
// 402's payload: the banner composes from stored figures and the latch from the
|
|
147
|
+
// fresh ones, and both carry the same dollars. One formatter for both means a
|
|
148
|
+
// remembered wall and a just-hit one cannot word themselves differently.
|
|
149
|
+
budget, vendor) {
|
|
145
150
|
if (!budget || (budget.budgetUsd == null && budget.spentUsd == null))
|
|
146
151
|
return undefined;
|
|
147
152
|
const money = (v) => (v == null ? 'an unknown amount' : formatUsd(v));
|
|
148
153
|
const figures = `(${money(budget.spentUsd)} of ${money(budget.budgetUsd)})`;
|
|
154
|
+
// No "you have $0.00 left" clause here, deliberately: "limit is reached" already
|
|
155
|
+
// says the allowance is gone, and a remainder clamped at zero CONTRADICTS the
|
|
156
|
+
// figures beside it — spend overshoots the cap on the last allowed call, so the
|
|
157
|
+
// words would read "$0.00 left" next to numbers showing $12.34 past it.
|
|
149
158
|
// A per-vendor statement carries NO action clause, because the right action is
|
|
150
159
|
// not knowable at latch time: whether "switch vendor" or "contact your
|
|
151
160
|
// administrator" is the honest advice depends on whether any OTHER vendor still
|
|
152
161
|
// has headroom, which only the composing getter can see. The vendor-agnostic
|
|
153
162
|
// form keeps its historical trailing sentence — nothing composes onto it.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
163
|
+
if (!vendor)
|
|
164
|
+
return `AI usage limit reached ${figures}. Contact your administrator to raise it.`;
|
|
165
|
+
return `${vendorDisplayName(vendor)}'s AI usage limit is reached ${figures}.`;
|
|
157
166
|
}
|
|
158
167
|
/**
|
|
159
168
|
* Human-readable name for a vendor, falling back to its raw type.
|
|
@@ -184,8 +193,15 @@ function vendorDisplayName(vendor) {
|
|
|
184
193
|
* excluded from both.
|
|
185
194
|
*/
|
|
186
195
|
function formatVendorList(vendors) {
|
|
196
|
+
return joinList(vendors.map(vendorDisplayName));
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* `"A"`, `"A and B"`, `"A, B and C"` — over already-rendered labels, so a caller
|
|
200
|
+
* can annotate each name (the multi-vendor banner appends each vendor's figures)
|
|
201
|
+
* without duplicating the joining rules.
|
|
202
|
+
*/
|
|
203
|
+
function joinList(names) {
|
|
187
204
|
var _a;
|
|
188
|
-
const names = vendors.map(vendorDisplayName);
|
|
189
205
|
if (names.length <= 1)
|
|
190
206
|
return (_a = names[0]) !== null && _a !== void 0 ? _a : '';
|
|
191
207
|
return `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;
|
|
@@ -1065,11 +1081,18 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1065
1081
|
return walled.filter((v) => reachable.includes(v));
|
|
1066
1082
|
}
|
|
1067
1083
|
/**
|
|
1068
|
-
* Whether the blocked banner has anything to say — a vendor-agnostic block,
|
|
1069
|
-
*
|
|
1070
|
-
*
|
|
1071
|
-
*
|
|
1072
|
-
*
|
|
1084
|
+
* Whether the blocked banner has anything to say — a vendor-agnostic block, or
|
|
1085
|
+
* a partial wall that the NEXT send would actually hit.
|
|
1086
|
+
*
|
|
1087
|
+
* Partial exhaustion is announced only while the ACTIVE vendor (the registry
|
|
1088
|
+
* default the next send resolves to) is among the walled ones. A user who has
|
|
1089
|
+
* switched to a vendor with headroom has already acted on the advice —
|
|
1090
|
+
* keeping the banner up past that point nagged about a vendor they just left
|
|
1091
|
+
* (GENC-1464 tester feedback), while switching BACK to the walled vendor
|
|
1092
|
+
* brings the banner straight back. Two conservative fallbacks keep it
|
|
1093
|
+
* fail-informative: while the statuses are still loading the active vendor is
|
|
1094
|
+
* unknowable, so any reachable-and-walled vendor still announces; and a
|
|
1095
|
+
* vendor-agnostic block announces always, exactly as before.
|
|
1073
1096
|
*
|
|
1074
1097
|
* Reads the reachability-filtered list for the same reason the copy does — a
|
|
1075
1098
|
* host that has swapped its registry away from the walled vendor has nothing
|
|
@@ -1079,7 +1102,15 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1079
1102
|
* @internal
|
|
1080
1103
|
*/
|
|
1081
1104
|
get bannerVisible() {
|
|
1082
|
-
|
|
1105
|
+
if (this.blocked)
|
|
1106
|
+
return true;
|
|
1107
|
+
const walled = this.relevantBlockedVendors;
|
|
1108
|
+
if (walled.length === 0)
|
|
1109
|
+
return false;
|
|
1110
|
+
const active = this.activeVendor;
|
|
1111
|
+
if (!active)
|
|
1112
|
+
return true;
|
|
1113
|
+
return walled.includes(active);
|
|
1083
1114
|
}
|
|
1084
1115
|
/**
|
|
1085
1116
|
* Whether a suggestions fetch would hit a wall.
|
|
@@ -1098,11 +1129,23 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1098
1129
|
* @internal
|
|
1099
1130
|
*/
|
|
1100
1131
|
get suggestionsBlocked() {
|
|
1101
|
-
var _a, _b;
|
|
1102
1132
|
if (this.blocked)
|
|
1103
1133
|
return true;
|
|
1104
|
-
const
|
|
1105
|
-
return !!
|
|
1134
|
+
const active = this.activeVendor;
|
|
1135
|
+
return !!active && this.isVendorBlocked(active);
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* The vendor the NEXT send resolves to — the registry default's provider, as
|
|
1139
|
+
* reported through `providerStatuses`. `undefined` while the statuses are
|
|
1140
|
+
* still loading (or when the default reports the `'none'` sentinel), which
|
|
1141
|
+
* every consumer treats conservatively.
|
|
1142
|
+
*
|
|
1143
|
+
* @internal
|
|
1144
|
+
*/
|
|
1145
|
+
get activeVendor() {
|
|
1146
|
+
var _a, _b;
|
|
1147
|
+
const vendor = (_b = (_a = this.providerStatuses.find((e) => e.isDefault)) === null || _a === void 0 ? void 0 : _a.status) === null || _b === void 0 ? void 0 : _b.provider;
|
|
1148
|
+
return vendor && vendor !== 'none' ? vendor : undefined;
|
|
1106
1149
|
}
|
|
1107
1150
|
/**
|
|
1108
1151
|
* Explanation shown in the blocked banner, or `null` for the element's default
|
|
@@ -1235,12 +1278,14 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1235
1278
|
// are required (`VendorBudgetFigures` is total, and half a meter is a lie),
|
|
1236
1279
|
// and the write goes through the captured `ref` like every other write here,
|
|
1237
1280
|
// so a teardown race cannot land it in a new session's store.
|
|
1281
|
+
let metered = false;
|
|
1238
1282
|
if (vendor && vendor !== 'none' && (budget === null || budget === void 0 ? void 0 : budget.budgetUsd) != null && (budget === null || budget === void 0 ? void 0 : budget.spentUsd) != null) {
|
|
1239
1283
|
ref === null || ref === void 0 ? void 0 : ref.actions.aiAssistant.setVendorBudget({
|
|
1240
1284
|
vendor,
|
|
1241
1285
|
figures: { budgetUsd: budget.budgetUsd, spentUsd: budget.spentUsd },
|
|
1242
1286
|
});
|
|
1243
1287
|
this.budgetMeterLastFedAt = Date.now();
|
|
1288
|
+
metered = true;
|
|
1244
1289
|
}
|
|
1245
1290
|
if (!vendor || vendor === 'none') {
|
|
1246
1291
|
if (!this.blocked) {
|
|
@@ -1265,7 +1310,15 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1265
1310
|
ref === null || ref === void 0 ? void 0 : ref.actions.aiAssistant.setVendorBlocked({
|
|
1266
1311
|
vendor,
|
|
1267
1312
|
blocked: true,
|
|
1268
|
-
reason:
|
|
1313
|
+
// No reason when the meter snap above already stored these figures: the
|
|
1314
|
+
// banner composes the same sentence from them, so carrying a copy here
|
|
1315
|
+
// would duplicate the dollars in two places that can drift apart. It would
|
|
1316
|
+
// also make this latch INDISTINGUISHABLE from host copy, which the banner
|
|
1317
|
+
// must preserve verbatim — and preserving boilerplate is what forced it to
|
|
1318
|
+
// repeat a sentence per walled vendor instead of folding them into one.
|
|
1319
|
+
// The partial-figures case still needs copy carried here: it has no meter
|
|
1320
|
+
// entry to compose from, and "an unknown amount of $50.00" is worth saying.
|
|
1321
|
+
reason: metered ? undefined : formatBlockedReason(budget, vendor),
|
|
1269
1322
|
});
|
|
1270
1323
|
}
|
|
1271
1324
|
// Last, so the vendor that actually refused this turn heads the wall order the
|
|
@@ -1334,17 +1387,19 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1334
1387
|
* vendors watched all of it vanish the moment a second one walled — replaced by
|
|
1335
1388
|
* generic copy, at the exact moment the situation got worse.
|
|
1336
1389
|
*
|
|
1337
|
-
* The compact
|
|
1338
|
-
*
|
|
1339
|
-
*
|
|
1340
|
-
*
|
|
1341
|
-
*
|
|
1342
|
-
*
|
|
1390
|
+
* The compact list is the DEFAULT shape for several walls, now carrying each
|
|
1391
|
+
* vendor's figures: "AI usage limits are reached for Gemini ($62.34 of $50.00)
|
|
1392
|
+
* and Anthropic ($31.10 of $30.00)." A driver latch stores no copy of its own
|
|
1393
|
+
* (it stores the figures, which this composes from), so that shape is what the
|
|
1394
|
+
* real budget flow produces. As soon as any walled vendor carries HOST copy,
|
|
1395
|
+
* which cannot be folded into a list item, the branch lists one statement per
|
|
1396
|
+
* vendor instead — falling back to composed copy for the ones that have none, so
|
|
1397
|
+
* the sentence set stays complete rather than silently naming a subset.
|
|
1343
1398
|
*
|
|
1344
1399
|
* @internal
|
|
1345
1400
|
*/
|
|
1346
1401
|
get effectiveBlockedReason() {
|
|
1347
|
-
var _a;
|
|
1402
|
+
var _a, _b;
|
|
1348
1403
|
if (this.blockedReason)
|
|
1349
1404
|
return this.blockedReason;
|
|
1350
1405
|
const walled = this.relevantBlockedVendors;
|
|
@@ -1357,14 +1412,35 @@ let FoundationAiAssistant = FoundationAiAssistant_1 = class FoundationAiAssistan
|
|
|
1357
1412
|
? RAISE_LIMITS_ACTION
|
|
1358
1413
|
: RAISE_LIMIT_ACTION;
|
|
1359
1414
|
const reasons = (_a = this._sessionRef) === null || _a === void 0 ? void 0 : _a.store.aiAssistant.blockedVendorReasons;
|
|
1360
|
-
const
|
|
1415
|
+
const budgets = (_b = this._sessionRef) === null || _b === void 0 ? void 0 : _b.store.aiAssistant.vendorBudgets;
|
|
1416
|
+
// The wall's own figures, read from the entry the METER renders, so the two
|
|
1417
|
+
// cannot state different dollars for the same vendor. A vendor with no entry
|
|
1418
|
+
// (a swept wall — the proxy's word, no figures of its own) contributes a bare
|
|
1419
|
+
// name rather than a gap where numbers should be.
|
|
1420
|
+
const statementFor = (v) => {
|
|
1421
|
+
var _a, _b;
|
|
1422
|
+
return (_b = (_a = reasons === null || reasons === void 0 ? void 0 : reasons[v]) !== null && _a !== void 0 ? _a : formatBlockedReason(budgets === null || budgets === void 0 ? void 0 : budgets[v], v)) !== null && _b !== void 0 ? _b : `${vendorDisplayName(v)}'s AI usage limit is reached.`;
|
|
1423
|
+
};
|
|
1424
|
+
const nameWithFigures = (v) => {
|
|
1425
|
+
const figures = budgets === null || budgets === void 0 ? void 0 : budgets[v];
|
|
1426
|
+
return figures
|
|
1427
|
+
? `${vendorDisplayName(v)} (${formatUsd(figures.spentUsd)} of ${formatUsd(figures.budgetUsd)})`
|
|
1428
|
+
: vendorDisplayName(v);
|
|
1429
|
+
};
|
|
1361
1430
|
if (walled.length === 1)
|
|
1362
1431
|
return `${statementFor(walled[0])} ${action}`;
|
|
1363
|
-
// Several walled vendors
|
|
1364
|
-
//
|
|
1365
|
-
//
|
|
1432
|
+
// Several walled vendors: fold them into ONE sentence carrying each vendor's
|
|
1433
|
+
// figures, rather than repeating "X's AI usage limit is reached (…)." per
|
|
1434
|
+
// vendor — the same clause twice reads like a stutter, and the second copy of
|
|
1435
|
+
// the boilerplate adds nothing the first did not already say.
|
|
1436
|
+
//
|
|
1437
|
+
// Host copy is not foldable: `setVendorBlocked` promises it survives verbatim,
|
|
1438
|
+
// and it cannot be rewritten into a list item. So the moment any walled vendor
|
|
1439
|
+
// carries some, the branch below lists one statement per vendor instead —
|
|
1440
|
+
// falling back to composed copy for the ones that have none, so the sentence
|
|
1441
|
+
// set stays complete rather than silently naming a subset.
|
|
1366
1442
|
if (!walled.some((v) => reasons === null || reasons === void 0 ? void 0 : reasons[v])) {
|
|
1367
|
-
return `AI usage limits are reached for ${
|
|
1443
|
+
return `AI usage limits are reached for ${joinList(walled.map(nameWithFigures))}. ${action}`;
|
|
1368
1444
|
}
|
|
1369
1445
|
return `${walled.map(statementFor).join(' ')} ${action}`;
|
|
1370
1446
|
}
|
|
@@ -4458,6 +4534,9 @@ __decorate([
|
|
|
4458
4534
|
__decorate([
|
|
4459
4535
|
volatile
|
|
4460
4536
|
], FoundationAiAssistant.prototype, "suggestionsBlocked", null);
|
|
4537
|
+
__decorate([
|
|
4538
|
+
volatile
|
|
4539
|
+
], FoundationAiAssistant.prototype, "activeVendor", null);
|
|
4461
4540
|
__decorate([
|
|
4462
4541
|
volatile
|
|
4463
4542
|
], FoundationAiAssistant.prototype, "effectiveBlockedReason", null);
|
|
@@ -273,22 +273,33 @@ When every reachable vendor is walled the banner asks for a raise instead:
|
|
|
273
273
|
|
|
274
274
|
> Anthropic's AI usage limit is reached ($25.40 of $25.00). Contact your administrator to raise it.
|
|
275
275
|
|
|
276
|
-
…and
|
|
277
|
-
|
|
276
|
+
…and several walled vendors fold into ONE sentence, each carrying its own figures,
|
|
277
|
+
rather than repeating the same clause per vendor:
|
|
278
278
|
|
|
279
|
-
> AI usage limits are reached for Anthropic and Gemini. Contact your administrator to raise them.
|
|
279
|
+
> AI usage limits are reached for Anthropic ($25.40 of $25.00) and Gemini ($62.34 of $50.00). Contact your administrator to raise them.
|
|
280
|
+
|
|
281
|
+
A vendor walled by the proxy's `otherVendorAvailable: false` verdict rather than by
|
|
282
|
+
a refusal of its own has no figures to show, so it contributes a bare name
|
|
283
|
+
(`… for Anthropic ($25.40 of $25.00) and Gemini.`).
|
|
280
284
|
|
|
281
285
|
A host `blockedReason` still outranks all of it, and `setVendorBlocked(v, true,
|
|
282
286
|
'…')` supplies per-vendor copy that is composed into the sentence — **however many
|
|
283
|
-
vendors are walled**.
|
|
284
|
-
|
|
285
|
-
dropped when a second vendor
|
|
287
|
+
vendors are walled**. Host copy is never folded into the list, because it cannot be
|
|
288
|
+
rewritten into a list item, so as soon as any walled vendor carries some, the banner
|
|
289
|
+
reads one statement per vendor and nothing you set is dropped when a second vendor
|
|
290
|
+
goes:
|
|
286
291
|
|
|
287
|
-
> Anthropic spend is capped for this desk. Gemini's AI usage limit is reached. Contact your administrator to raise them.
|
|
292
|
+
> Anthropic spend is capped for this desk. Gemini's AI usage limit is reached ($25.40 of $25.00). Contact your administrator to raise them.
|
|
288
293
|
|
|
289
|
-
A walled vendor with no copy falls back to
|
|
294
|
+
A walled vendor with no copy falls back to a composed sentence in that form
|
|
290
295
|
(`Gemini's …` above), so the set of statements always covers every vendor named.
|
|
291
296
|
|
|
297
|
+
Note what the banner does **not** say: no "you have $0.00 left" clause. "Limit is
|
|
298
|
+
reached" already means the allowance is gone, and a remainder clamped at zero would
|
|
299
|
+
contradict the figures printed beside it — spend overshoots the cap on the last
|
|
300
|
+
allowed call, so the words would read "$0.00 left" next to numbers showing $12.34
|
|
301
|
+
past it.
|
|
302
|
+
|
|
292
303
|
The **transcript bubble** stays vendor-neutral. The assistant element passes
|
|
293
304
|
`blockedReason ?? DEFAULT_BUDGET_EXHAUSTED_MESSAGE` as
|
|
294
305
|
`ChatDriverConfig.budgetExhaustedMessage` — deliberately NOT the composed banner
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@genesislcap/ai-assistant",
|
|
3
3
|
"description": "Genesis AI Assistant micro-frontend",
|
|
4
|
-
"version": "15.
|
|
4
|
+
"version": "15.14.0",
|
|
5
5
|
"license": "SEE LICENSE IN license.txt",
|
|
6
6
|
"main": "dist/esm/index.js",
|
|
7
7
|
"types": "dist/ai-assistant.d.ts",
|
|
@@ -73,26 +73,26 @@
|
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@genesislcap/foundation-testing": "15.
|
|
77
|
-
"@genesislcap/genx": "15.
|
|
78
|
-
"@genesislcap/rollup-builder": "15.
|
|
79
|
-
"@genesislcap/ts-builder": "15.
|
|
80
|
-
"@genesislcap/uvu-playwright-builder": "15.
|
|
81
|
-
"@genesislcap/vite-builder": "15.
|
|
82
|
-
"@genesislcap/webpack-builder": "15.
|
|
76
|
+
"@genesislcap/foundation-testing": "15.14.0",
|
|
77
|
+
"@genesislcap/genx": "15.14.0",
|
|
78
|
+
"@genesislcap/rollup-builder": "15.14.0",
|
|
79
|
+
"@genesislcap/ts-builder": "15.14.0",
|
|
80
|
+
"@genesislcap/uvu-playwright-builder": "15.14.0",
|
|
81
|
+
"@genesislcap/vite-builder": "15.14.0",
|
|
82
|
+
"@genesislcap/webpack-builder": "15.14.0",
|
|
83
83
|
"@types/dompurify": "^3.0.5",
|
|
84
84
|
"@types/marked": "^5.0.2",
|
|
85
85
|
"esbuild": "0.25.12"
|
|
86
86
|
},
|
|
87
87
|
"dependencies": {
|
|
88
|
-
"@genesislcap/foundation-ai": "15.
|
|
89
|
-
"@genesislcap/foundation-logger": "15.
|
|
90
|
-
"@genesislcap/foundation-notifications": "15.
|
|
91
|
-
"@genesislcap/foundation-redux": "15.
|
|
92
|
-
"@genesislcap/foundation-ui": "15.
|
|
93
|
-
"@genesislcap/foundation-utils": "15.
|
|
94
|
-
"@genesislcap/rapid-design-system": "15.
|
|
95
|
-
"@genesislcap/web-core": "15.
|
|
88
|
+
"@genesislcap/foundation-ai": "15.14.0",
|
|
89
|
+
"@genesislcap/foundation-logger": "15.14.0",
|
|
90
|
+
"@genesislcap/foundation-notifications": "15.14.0",
|
|
91
|
+
"@genesislcap/foundation-redux": "15.14.0",
|
|
92
|
+
"@genesislcap/foundation-ui": "15.14.0",
|
|
93
|
+
"@genesislcap/foundation-utils": "15.14.0",
|
|
94
|
+
"@genesislcap/rapid-design-system": "15.14.0",
|
|
95
|
+
"@genesislcap/web-core": "15.14.0",
|
|
96
96
|
"dompurify": "^3.3.1",
|
|
97
97
|
"marked": "^17.0.3"
|
|
98
98
|
},
|
|
@@ -105,5 +105,5 @@
|
|
|
105
105
|
"access": "public"
|
|
106
106
|
},
|
|
107
107
|
"customElements": "dist/custom-elements.json",
|
|
108
|
-
"gitHead": "
|
|
108
|
+
"gitHead": "d84656a0872b2274be6f6b20a87a28504b48ed2a"
|
|
109
109
|
}
|
|
@@ -317,6 +317,37 @@ Suite('the transcript override is passed only when a blockedReason actually exis
|
|
|
317
317
|
assert.is(read(el), undefined, 'unblocking hands composition back to the driver');
|
|
318
318
|
});
|
|
319
319
|
|
|
320
|
+
Suite('the partial-wall banner follows the ACTIVE vendor', () => {
|
|
321
|
+
// The tester feedback this pins: after switching to a vendor with headroom,
|
|
322
|
+
// the banner about the vendor you LEFT must stop nagging — and switching back
|
|
323
|
+
// must bring it straight back. The active vendor is the registry default the
|
|
324
|
+
// next send resolves to (providerStatuses' isDefault entry).
|
|
325
|
+
const walledGemini = { vendorLabel: 'Gemini', budgetUsd: 25, spentUsd: 25.4 };
|
|
326
|
+
|
|
327
|
+
const active = element();
|
|
328
|
+
reachable(active, 'gemini', 'anthropic'); // default = gemini
|
|
329
|
+
latch(active, 'budget-exhausted', walledGemini);
|
|
330
|
+
assert.is(active.bannerVisible, true, 'a walled ACTIVE vendor announces');
|
|
331
|
+
|
|
332
|
+
const switched = element();
|
|
333
|
+
reachable(switched, 'anthropic', 'gemini'); // default = anthropic, with headroom
|
|
334
|
+
latch(switched, 'budget-exhausted', walledGemini);
|
|
335
|
+
assert.is(switched.bannerVisible, false, 'a user who switched away is not nagged');
|
|
336
|
+
reachable(switched, 'gemini', 'anthropic'); // switch back to the walled vendor
|
|
337
|
+
assert.is(switched.bannerVisible, true, 'switching back brings the banner back');
|
|
338
|
+
|
|
339
|
+
// Conservative fallbacks: unknown active vendor (statuses still loading)
|
|
340
|
+
// announces; a vendor-agnostic block announces regardless of the default.
|
|
341
|
+
const loading = element();
|
|
342
|
+
latch(loading, 'budget-exhausted', walledGemini);
|
|
343
|
+
assert.is(loading.bannerVisible, true, 'unknown active vendor stays fail-informative');
|
|
344
|
+
|
|
345
|
+
const agnostic = element();
|
|
346
|
+
reachable(agnostic, 'anthropic', 'gemini');
|
|
347
|
+
agnostic.setBlocked(true, 'capped for this desk');
|
|
348
|
+
assert.is(agnostic.bannerVisible, true, 'a vendor-agnostic block always announces');
|
|
349
|
+
});
|
|
350
|
+
|
|
320
351
|
Suite('a wall with figures snaps the vendor meter at latch time', () => {
|
|
321
352
|
// The GENC-1464 stale-meter finding: hosts refresh the meter on
|
|
322
353
|
// `tool-loop-end`, which a walled turn may never reach — the 402's own
|
|
@@ -651,6 +682,42 @@ Suite('the per-vendor guard lets a SECOND vendor wall land', () => {
|
|
|
651
682
|
assert.is(el.blocked, true);
|
|
652
683
|
});
|
|
653
684
|
|
|
685
|
+
Suite('two walls with figures read as ONE sentence, not two of the same', () => {
|
|
686
|
+
// The shape a user actually meets once both pots are gone. Composing each wall's
|
|
687
|
+
// own sentence repeated the boilerplate verbatim — "Gemini's AI usage limit is
|
|
688
|
+
// reached (…). Anthropic's AI usage limit is reached (…)." — which reads as a
|
|
689
|
+
// stutter and buries the one clause that differs: the figures.
|
|
690
|
+
const el = element();
|
|
691
|
+
reachable(el, 'anthropic', 'gemini');
|
|
692
|
+
|
|
693
|
+
latch(el, 'budget-exhausted', { budgetUsd: 25, spentUsd: 25.4, vendorLabel: 'Gemini' });
|
|
694
|
+
latch(el, 'budget-exhausted', { budgetUsd: 50, spentUsd: 62.34, vendorLabel: 'Anthropic' });
|
|
695
|
+
|
|
696
|
+
assert.is(
|
|
697
|
+
el.effectiveBlockedReason,
|
|
698
|
+
'AI usage limits are reached for Gemini ($25.40 of $25.00) and Anthropic ($62.34 of $50.00). ' +
|
|
699
|
+
'Contact your administrator to raise them.',
|
|
700
|
+
);
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
Suite('host copy is never folded into the list — it survives beside composed copy', () => {
|
|
704
|
+
// The fold is only ever applied to copy the banner could have written itself.
|
|
705
|
+
// A host that set its own sentence for one vendor keeps it word for word, and
|
|
706
|
+
// the vendor with no copy gets a composed statement rather than being dropped.
|
|
707
|
+
const el = element();
|
|
708
|
+
reachable(el, 'anthropic', 'gemini');
|
|
709
|
+
el.setVendorBlocked('anthropic', true, 'Anthropic spend is capped for this desk.');
|
|
710
|
+
|
|
711
|
+
latch(el, 'budget-exhausted', { budgetUsd: 25, spentUsd: 25.4, vendorLabel: 'Gemini' });
|
|
712
|
+
|
|
713
|
+
assert.is(
|
|
714
|
+
el.effectiveBlockedReason,
|
|
715
|
+
'Anthropic spend is capped for this desk. ' +
|
|
716
|
+
"Gemini's AI usage limit is reached ($25.40 of $25.00). " +
|
|
717
|
+
'Contact your administrator to raise them.',
|
|
718
|
+
);
|
|
719
|
+
});
|
|
720
|
+
|
|
654
721
|
Suite('a re-latch of an already-walled vendor never clobbers host copy', () => {
|
|
655
722
|
const el = element();
|
|
656
723
|
reachable(el, 'anthropic', 'gemini');
|
|
@@ -1033,13 +1100,14 @@ Suite('`otherVendorAvailable: false` vetoes the "switch to X" advice', () => {
|
|
|
1033
1100
|
otherVendorAvailable: false,
|
|
1034
1101
|
});
|
|
1035
1102
|
|
|
1036
|
-
//
|
|
1037
|
-
//
|
|
1038
|
-
//
|
|
1103
|
+
// One sentence, not one per vendor: the refuser carries the 402's figures and the
|
|
1104
|
+
// swept vendor carries none (only the proxy's word that it has nothing left), so
|
|
1105
|
+
// the list names each with whatever it actually has rather than repeating
|
|
1106
|
+
// "X's AI usage limit is reached" twice.
|
|
1039
1107
|
assert.is(
|
|
1040
1108
|
el.effectiveBlockedReason,
|
|
1041
|
-
|
|
1042
|
-
|
|
1109
|
+
'AI usage limits are reached for Anthropic ($500.00 of $500.00) and Gemini. ' +
|
|
1110
|
+
'Contact your administrator to raise them.',
|
|
1043
1111
|
);
|
|
1044
1112
|
assert.not.ok(el.effectiveBlockedReason.includes('Switch to'), 'nowhere to switch to');
|
|
1045
1113
|
});
|
package/src/main/main.ts
CHANGED
|
@@ -258,20 +258,27 @@ const RAISE_LIMITS_ACTION = 'Contact your administrator to raise them.';
|
|
|
258
258
|
* @internal
|
|
259
259
|
*/
|
|
260
260
|
export function formatBlockedReason(
|
|
261
|
-
|
|
261
|
+
// `Partial`, so the store's `VendorBudgetFigures` satisfies it as well as a live
|
|
262
|
+
// 402's payload: the banner composes from stored figures and the latch from the
|
|
263
|
+
// fresh ones, and both carry the same dollars. One formatter for both means a
|
|
264
|
+
// remembered wall and a just-hit one cannot word themselves differently.
|
|
265
|
+
budget?: Partial<Extract<ChatDriverResult, { reason: 'done' }>['budget']>,
|
|
262
266
|
vendor?: AIProviderType,
|
|
263
267
|
): string | undefined {
|
|
264
268
|
if (!budget || (budget.budgetUsd == null && budget.spentUsd == null)) return undefined;
|
|
265
269
|
const money = (v?: number) => (v == null ? 'an unknown amount' : formatUsd(v));
|
|
266
270
|
const figures = `(${money(budget.spentUsd)} of ${money(budget.budgetUsd)})`;
|
|
271
|
+
// No "you have $0.00 left" clause here, deliberately: "limit is reached" already
|
|
272
|
+
// says the allowance is gone, and a remainder clamped at zero CONTRADICTS the
|
|
273
|
+
// figures beside it — spend overshoots the cap on the last allowed call, so the
|
|
274
|
+
// words would read "$0.00 left" next to numbers showing $12.34 past it.
|
|
267
275
|
// A per-vendor statement carries NO action clause, because the right action is
|
|
268
276
|
// not knowable at latch time: whether "switch vendor" or "contact your
|
|
269
277
|
// administrator" is the honest advice depends on whether any OTHER vendor still
|
|
270
278
|
// has headroom, which only the composing getter can see. The vendor-agnostic
|
|
271
279
|
// form keeps its historical trailing sentence — nothing composes onto it.
|
|
272
|
-
return
|
|
273
|
-
|
|
274
|
-
: `AI usage limit reached ${figures}. Contact your administrator to raise it.`;
|
|
280
|
+
if (!vendor) return `AI usage limit reached ${figures}. Contact your administrator to raise it.`;
|
|
281
|
+
return `${vendorDisplayName(vendor)}'s AI usage limit is reached ${figures}.`;
|
|
275
282
|
}
|
|
276
283
|
|
|
277
284
|
/**
|
|
@@ -303,7 +310,15 @@ function vendorDisplayName(vendor: AIProviderType): string {
|
|
|
303
310
|
* excluded from both.
|
|
304
311
|
*/
|
|
305
312
|
function formatVendorList(vendors: readonly AIProviderType[]): string {
|
|
306
|
-
|
|
313
|
+
return joinList(vendors.map(vendorDisplayName));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* `"A"`, `"A and B"`, `"A, B and C"` — over already-rendered labels, so a caller
|
|
318
|
+
* can annotate each name (the multi-vendor banner appends each vendor's figures)
|
|
319
|
+
* without duplicating the joining rules.
|
|
320
|
+
*/
|
|
321
|
+
function joinList(names: readonly string[]): string {
|
|
307
322
|
if (names.length <= 1) return names[0] ?? '';
|
|
308
323
|
return `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`;
|
|
309
324
|
}
|
|
@@ -1112,11 +1127,18 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1112
1127
|
}
|
|
1113
1128
|
|
|
1114
1129
|
/**
|
|
1115
|
-
* Whether the blocked banner has anything to say — a vendor-agnostic block,
|
|
1116
|
-
*
|
|
1117
|
-
*
|
|
1118
|
-
*
|
|
1119
|
-
*
|
|
1130
|
+
* Whether the blocked banner has anything to say — a vendor-agnostic block, or
|
|
1131
|
+
* a partial wall that the NEXT send would actually hit.
|
|
1132
|
+
*
|
|
1133
|
+
* Partial exhaustion is announced only while the ACTIVE vendor (the registry
|
|
1134
|
+
* default the next send resolves to) is among the walled ones. A user who has
|
|
1135
|
+
* switched to a vendor with headroom has already acted on the advice —
|
|
1136
|
+
* keeping the banner up past that point nagged about a vendor they just left
|
|
1137
|
+
* (GENC-1464 tester feedback), while switching BACK to the walled vendor
|
|
1138
|
+
* brings the banner straight back. Two conservative fallbacks keep it
|
|
1139
|
+
* fail-informative: while the statuses are still loading the active vendor is
|
|
1140
|
+
* unknowable, so any reachable-and-walled vendor still announces; and a
|
|
1141
|
+
* vendor-agnostic block announces always, exactly as before.
|
|
1120
1142
|
*
|
|
1121
1143
|
* Reads the reachability-filtered list for the same reason the copy does — a
|
|
1122
1144
|
* host that has swapped its registry away from the walled vendor has nothing
|
|
@@ -1127,7 +1149,12 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1127
1149
|
*/
|
|
1128
1150
|
@volatile
|
|
1129
1151
|
get bannerVisible(): boolean {
|
|
1130
|
-
|
|
1152
|
+
if (this.blocked) return true;
|
|
1153
|
+
const walled = this.relevantBlockedVendors;
|
|
1154
|
+
if (walled.length === 0) return false;
|
|
1155
|
+
const active = this.activeVendor;
|
|
1156
|
+
if (!active) return true;
|
|
1157
|
+
return walled.includes(active);
|
|
1131
1158
|
}
|
|
1132
1159
|
|
|
1133
1160
|
/**
|
|
@@ -1149,8 +1176,22 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1149
1176
|
@volatile
|
|
1150
1177
|
get suggestionsBlocked(): boolean {
|
|
1151
1178
|
if (this.blocked) return true;
|
|
1152
|
-
const
|
|
1153
|
-
return !!
|
|
1179
|
+
const active = this.activeVendor;
|
|
1180
|
+
return !!active && this.isVendorBlocked(active);
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
/**
|
|
1184
|
+
* The vendor the NEXT send resolves to — the registry default's provider, as
|
|
1185
|
+
* reported through `providerStatuses`. `undefined` while the statuses are
|
|
1186
|
+
* still loading (or when the default reports the `'none'` sentinel), which
|
|
1187
|
+
* every consumer treats conservatively.
|
|
1188
|
+
*
|
|
1189
|
+
* @internal
|
|
1190
|
+
*/
|
|
1191
|
+
@volatile
|
|
1192
|
+
private get activeVendor(): AIProviderType | undefined {
|
|
1193
|
+
const vendor = this.providerStatuses.find((e) => e.isDefault)?.status?.provider;
|
|
1194
|
+
return vendor && vendor !== 'none' ? vendor : undefined;
|
|
1154
1195
|
}
|
|
1155
1196
|
|
|
1156
1197
|
/**
|
|
@@ -1286,12 +1327,14 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1286
1327
|
// are required (`VendorBudgetFigures` is total, and half a meter is a lie),
|
|
1287
1328
|
// and the write goes through the captured `ref` like every other write here,
|
|
1288
1329
|
// so a teardown race cannot land it in a new session's store.
|
|
1330
|
+
let metered = false;
|
|
1289
1331
|
if (vendor && vendor !== 'none' && budget?.budgetUsd != null && budget?.spentUsd != null) {
|
|
1290
1332
|
ref?.actions.aiAssistant.setVendorBudget({
|
|
1291
1333
|
vendor,
|
|
1292
1334
|
figures: { budgetUsd: budget.budgetUsd, spentUsd: budget.spentUsd },
|
|
1293
1335
|
});
|
|
1294
1336
|
this.budgetMeterLastFedAt = Date.now();
|
|
1337
|
+
metered = true;
|
|
1295
1338
|
}
|
|
1296
1339
|
if (!vendor || vendor === 'none') {
|
|
1297
1340
|
if (!this.blocked) {
|
|
@@ -1317,7 +1360,15 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1317
1360
|
ref?.actions.aiAssistant.setVendorBlocked({
|
|
1318
1361
|
vendor,
|
|
1319
1362
|
blocked: true,
|
|
1320
|
-
reason:
|
|
1363
|
+
// No reason when the meter snap above already stored these figures: the
|
|
1364
|
+
// banner composes the same sentence from them, so carrying a copy here
|
|
1365
|
+
// would duplicate the dollars in two places that can drift apart. It would
|
|
1366
|
+
// also make this latch INDISTINGUISHABLE from host copy, which the banner
|
|
1367
|
+
// must preserve verbatim — and preserving boilerplate is what forced it to
|
|
1368
|
+
// repeat a sentence per walled vendor instead of folding them into one.
|
|
1369
|
+
// The partial-figures case still needs copy carried here: it has no meter
|
|
1370
|
+
// entry to compose from, and "an unknown amount of $50.00" is worth saying.
|
|
1371
|
+
reason: metered ? undefined : formatBlockedReason(budget, vendor),
|
|
1321
1372
|
});
|
|
1322
1373
|
}
|
|
1323
1374
|
// Last, so the vendor that actually refused this turn heads the wall order the
|
|
@@ -1385,12 +1436,14 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1385
1436
|
* vendors watched all of it vanish the moment a second one walled — replaced by
|
|
1386
1437
|
* generic copy, at the exact moment the situation got worse.
|
|
1387
1438
|
*
|
|
1388
|
-
* The compact
|
|
1389
|
-
*
|
|
1390
|
-
*
|
|
1391
|
-
*
|
|
1392
|
-
*
|
|
1393
|
-
*
|
|
1439
|
+
* The compact list is the DEFAULT shape for several walls, now carrying each
|
|
1440
|
+
* vendor's figures: "AI usage limits are reached for Gemini ($62.34 of $50.00)
|
|
1441
|
+
* and Anthropic ($31.10 of $30.00)." A driver latch stores no copy of its own
|
|
1442
|
+
* (it stores the figures, which this composes from), so that shape is what the
|
|
1443
|
+
* real budget flow produces. As soon as any walled vendor carries HOST copy,
|
|
1444
|
+
* which cannot be folded into a list item, the branch lists one statement per
|
|
1445
|
+
* vendor instead — falling back to composed copy for the ones that have none, so
|
|
1446
|
+
* the sentence set stays complete rather than silently naming a subset.
|
|
1394
1447
|
*
|
|
1395
1448
|
* @internal
|
|
1396
1449
|
*/
|
|
@@ -1409,15 +1462,35 @@ export class FoundationAiAssistant extends GenesisElement {
|
|
|
1409
1462
|
: RAISE_LIMIT_ACTION;
|
|
1410
1463
|
|
|
1411
1464
|
const reasons = this._sessionRef?.store.aiAssistant.blockedVendorReasons;
|
|
1465
|
+
const budgets = this._sessionRef?.store.aiAssistant.vendorBudgets;
|
|
1466
|
+
// The wall's own figures, read from the entry the METER renders, so the two
|
|
1467
|
+
// cannot state different dollars for the same vendor. A vendor with no entry
|
|
1468
|
+
// (a swept wall — the proxy's word, no figures of its own) contributes a bare
|
|
1469
|
+
// name rather than a gap where numbers should be.
|
|
1412
1470
|
const statementFor = (v: AIProviderType) =>
|
|
1413
|
-
reasons?.[v] ??
|
|
1471
|
+
reasons?.[v] ??
|
|
1472
|
+
formatBlockedReason(budgets?.[v], v) ??
|
|
1473
|
+
`${vendorDisplayName(v)}'s AI usage limit is reached.`;
|
|
1474
|
+
const nameWithFigures = (v: AIProviderType) => {
|
|
1475
|
+
const figures = budgets?.[v];
|
|
1476
|
+
return figures
|
|
1477
|
+
? `${vendorDisplayName(v)} (${formatUsd(figures.spentUsd)} of ${formatUsd(figures.budgetUsd)})`
|
|
1478
|
+
: vendorDisplayName(v);
|
|
1479
|
+
};
|
|
1414
1480
|
|
|
1415
1481
|
if (walled.length === 1) return `${statementFor(walled[0])} ${action}`;
|
|
1416
|
-
// Several walled vendors
|
|
1417
|
-
//
|
|
1418
|
-
//
|
|
1482
|
+
// Several walled vendors: fold them into ONE sentence carrying each vendor's
|
|
1483
|
+
// figures, rather than repeating "X's AI usage limit is reached (…)." per
|
|
1484
|
+
// vendor — the same clause twice reads like a stutter, and the second copy of
|
|
1485
|
+
// the boilerplate adds nothing the first did not already say.
|
|
1486
|
+
//
|
|
1487
|
+
// Host copy is not foldable: `setVendorBlocked` promises it survives verbatim,
|
|
1488
|
+
// and it cannot be rewritten into a list item. So the moment any walled vendor
|
|
1489
|
+
// carries some, the branch below lists one statement per vendor instead —
|
|
1490
|
+
// falling back to composed copy for the ones that have none, so the sentence
|
|
1491
|
+
// set stays complete rather than silently naming a subset.
|
|
1419
1492
|
if (!walled.some((v) => reasons?.[v])) {
|
|
1420
|
-
return `AI usage limits are reached for ${
|
|
1493
|
+
return `AI usage limits are reached for ${joinList(walled.map(nameWithFigures))}. ${action}`;
|
|
1421
1494
|
}
|
|
1422
1495
|
return `${walled.map(statementFor).join(' ')} ${action}`;
|
|
1423
1496
|
}
|