@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.
@@ -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'], vendor?: AIProviderType): string | undefined;
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, OR
2782
- * at least one walled vendor the registry can still reach. Broader than
2783
- * {@link FoundationAiAssistant.blocked} on purpose: partial exhaustion leaves
2784
- * the composer live but still needs to be announced, because the next turn may
2785
- * route to the walled vendor and fail.
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 "AI usage limits are reached for A and B." list is kept for the
2961
- * case it was written for: NO walled vendor carries copy, so a statement per
2962
- * vendor would just repeat one boilerplate sentence per name. As soon as any of
2963
- * them does carry copy, the branch lists one statement per vendor instead
2964
- * falling back to that same boilerplate for the ones that have none, so the
2965
- * sentence set stays complete rather than silently naming a subset.
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
  */
@@ -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'], vendor?: AIProviderType): string | undefined;
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, OR
517
- * at least one walled vendor the registry can still reach. Broader than
518
- * {@link FoundationAiAssistant.blocked} on purpose: partial exhaustion leaves
519
- * the composer live but still needs to be announced, because the next turn may
520
- * route to the walled vendor and fail.
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 "AI usage limits are reached for A and B." list is kept for the
696
- * case it was written for: NO walled vendor carries copy, so a statement per
697
- * vendor would just repeat one boilerplate sentence per name. As soon as any of
698
- * them does carry copy, the branch lists one statement per vendor instead
699
- * falling back to that same boilerplate for the ones that have none, so the
700
- * sentence set stays complete rather than silently naming a subset.
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
- // The refusing vendor carries the 402's figures, so the multi-vendor branch
751
- // composes them in rather than dropping to the generic list the swept vendor
752
- // has no figures of its own (only the proxy's word), so it gets the boilerplate.
753
- assert.is(el.effectiveBlockedReason, "Anthropic's AI usage limit is reached ($500.00 of $500.00). " +
754
- "Gemini's AI usage limit is reached. Contact your administrator to raise them.");
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', () => {
@@ -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(budget, vendor) {
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
- return vendor
155
- ? `${vendorDisplayName(vendor)}'s AI usage limit is reached ${figures}.`
156
- : `AI usage limit reached ${figures}. Contact your administrator to raise it.`;
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, OR
1069
- * at least one walled vendor the registry can still reach. Broader than
1070
- * {@link FoundationAiAssistant.blocked} on purpose: partial exhaustion leaves
1071
- * the composer live but still needs to be announced, because the next turn may
1072
- * route to the walled vendor and fail.
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
- return this.blocked || this.relevantBlockedVendors.length > 0;
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 defaultVendor = (_b = (_a = this.providerStatuses.find((e) => e.isDefault)) === null || _a === void 0 ? void 0 : _a.status) === null || _b === void 0 ? void 0 : _b.provider;
1105
- return !!defaultVendor && defaultVendor !== 'none' && this.isVendorBlocked(defaultVendor);
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: formatBlockedReason(budget, vendor),
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 "AI usage limits are reached for A and B." list is kept for the
1338
- * case it was written for: NO walled vendor carries copy, so a statement per
1339
- * vendor would just repeat one boilerplate sentence per name. As soon as any of
1340
- * them does carry copy, the branch lists one statement per vendor instead
1341
- * falling back to that same boilerplate for the ones that have none, so the
1342
- * sentence set stays complete rather than silently naming a subset.
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 statementFor = (v) => { var _a; return (_a = reasons === null || reasons === void 0 ? void 0 : reasons[v]) !== null && _a !== void 0 ? _a : `${vendorDisplayName(v)}'s AI usage limit is reached.`; };
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 carry several sets of figures, which do not fit one
1364
- // sentence. With no per-vendor copy to preserve, name them in a list rather
1365
- // than repeat the same boilerplate sentence per vendor.
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 ${formatVendorList(walled)}. ${action}`;
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 with several walled vendors carrying no copy of their own, the figures do not
277
- fit one sentence, so it names them:
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**. As soon as any walled vendor carries copy, the banner reads
284
- one statement per vendor instead of the compact list above, so nothing you set is
285
- dropped when a second vendor goes:
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 the boilerplate sentence in that form
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.13.1",
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.13.1",
77
- "@genesislcap/genx": "15.13.1",
78
- "@genesislcap/rollup-builder": "15.13.1",
79
- "@genesislcap/ts-builder": "15.13.1",
80
- "@genesislcap/uvu-playwright-builder": "15.13.1",
81
- "@genesislcap/vite-builder": "15.13.1",
82
- "@genesislcap/webpack-builder": "15.13.1",
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.13.1",
89
- "@genesislcap/foundation-logger": "15.13.1",
90
- "@genesislcap/foundation-notifications": "15.13.1",
91
- "@genesislcap/foundation-redux": "15.13.1",
92
- "@genesislcap/foundation-ui": "15.13.1",
93
- "@genesislcap/foundation-utils": "15.13.1",
94
- "@genesislcap/rapid-design-system": "15.13.1",
95
- "@genesislcap/web-core": "15.13.1",
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": "4ac0cfb22051b17da81586baf5166c9b605fae10"
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
- // The refusing vendor carries the 402's figures, so the multi-vendor branch
1037
- // composes them in rather than dropping to the generic list the swept vendor
1038
- // has no figures of its own (only the proxy's word), so it gets the boilerplate.
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
- "Anthropic's AI usage limit is reached ($500.00 of $500.00). " +
1042
- "Gemini's AI usage limit is reached. Contact your administrator to raise them.",
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
- budget?: Extract<ChatDriverResult, { reason: 'done' }>['budget'],
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 vendor
273
- ? `${vendorDisplayName(vendor)}'s AI usage limit is reached ${figures}.`
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
- const names = vendors.map(vendorDisplayName);
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, OR
1116
- * at least one walled vendor the registry can still reach. Broader than
1117
- * {@link FoundationAiAssistant.blocked} on purpose: partial exhaustion leaves
1118
- * the composer live but still needs to be announced, because the next turn may
1119
- * route to the walled vendor and fail.
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
- return this.blocked || this.relevantBlockedVendors.length > 0;
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 defaultVendor = this.providerStatuses.find((e) => e.isDefault)?.status?.provider;
1153
- return !!defaultVendor && defaultVendor !== 'none' && this.isVendorBlocked(defaultVendor);
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: formatBlockedReason(budget, vendor),
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 "AI usage limits are reached for A and B." list is kept for the
1389
- * case it was written for: NO walled vendor carries copy, so a statement per
1390
- * vendor would just repeat one boilerplate sentence per name. As soon as any of
1391
- * them does carry copy, the branch lists one statement per vendor instead
1392
- * falling back to that same boilerplate for the ones that have none, so the
1393
- * sentence set stays complete rather than silently naming a subset.
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] ?? `${vendorDisplayName(v)}'s AI usage limit is reached.`;
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 carry several sets of figures, which do not fit one
1417
- // sentence. With no per-vendor copy to preserve, name them in a list rather
1418
- // than repeat the same boilerplate sentence per vendor.
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 ${formatVendorList(walled)}. ${action}`;
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
  }