@genesislcap/ai-assistant 15.32.1 → 15.33.1-GENC-1601.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/ai-assistant.api.json +1181 -121
  2. package/dist/ai-assistant.d.ts +207 -7
  3. package/dist/chat-driver.cjs +74 -0
  4. package/dist/chat-driver.cjs.map +3 -3
  5. package/dist/chat-driver.mjs +70 -0
  6. package/dist/chat-driver.mjs.map +3 -3
  7. package/dist/custom-elements.json +394 -68
  8. package/dist/dts/chat-driver-node.d.ts +2 -2
  9. package/dist/dts/chat-driver-node.d.ts.map +1 -1
  10. package/dist/dts/components/settings-modal/settings-modal.styles.d.ts.map +1 -1
  11. package/dist/dts/components/settings-modal/settings-modal.template.d.ts.map +1 -1
  12. package/dist/dts/index.d.ts +2 -0
  13. package/dist/dts/index.d.ts.map +1 -1
  14. package/dist/dts/main/budget-controller.d.ts +33 -6
  15. package/dist/dts/main/budget-controller.d.ts.map +1 -1
  16. package/dist/dts/main/main.d.ts +37 -6
  17. package/dist/dts/main/main.d.ts.map +1 -1
  18. package/dist/dts/main/main.types.d.ts +25 -0
  19. package/dist/dts/main/main.types.d.ts.map +1 -1
  20. package/dist/dts/provider/tiered-provider-switcher.d.ts +116 -0
  21. package/dist/dts/provider/tiered-provider-switcher.d.ts.map +1 -0
  22. package/dist/dts/state/ai-assistant-slice.d.ts +24 -0
  23. package/dist/dts/state/ai-assistant-slice.d.ts.map +1 -1
  24. package/dist/dts/state/persistence/diagnostics.d.ts +15 -4
  25. package/dist/dts/state/persistence/diagnostics.d.ts.map +1 -1
  26. package/dist/dts/state/persistence/session-persister.d.ts +2 -2
  27. package/dist/dts/state/persistence/session-persister.d.ts.map +1 -1
  28. package/dist/dts/state/session-store.d.ts.map +1 -1
  29. package/dist/esm/chat-driver-node.js +11 -1
  30. package/dist/esm/components/settings-modal/settings-modal.styles.js +76 -0
  31. package/dist/esm/components/settings-modal/settings-modal.template.js +45 -4
  32. package/dist/esm/index.js +1 -0
  33. package/dist/esm/main/budget-controller.js +123 -6
  34. package/dist/esm/main/main.js +37 -4
  35. package/dist/esm/main/meta-snapshot.js +1 -1
  36. package/dist/esm/provider/tiered-provider-switcher.js +122 -0
  37. package/dist/esm/state/ai-assistant-slice.js +17 -3
  38. package/dist/esm/state/persistence/diagnostics.js +49 -6
  39. package/dist/esm/state/persistence/session-persister.js +10 -14
  40. package/docs/styling.md +16 -0
  41. package/package.json +18 -17
  42. package/sandbox/sandbox.ts +52 -0
  43. package/scripts/smoke-chat-driver-node.mjs +86 -0
@@ -11401,6 +11401,51 @@
11401
11401
  "isAbstract": false,
11402
11402
  "name": "getDebugLog"
11403
11403
  },
11404
+ {
11405
+ "kind": "Method",
11406
+ "canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#getLifetimeDebugLog:member(1)",
11407
+ "docComment": "/**\n * The log to download (GENC-1351 §5.8). When the provider persists diagnostics, stitch the **whole lifetime** stream (every page load) rather than just the current page's in-memory view: flush the current delta first so it's included, then reassemble everything `loadDiagnostics` returns. Independent of \"remember chat\" — diagnostics are a forensic stream keyed on provider capability, not on whether the *chat* is remembered (like preferences). Falls back to the live current-page log when diagnostics isn't available or the fetch fails.\n *\n * The stored `meta-snapshot`s are replaced by a fresh one (`withFreshMetaSnapshot`) before reassembly. The persisted stream only re-appends that block when the near-static config signature changes (see `collectDiagnosticsDelta`), so on a session whose config never changes the newest STORED snapshot is the first one — its `context` half (session cost/usage, context tokens, live agent state) frozen seconds into the session, which is how a lifetime log came out reporting near-zero spend against a transcript full of priced messages.\n *\n * PUBLIC (GENC-1625) so a host can ship this exact document somewhere other than the user's downloads folder — Genesis Create writes it into its project export archive, where it is what a support engineer (increasingly, an agent) opens first. Public rather than copied: a host assembling its own would need `DEBUG_LOG_README`, a flush of the pending delta and a fresh `meta-snapshot`, and the moment there are two derivations one of them starts drifting — which for this log means silently understating spend, the bug `withFreshMetaSnapshot` exists to fix.\n *\n * Safe to call at any time: it never throws (a failed diagnostics load degrades to the current-page log) and it has no side effect on the chat beyond landing the delta the next throttled flush would have landed anyway.\n *\n * @public\n */\n",
11408
+ "excerptTokens": [
11409
+ {
11410
+ "kind": "Content",
11411
+ "text": "getLifetimeDebugLog(): "
11412
+ },
11413
+ {
11414
+ "kind": "Reference",
11415
+ "text": "Promise",
11416
+ "canonicalReference": "!Promise:interface"
11417
+ },
11418
+ {
11419
+ "kind": "Content",
11420
+ "text": "<"
11421
+ },
11422
+ {
11423
+ "kind": "Reference",
11424
+ "text": "DebugLog",
11425
+ "canonicalReference": "@genesislcap/ai-assistant!DebugLog:interface"
11426
+ },
11427
+ {
11428
+ "kind": "Content",
11429
+ "text": ">"
11430
+ },
11431
+ {
11432
+ "kind": "Content",
11433
+ "text": ";"
11434
+ }
11435
+ ],
11436
+ "isStatic": false,
11437
+ "returnTypeTokenRange": {
11438
+ "startIndex": 1,
11439
+ "endIndex": 5
11440
+ },
11441
+ "releaseTag": "Public",
11442
+ "isProtected": false,
11443
+ "overloadIndex": 1,
11444
+ "parameters": [],
11445
+ "isOptional": false,
11446
+ "isAbstract": false,
11447
+ "name": "getLifetimeDebugLog"
11448
+ },
11404
11449
  {
11405
11450
  "kind": "Method",
11406
11451
  "canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#handleFileSelect:member(1)",
@@ -14969,7 +15014,7 @@
14969
15014
  {
14970
15015
  "kind": "Method",
14971
15016
  "canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#setVendorBudget:member(1)",
14972
- "docComment": "/**\n * Feed (or clear) one vendor's AI-spend figures for the settings-modal budget meter — the numeric companion to {@link FoundationAiAssistant.setVendorBlocked}, and like it a host-driven write: the element meters nothing itself.\n *\n * The meter renders a row for exactly the vendors that currently HAVE figures. An **unlimited** vendor (the budget endpoint reports `unlimited: true` / `limitUsd: null`) is expressed by never feeding it — there is deliberately no \"unlimited\" figure shape, because a bar with no cap has nothing truthful to fill to. `spentUsd` MAY exceed `budgetUsd` (the last allowed call can overshoot the cap): the row's text shows the real figures and only the bar clamps.\n *\n * Returns `false` — and warns once, not per call — instead of throwing when `vendor` is not a budgeted vendor (`BUDGETED_VENDORS`, the proxy's own metered list) or either figure is not a finite number `>= 0`. Invalid input changes no state. Idempotent: re-feeding a vendor's current figures is a no-op, so hosts can re-feed unconditionally after every turn.\n *\n * `false` ALSO means \"not stored, because the element is not ready yet\": a feed that lands before the element has its session store (a host calling ahead of the first append, or during a pop-out remount) stores nothing and says so, rather than reporting a write that never happened. That case is transient and needs no host handling — the documented per-turn re-feed is what recovers it — so it is deliberately NOT warned about; the warn-once channel is for garbage input only.\n *\n * `figures` is nullish-checked at run time, so `undefined` behaves exactly like `null` and CLEARS that vendor's row. Untyped JS hosts feed this straight from `GET /api/budget`, where a per-vendor lookup that misses yields `undefined`, not `null` — and \"no figures\" coherently means \"no row\". The `| null` parameter type is unchanged for typed callers; the runtime is deliberately the more forgiving of the two.\n *\n * The intended feed is the platform budget endpoint:\n * ```ts\n * // `vendors` is an OBJECT keyed by vendor id, not an array.\n * const { vendors } = await (await fetch('/api/budget')).json();\n * for (const v of Object.values(vendors)) {\n * if (v.unlimited || v.limitUsd == null) {\n * assistantEl.setVendorBudget(v.vendor, null); // clear stale figures after a cap is lifted\n * continue;\n * }\n * assistantEl.setVendorBudget(v.vendor, { budgetUsd: v.limitUsd, spentUsd: v.spentUsd });\n * }\n * ```\n *\n * Re-run it on mount and after each turn. Scope and lifetime follow the rest of the session slice (per `stateKey`, survives pop-in/out and \"Clear\" / \"New chat\") — except that the figures are NOT persisted to the session snapshot: the server is authoritative and the host re-feeds at boot, so a persisted copy could only show stale dollars after a reload.\n *\n * @beta\n */\n",
15017
+ "docComment": "/**\n * Feed (or clear) one vendor's AI-spend figures for the settings-modal budget meter — the numeric companion to {@link FoundationAiAssistant.setVendorBlocked}, and like it a host-driven write: the element meters nothing itself.\n *\n * The meter renders a row for exactly the vendors that currently HAVE figures. An **unlimited** vendor (the budget endpoint reports `unlimited: true` / `limitUsd: null`) is expressed by never feeding it — there is deliberately no \"unlimited\" figure shape, because a bar with no cap has nothing truthful to fill to. `spentUsd` MAY exceed `budgetUsd` (the last allowed call can overshoot the cap): the row's text shows the real figures and only the bar clamps.\n *\n * Returns `false` — and warns once, not per call — instead of throwing when `vendor` is not a budgeted vendor (`BUDGETED_VENDORS`, the proxy's own metered list) or either figure is not a finite number `>= 0`. Invalid input changes no state. Idempotent: re-feeding a vendor's current figures is a no-op, so hosts can re-feed unconditionally after every turn.\n *\n * `false` ALSO means \"not stored, because the element is not ready yet\": a feed that lands before the element has its session store (a host calling ahead of the first append, or during a pop-out remount) stores nothing and says so, rather than reporting a write that never happened. That case is transient and needs no host handling — the documented per-turn re-feed is what recovers it — so it is deliberately NOT warned about; the warn-once channel is for garbage input only.\n *\n * `figures` is nullish-checked at run time, so `undefined` behaves exactly like `null` and CLEARS that vendor's row. Untyped JS hosts feed this straight from `GET /api/budget`, where a per-vendor lookup that misses yields `undefined`, not `null` — and \"no figures\" coherently means \"no row\". The `| null` parameter type is unchanged for typed callers; the runtime is deliberately the more forgiving of the two.\n *\n * The intended feed is the platform budget endpoint:\n * ```ts\n * // `vendors` is an OBJECT keyed by vendor id, not an array.\n * const { vendors } = await (await fetch('/api/budget')).json();\n * for (const v of Object.values(vendors)) {\n * if (v.unlimited || v.limitUsd == null) {\n * assistantEl.setVendorBudget(v.vendor, null); // clear stale figures after a cap is lifted\n * continue;\n * }\n * assistantEl.setVendorBudget(v.vendor, { budgetUsd: v.limitUsd, spentUsd: v.spentUsd });\n * }\n * ```\n *\n * A host that meters its spend by source can pass an optional `segments` breakdown, and the vendor's bar is drawn stacked with a legend naming each one (NEW-15):\n * ```ts\n * assistantEl.setVendorBudget('anthropic', {\n * budgetUsd: 50,\n * spentUsd: 12.5,\n * segments: [\n * { id: 'app', label: 'App', spentUsd: 9 },\n * { id: 'batch', label: 'Batch jobs', spentUsd: 3.5 },\n * ],\n * });\n * ```\n *\n * The labels are yours — the assistant has no vocabulary for what a host spends money on. Segments may add up to less than `spentUsd` (the remainder draws unlabelled) but never to more; a breakdown that does, or that is otherwise malformed, is dropped with a debug log and the single bar renders. Omit `segments` entirely and nothing about the meter changes.\n *\n * Re-run it on mount and after each turn. Scope and lifetime follow the rest of the session slice (per `stateKey`, survives pop-in/out and \"Clear\" / \"New chat\") — except that the figures are NOT persisted to the session snapshot: the server is authoritative and the host re-feeds at boot, so a persisted copy could only show stale dollars after a reload.\n *\n * @beta\n */\n",
14973
15018
  "excerptTokens": [
14974
15019
  {
14975
15020
  "kind": "Content",
@@ -14983,9 +15028,14 @@
14983
15028
  "kind": "Content",
14984
15029
  "text": ", figures: "
14985
15030
  },
15031
+ {
15032
+ "kind": "Reference",
15033
+ "text": "VendorBudgetFigures",
15034
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetFigures:interface"
15035
+ },
14986
15036
  {
14987
15037
  "kind": "Content",
14988
- "text": "{\n budgetUsd: number;\n spentUsd: number;\n } | null"
15038
+ "text": " | null"
14989
15039
  },
14990
15040
  {
14991
15041
  "kind": "Content",
@@ -15002,8 +15052,8 @@
15002
15052
  ],
15003
15053
  "isStatic": false,
15004
15054
  "returnTypeTokenRange": {
15005
- "startIndex": 5,
15006
- "endIndex": 6
15055
+ "startIndex": 6,
15056
+ "endIndex": 7
15007
15057
  },
15008
15058
  "releaseTag": "Beta",
15009
15059
  "isProtected": false,
@@ -15021,7 +15071,7 @@
15021
15071
  "parameterName": "figures",
15022
15072
  "parameterTypeTokenRange": {
15023
15073
  "startIndex": 3,
15024
- "endIndex": 4
15074
+ "endIndex": 5
15025
15075
  },
15026
15076
  "isOptional": false
15027
15077
  }
@@ -15538,7 +15588,7 @@
15538
15588
  {
15539
15589
  "kind": "Method",
15540
15590
  "canonicalReference": "@genesislcap/ai-assistant!FoundationAiAssistant#submitDebugLog:member(1)",
15541
- "docComment": "/**\n * Hand the agent log to the host's `ui.debugLogSubmit.send` callback — the Send button next to Download. Reuses `buildDownloadLog`, so the submitted log is byte-identical to what Download saves (lifetime-stitched when the provider persists diagnostics). The assistant is vendor-agnostic: the callback owns the transport (Sentry feedback, a support API, an upload endpoint). Outcome lands in `debugLogSubmitResult` so the button can flash 'Sent'/'Failed'; failures also go to the logger with the cause.\n */\n",
15591
+ "docComment": "/**\n * Hand the agent log to the host's `ui.debugLogSubmit.send` callback — the Send button next to Download. Reuses `getLifetimeDebugLog`, so the submitted log is byte-identical to what Download saves (lifetime-stitched when the provider persists diagnostics). The assistant is vendor-agnostic: the callback owns the transport (Sentry feedback, a support API, an upload endpoint). Outcome lands in `debugLogSubmitResult` so the button can flash 'Sent'/'Failed'; failures also go to the logger with the cause.\n */\n",
15542
15592
  "excerptTokens": [
15543
15593
  {
15544
15594
  "kind": "Content",
@@ -19276,6 +19326,83 @@
19276
19326
  "endIndex": 6
19277
19327
  }
19278
19328
  },
19329
+ {
19330
+ "kind": "Function",
19331
+ "canonicalReference": "@genesislcap/ai-assistant!registerTieredAIProviders:function(1)",
19332
+ "docComment": "/**\n * Build a {@link TieredAIProviderSwitcher} — which registers the tier-shaped provider registry — and put it on the {@link (AIProviderSwitcher:variable)} token. Call once at app bootstrap.\n *\n * @remarks\n *\n * Everything here is synchronous and has to stay that way. `foundation-ai-assistant` resolves the switcher and registry tokens as it connects, and an element that connects first caches the no-op fallback — so an `await` above this call costs the whole page load its providers. Load a stored vendor preference AFTER it, through {@link TieredAIProviderSwitcher.adoptPersistedVendor}.\n *\n * @beta\n */\n",
19333
+ "excerptTokens": [
19334
+ {
19335
+ "kind": "Content",
19336
+ "text": "export declare function registerTieredAIProviders(container: "
19337
+ },
19338
+ {
19339
+ "kind": "Reference",
19340
+ "text": "Container",
19341
+ "canonicalReference": "@microsoft/fast-foundation!Container:interface"
19342
+ },
19343
+ {
19344
+ "kind": "Content",
19345
+ "text": ", options: "
19346
+ },
19347
+ {
19348
+ "kind": "Reference",
19349
+ "text": "Omit",
19350
+ "canonicalReference": "!Omit:type"
19351
+ },
19352
+ {
19353
+ "kind": "Content",
19354
+ "text": "<"
19355
+ },
19356
+ {
19357
+ "kind": "Reference",
19358
+ "text": "TieredAIProviderSwitcherOptions",
19359
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions:interface"
19360
+ },
19361
+ {
19362
+ "kind": "Content",
19363
+ "text": ", 'container'>"
19364
+ },
19365
+ {
19366
+ "kind": "Content",
19367
+ "text": "): "
19368
+ },
19369
+ {
19370
+ "kind": "Reference",
19371
+ "text": "TieredAIProviderSwitcher",
19372
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher:class"
19373
+ },
19374
+ {
19375
+ "kind": "Content",
19376
+ "text": ";"
19377
+ }
19378
+ ],
19379
+ "fileUrlPath": "src/provider/tiered-provider-switcher.ts",
19380
+ "returnTypeTokenRange": {
19381
+ "startIndex": 8,
19382
+ "endIndex": 9
19383
+ },
19384
+ "releaseTag": "Beta",
19385
+ "overloadIndex": 1,
19386
+ "parameters": [
19387
+ {
19388
+ "parameterName": "container",
19389
+ "parameterTypeTokenRange": {
19390
+ "startIndex": 1,
19391
+ "endIndex": 2
19392
+ },
19393
+ "isOptional": false
19394
+ },
19395
+ {
19396
+ "parameterName": "options",
19397
+ "parameterTypeTokenRange": {
19398
+ "startIndex": 3,
19399
+ "endIndex": 7
19400
+ },
19401
+ "isOptional": false
19402
+ }
19403
+ ],
19404
+ "name": "registerTieredAIProviders"
19405
+ },
19279
19406
  {
19280
19407
  "kind": "Variable",
19281
19408
  "canonicalReference": "@genesislcap/ai-assistant!REQUEST_CONTINUATION_TOOL:var",
@@ -20708,6 +20835,38 @@
20708
20835
  "endIndex": 2
20709
20836
  }
20710
20837
  },
20838
+ {
20839
+ "kind": "PropertySignature",
20840
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetRow#segments:member",
20841
+ "docComment": "/**\n * The stacked bar's pieces when the host broke this vendor's spend down, and `undefined` when it did not — in which case the row renders the design system's single progress bar, exactly as before (NEW-15).\n */\n",
20842
+ "excerptTokens": [
20843
+ {
20844
+ "kind": "Content",
20845
+ "text": "segments?: "
20846
+ },
20847
+ {
20848
+ "kind": "Reference",
20849
+ "text": "SettingsBudgetSegment",
20850
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment:interface"
20851
+ },
20852
+ {
20853
+ "kind": "Content",
20854
+ "text": "[]"
20855
+ },
20856
+ {
20857
+ "kind": "Content",
20858
+ "text": ";"
20859
+ }
20860
+ ],
20861
+ "isReadonly": false,
20862
+ "isOptional": true,
20863
+ "releaseTag": "Beta",
20864
+ "name": "segments",
20865
+ "propertyTypeTokenRange": {
20866
+ "startIndex": 1,
20867
+ "endIndex": 3
20868
+ }
20869
+ },
20711
20870
  {
20712
20871
  "kind": "PropertySignature",
20713
20872
  "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetRow#vendor:member",
@@ -20740,31 +20899,31 @@
20740
20899
  },
20741
20900
  {
20742
20901
  "kind": "Interface",
20743
- "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage:interface",
20744
- "docComment": "/**\n * The settings-modal context-window indicator, pre-formatted — the context sibling of {@link SettingsBudgetRow}, and pre-formatted for the same reason: the template stays a pure binding layer, and a test can pin the exact text.\n *\n * `undefined` when there is nothing measurable to show, which is what keeps the template free of non-null assertions. It used to read `x.contextTokens!.toLocaleString()`, and the assertion was not merely untidy: those bindings sit inside a `when(...)` block and re-evaluate in the SAME notify batch as the guard that unmounts them, so a session Clear with the modal open on the Usage tab threw two `TypeError`s per render. A shape that can be absent cannot have that bug.\n *\n * @beta\n */\n",
20902
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment:interface",
20903
+ "docComment": "/**\n * One piece of a stacked budget bar, pre-computed — see {@link SettingsBudgetRow.segments}.\n *\n * @beta\n */\n",
20745
20904
  "excerptTokens": [
20746
20905
  {
20747
20906
  "kind": "Content",
20748
- "text": "export interface SettingsContextUsage "
20907
+ "text": "export interface SettingsBudgetSegment "
20749
20908
  }
20750
20909
  ],
20751
20910
  "fileUrlPath": "src/main/main.types.ts",
20752
20911
  "releaseTag": "Beta",
20753
- "name": "SettingsContextUsage",
20912
+ "name": "SettingsBudgetSegment",
20754
20913
  "preserveMemberOrder": false,
20755
20914
  "members": [
20756
20915
  {
20757
20916
  "kind": "PropertySignature",
20758
- "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#barValue:member",
20759
- "docComment": "/**\n * The bar's value, clamped to `0..100` — only the bar clamps.\n */\n",
20917
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment#figures:member",
20918
+ "docComment": "/**\n * This piece's spend, e.g. `$12.34`. Empty for the remainder.\n */\n",
20760
20919
  "excerptTokens": [
20761
20920
  {
20762
20921
  "kind": "Content",
20763
- "text": "barValue: "
20922
+ "text": "figures: "
20764
20923
  },
20765
20924
  {
20766
20925
  "kind": "Content",
20767
- "text": "number"
20926
+ "text": "string"
20768
20927
  },
20769
20928
  {
20770
20929
  "kind": "Content",
@@ -20774,7 +20933,7 @@
20774
20933
  "isReadonly": false,
20775
20934
  "isOptional": false,
20776
20935
  "releaseTag": "Beta",
20777
- "name": "barValue",
20936
+ "name": "figures",
20778
20937
  "propertyTypeTokenRange": {
20779
20938
  "startIndex": 1,
20780
20939
  "endIndex": 2
@@ -20782,12 +20941,12 @@
20782
20941
  },
20783
20942
  {
20784
20943
  "kind": "PropertySignature",
20785
- "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#limit:member",
20786
- "docComment": "/**\n * The model's context window, e.g. `200,000`.\n */\n",
20944
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment#id:member",
20945
+ "docComment": "/**\n * The host's segment id, or the platform's own id for the unattributed remainder.\n */\n",
20787
20946
  "excerptTokens": [
20788
20947
  {
20789
20948
  "kind": "Content",
20790
- "text": "limit: "
20949
+ "text": "id: "
20791
20950
  },
20792
20951
  {
20793
20952
  "kind": "Content",
@@ -20801,7 +20960,7 @@
20801
20960
  "isReadonly": false,
20802
20961
  "isOptional": false,
20803
20962
  "releaseTag": "Beta",
20804
- "name": "limit",
20963
+ "name": "id",
20805
20964
  "propertyTypeTokenRange": {
20806
20965
  "startIndex": 1,
20807
20966
  "endIndex": 2
@@ -20809,16 +20968,16 @@
20809
20968
  },
20810
20969
  {
20811
20970
  "kind": "PropertySignature",
20812
- "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#percent:member",
20813
- "docComment": "/**\n * Whole-number percent consumed. Unclamped, like the budget row's text.\n */\n",
20971
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment#label:member",
20972
+ "docComment": "/**\n * The host's label. Empty for the remainder, which the legend does not list.\n */\n",
20814
20973
  "excerptTokens": [
20815
20974
  {
20816
20975
  "kind": "Content",
20817
- "text": "percent: "
20976
+ "text": "label: "
20818
20977
  },
20819
20978
  {
20820
20979
  "kind": "Content",
20821
- "text": "number"
20980
+ "text": "string"
20822
20981
  },
20823
20982
  {
20824
20983
  "kind": "Content",
@@ -20828,7 +20987,7 @@
20828
20987
  "isReadonly": false,
20829
20988
  "isOptional": false,
20830
20989
  "releaseTag": "Beta",
20831
- "name": "percent",
20990
+ "name": "label",
20832
20991
  "propertyTypeTokenRange": {
20833
20992
  "startIndex": 1,
20834
20993
  "endIndex": 2
@@ -20836,16 +20995,16 @@
20836
20995
  },
20837
20996
  {
20838
20997
  "kind": "PropertySignature",
20839
- "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#used:member",
20840
- "docComment": "/**\n * Prompt tokens on the last call, e.g. `12,480`.\n */\n",
20998
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment#legend:member",
20999
+ "docComment": "/**\n * Whether this piece appears in the legend — false for the unattributed remainder.\n */\n",
20841
21000
  "excerptTokens": [
20842
21001
  {
20843
21002
  "kind": "Content",
20844
- "text": "used: "
21003
+ "text": "legend: "
20845
21004
  },
20846
21005
  {
20847
21006
  "kind": "Content",
20848
- "text": "string"
21007
+ "text": "boolean"
20849
21008
  },
20850
21009
  {
20851
21010
  "kind": "Content",
@@ -20855,78 +21014,24 @@
20855
21014
  "isReadonly": false,
20856
21015
  "isOptional": false,
20857
21016
  "releaseTag": "Beta",
20858
- "name": "used",
21017
+ "name": "legend",
20859
21018
  "propertyTypeTokenRange": {
20860
21019
  "startIndex": 1,
20861
21020
  "endIndex": 2
20862
21021
  }
20863
- }
20864
- ],
20865
- "extendsTokenRanges": []
20866
- },
20867
- {
20868
- "kind": "Variable",
20869
- "canonicalReference": "@genesislcap/ai-assistant!sparkleIconSvg:var",
20870
- "docComment": "/**\n * Three-star AI \"sparkle\" mark — the conventional AI signifier; default assistant avatar.\n */\n",
20871
- "excerptTokens": [
20872
- {
20873
- "kind": "Content",
20874
- "text": "sparkleIconSvg = "
20875
- },
20876
- {
20877
- "kind": "Content",
20878
- "text": "\"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M9.5 5 C9.5 11.4 11.1 13 17.5 13 C11.1 13 9.5 14.6 9.5 21 C9.5 14.6 7.9 13 1.5 13 C7.9 13 9.5 11.4 9.5 5 Z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M17 2.5 C17 5.7 17.8 6.5 21 6.5 C17.8 6.5 17 7.3 17 10.5 C17 7.3 16.2 6.5 13 6.5 C16.2 6.5 17 5.7 17 2.5 Z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M17.5 15 C17.5 17 18 17.5 20 17.5 C18 17.5 17.5 18 17.5 20 C17.5 18 17 17.5 15 17.5 C17 17.5 17.5 17 17.5 15 Z\\\" fill=\\\"currentColor\\\"/></svg>\""
20879
- }
20880
- ],
20881
- "fileUrlPath": "src/main/main.ts",
20882
- "initializerTokenRange": {
20883
- "startIndex": 1,
20884
- "endIndex": 2
20885
- },
20886
- "isReadonly": true,
20887
- "releaseTag": "Public",
20888
- "name": "sparkleIconSvg",
20889
- "variableTypeTokenRange": {
20890
- "startIndex": 0,
20891
- "endIndex": 0
20892
- }
20893
- },
20894
- {
20895
- "kind": "Interface",
20896
- "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig:interface",
20897
- "docComment": "/**\n * Configuration for a specialist agent.\n *\n * Specialist agents are offered to the classifier for intent routing. The `description` is used to auto-generate the classifier prompt — no manual routing prompt authoring required.\n *\n * @beta\n */\n",
20898
- "excerptTokens": [
20899
- {
20900
- "kind": "Content",
20901
- "text": "export interface SpecialistAgentConfig extends "
20902
- },
20903
- {
20904
- "kind": "Reference",
20905
- "text": "BaseAgentConfig",
20906
- "canonicalReference": "@genesislcap/ai-assistant!~BaseAgentConfig:interface"
20907
21022
  },
20908
- {
20909
- "kind": "Content",
20910
- "text": " "
20911
- }
20912
- ],
20913
- "fileUrlPath": "src/config/config.ts",
20914
- "releaseTag": "Beta",
20915
- "name": "SpecialistAgentConfig",
20916
- "preserveMemberOrder": false,
20917
- "members": [
20918
21023
  {
20919
21024
  "kind": "PropertySignature",
20920
- "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig#description:member",
20921
- "docComment": "/**\n * Plain-language description of what this agent handles. Used by the classifier to auto-generate its routing prompt.\n */\n",
21025
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment#tone:member",
21026
+ "docComment": "/**\n * Alpha applied to the design system's accent, so the pieces read as one measure.\n */\n",
20922
21027
  "excerptTokens": [
20923
21028
  {
20924
21029
  "kind": "Content",
20925
- "text": "description: "
21030
+ "text": "tone: "
20926
21031
  },
20927
21032
  {
20928
21033
  "kind": "Content",
20929
- "text": "string"
21034
+ "text": "number"
20930
21035
  },
20931
21036
  {
20932
21037
  "kind": "Content",
@@ -20936,7 +21041,7 @@
20936
21041
  "isReadonly": false,
20937
21042
  "isOptional": false,
20938
21043
  "releaseTag": "Beta",
20939
- "name": "description",
21044
+ "name": "tone",
20940
21045
  "propertyTypeTokenRange": {
20941
21046
  "startIndex": 1,
20942
21047
  "endIndex": 2
@@ -20944,16 +21049,16 @@
20944
21049
  },
20945
21050
  {
20946
21051
  "kind": "PropertySignature",
20947
- "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig#excludeFromClassifier:member",
20948
- "docComment": "/**\n * When `true`, the classifier never auto-routes to this agent. The user can still select it manually via the picker, provided both prerequisites are met: this agent has `manualSelection.enabled` set to `true`, *and* the assistant has the picker enabled via `chatConfig.picker.mode`.\n *\n * Use this for agents that overlap heavily with a sibling (e.g. a guided wizard sitting next to a free-form agent in the same domain) and should only be reached intentionally rather than via classifier routing.\n *\n * @beta\n */\n",
21052
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsBudgetSegment#widthPercent:member",
21053
+ "docComment": "/**\n * Width as a percentage of the row's full track, already scaled to the clamped bar.\n */\n",
20949
21054
  "excerptTokens": [
20950
21055
  {
20951
21056
  "kind": "Content",
20952
- "text": "excludeFromClassifier?: "
21057
+ "text": "widthPercent: "
20953
21058
  },
20954
21059
  {
20955
21060
  "kind": "Content",
20956
- "text": "boolean"
21061
+ "text": "number"
20957
21062
  },
20958
21063
  {
20959
21064
  "kind": "Content",
@@ -20961,23 +21066,257 @@
20961
21066
  }
20962
21067
  ],
20963
21068
  "isReadonly": false,
20964
- "isOptional": true,
21069
+ "isOptional": false,
20965
21070
  "releaseTag": "Beta",
20966
- "name": "excludeFromClassifier",
21071
+ "name": "widthPercent",
20967
21072
  "propertyTypeTokenRange": {
20968
21073
  "startIndex": 1,
20969
21074
  "endIndex": 2
20970
21075
  }
20971
- },
21076
+ }
21077
+ ],
21078
+ "extendsTokenRanges": []
21079
+ },
21080
+ {
21081
+ "kind": "Interface",
21082
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage:interface",
21083
+ "docComment": "/**\n * The settings-modal context-window indicator, pre-formatted — the context sibling of {@link SettingsBudgetRow}, and pre-formatted for the same reason: the template stays a pure binding layer, and a test can pin the exact text.\n *\n * `undefined` when there is nothing measurable to show, which is what keeps the template free of non-null assertions. It used to read `x.contextTokens!.toLocaleString()`, and the assertion was not merely untidy: those bindings sit inside a `when(...)` block and re-evaluate in the SAME notify batch as the guard that unmounts them, so a session Clear with the modal open on the Usage tab threw two `TypeError`s per render. A shape that can be absent cannot have that bug.\n *\n * @beta\n */\n",
21084
+ "excerptTokens": [
20972
21085
  {
20973
- "kind": "PropertySignature",
20974
- "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig#fallback:member",
20975
- "docComment": "",
20976
- "excerptTokens": [
20977
- {
20978
- "kind": "Content",
20979
- "text": "fallback?: "
20980
- },
21086
+ "kind": "Content",
21087
+ "text": "export interface SettingsContextUsage "
21088
+ }
21089
+ ],
21090
+ "fileUrlPath": "src/main/main.types.ts",
21091
+ "releaseTag": "Beta",
21092
+ "name": "SettingsContextUsage",
21093
+ "preserveMemberOrder": false,
21094
+ "members": [
21095
+ {
21096
+ "kind": "PropertySignature",
21097
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#barValue:member",
21098
+ "docComment": "/**\n * The bar's value, clamped to `0..100` — only the bar clamps.\n */\n",
21099
+ "excerptTokens": [
21100
+ {
21101
+ "kind": "Content",
21102
+ "text": "barValue: "
21103
+ },
21104
+ {
21105
+ "kind": "Content",
21106
+ "text": "number"
21107
+ },
21108
+ {
21109
+ "kind": "Content",
21110
+ "text": ";"
21111
+ }
21112
+ ],
21113
+ "isReadonly": false,
21114
+ "isOptional": false,
21115
+ "releaseTag": "Beta",
21116
+ "name": "barValue",
21117
+ "propertyTypeTokenRange": {
21118
+ "startIndex": 1,
21119
+ "endIndex": 2
21120
+ }
21121
+ },
21122
+ {
21123
+ "kind": "PropertySignature",
21124
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#limit:member",
21125
+ "docComment": "/**\n * The model's context window, e.g. `200,000`.\n */\n",
21126
+ "excerptTokens": [
21127
+ {
21128
+ "kind": "Content",
21129
+ "text": "limit: "
21130
+ },
21131
+ {
21132
+ "kind": "Content",
21133
+ "text": "string"
21134
+ },
21135
+ {
21136
+ "kind": "Content",
21137
+ "text": ";"
21138
+ }
21139
+ ],
21140
+ "isReadonly": false,
21141
+ "isOptional": false,
21142
+ "releaseTag": "Beta",
21143
+ "name": "limit",
21144
+ "propertyTypeTokenRange": {
21145
+ "startIndex": 1,
21146
+ "endIndex": 2
21147
+ }
21148
+ },
21149
+ {
21150
+ "kind": "PropertySignature",
21151
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#percent:member",
21152
+ "docComment": "/**\n * Whole-number percent consumed. Unclamped, like the budget row's text.\n */\n",
21153
+ "excerptTokens": [
21154
+ {
21155
+ "kind": "Content",
21156
+ "text": "percent: "
21157
+ },
21158
+ {
21159
+ "kind": "Content",
21160
+ "text": "number"
21161
+ },
21162
+ {
21163
+ "kind": "Content",
21164
+ "text": ";"
21165
+ }
21166
+ ],
21167
+ "isReadonly": false,
21168
+ "isOptional": false,
21169
+ "releaseTag": "Beta",
21170
+ "name": "percent",
21171
+ "propertyTypeTokenRange": {
21172
+ "startIndex": 1,
21173
+ "endIndex": 2
21174
+ }
21175
+ },
21176
+ {
21177
+ "kind": "PropertySignature",
21178
+ "canonicalReference": "@genesislcap/ai-assistant!SettingsContextUsage#used:member",
21179
+ "docComment": "/**\n * Prompt tokens on the last call, e.g. `12,480`.\n */\n",
21180
+ "excerptTokens": [
21181
+ {
21182
+ "kind": "Content",
21183
+ "text": "used: "
21184
+ },
21185
+ {
21186
+ "kind": "Content",
21187
+ "text": "string"
21188
+ },
21189
+ {
21190
+ "kind": "Content",
21191
+ "text": ";"
21192
+ }
21193
+ ],
21194
+ "isReadonly": false,
21195
+ "isOptional": false,
21196
+ "releaseTag": "Beta",
21197
+ "name": "used",
21198
+ "propertyTypeTokenRange": {
21199
+ "startIndex": 1,
21200
+ "endIndex": 2
21201
+ }
21202
+ }
21203
+ ],
21204
+ "extendsTokenRanges": []
21205
+ },
21206
+ {
21207
+ "kind": "Variable",
21208
+ "canonicalReference": "@genesislcap/ai-assistant!sparkleIconSvg:var",
21209
+ "docComment": "/**\n * Three-star AI \"sparkle\" mark — the conventional AI signifier; default assistant avatar.\n */\n",
21210
+ "excerptTokens": [
21211
+ {
21212
+ "kind": "Content",
21213
+ "text": "sparkleIconSvg = "
21214
+ },
21215
+ {
21216
+ "kind": "Content",
21217
+ "text": "\"<svg viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\"><path d=\\\"M9.5 5 C9.5 11.4 11.1 13 17.5 13 C11.1 13 9.5 14.6 9.5 21 C9.5 14.6 7.9 13 1.5 13 C7.9 13 9.5 11.4 9.5 5 Z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M17 2.5 C17 5.7 17.8 6.5 21 6.5 C17.8 6.5 17 7.3 17 10.5 C17 7.3 16.2 6.5 13 6.5 C16.2 6.5 17 5.7 17 2.5 Z\\\" fill=\\\"currentColor\\\"/><path d=\\\"M17.5 15 C17.5 17 18 17.5 20 17.5 C18 17.5 17.5 18 17.5 20 C17.5 18 17 17.5 15 17.5 C17 17.5 17.5 17 17.5 15 Z\\\" fill=\\\"currentColor\\\"/></svg>\""
21218
+ }
21219
+ ],
21220
+ "fileUrlPath": "src/main/main.ts",
21221
+ "initializerTokenRange": {
21222
+ "startIndex": 1,
21223
+ "endIndex": 2
21224
+ },
21225
+ "isReadonly": true,
21226
+ "releaseTag": "Public",
21227
+ "name": "sparkleIconSvg",
21228
+ "variableTypeTokenRange": {
21229
+ "startIndex": 0,
21230
+ "endIndex": 0
21231
+ }
21232
+ },
21233
+ {
21234
+ "kind": "Interface",
21235
+ "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig:interface",
21236
+ "docComment": "/**\n * Configuration for a specialist agent.\n *\n * Specialist agents are offered to the classifier for intent routing. The `description` is used to auto-generate the classifier prompt — no manual routing prompt authoring required.\n *\n * @beta\n */\n",
21237
+ "excerptTokens": [
21238
+ {
21239
+ "kind": "Content",
21240
+ "text": "export interface SpecialistAgentConfig extends "
21241
+ },
21242
+ {
21243
+ "kind": "Reference",
21244
+ "text": "BaseAgentConfig",
21245
+ "canonicalReference": "@genesislcap/ai-assistant!~BaseAgentConfig:interface"
21246
+ },
21247
+ {
21248
+ "kind": "Content",
21249
+ "text": " "
21250
+ }
21251
+ ],
21252
+ "fileUrlPath": "src/config/config.ts",
21253
+ "releaseTag": "Beta",
21254
+ "name": "SpecialistAgentConfig",
21255
+ "preserveMemberOrder": false,
21256
+ "members": [
21257
+ {
21258
+ "kind": "PropertySignature",
21259
+ "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig#description:member",
21260
+ "docComment": "/**\n * Plain-language description of what this agent handles. Used by the classifier to auto-generate its routing prompt.\n */\n",
21261
+ "excerptTokens": [
21262
+ {
21263
+ "kind": "Content",
21264
+ "text": "description: "
21265
+ },
21266
+ {
21267
+ "kind": "Content",
21268
+ "text": "string"
21269
+ },
21270
+ {
21271
+ "kind": "Content",
21272
+ "text": ";"
21273
+ }
21274
+ ],
21275
+ "isReadonly": false,
21276
+ "isOptional": false,
21277
+ "releaseTag": "Beta",
21278
+ "name": "description",
21279
+ "propertyTypeTokenRange": {
21280
+ "startIndex": 1,
21281
+ "endIndex": 2
21282
+ }
21283
+ },
21284
+ {
21285
+ "kind": "PropertySignature",
21286
+ "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig#excludeFromClassifier:member",
21287
+ "docComment": "/**\n * When `true`, the classifier never auto-routes to this agent. The user can still select it manually via the picker, provided both prerequisites are met: this agent has `manualSelection.enabled` set to `true`, *and* the assistant has the picker enabled via `chatConfig.picker.mode`.\n *\n * Use this for agents that overlap heavily with a sibling (e.g. a guided wizard sitting next to a free-form agent in the same domain) and should only be reached intentionally rather than via classifier routing.\n *\n * @beta\n */\n",
21288
+ "excerptTokens": [
21289
+ {
21290
+ "kind": "Content",
21291
+ "text": "excludeFromClassifier?: "
21292
+ },
21293
+ {
21294
+ "kind": "Content",
21295
+ "text": "boolean"
21296
+ },
21297
+ {
21298
+ "kind": "Content",
21299
+ "text": ";"
21300
+ }
21301
+ ],
21302
+ "isReadonly": false,
21303
+ "isOptional": true,
21304
+ "releaseTag": "Beta",
21305
+ "name": "excludeFromClassifier",
21306
+ "propertyTypeTokenRange": {
21307
+ "startIndex": 1,
21308
+ "endIndex": 2
21309
+ }
21310
+ },
21311
+ {
21312
+ "kind": "PropertySignature",
21313
+ "canonicalReference": "@genesislcap/ai-assistant!SpecialistAgentConfig#fallback:member",
21314
+ "docComment": "",
21315
+ "excerptTokens": [
21316
+ {
21317
+ "kind": "Content",
21318
+ "text": "fallback?: "
21319
+ },
20981
21320
  {
20982
21321
  "kind": "Content",
20983
21322
  "text": "never"
@@ -22636,36 +22975,554 @@
22636
22975
  }
22637
22976
  },
22638
22977
  {
22639
- "kind": "TypeAlias",
22640
- "canonicalReference": "@genesislcap/ai-assistant!TimelineMessage:type",
22641
- "docComment": "/**\n * A chat message lifted into the debug-log timeline as a `kind: 'message'` entry.\n *\n * @beta\n */\n",
22978
+ "kind": "Class",
22979
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher:class",
22980
+ "docComment": "/**\n * Which cloud vendor backs the tier-shaped provider registry, plus the means to move it at runtime (GENC-1610).\n *\n * @remarks\n *\n * Upstreamed from Genesis Create, which has run this shape in production: a registry keyed by tier (`low` / `high` / `reasoning`), a vendor switch that rebuilds it in place, and the other vendor kept alive as a standby entry. Agents keep resolving tier names, so a switch never touches agent config.\n *\n * Register it on the {@link (AIProviderSwitcher:interface)} DI token — via {@link registerTieredAIProviders} — and the settings modal's vendor UI (or an app's own control) drives it.\n *\n * @beta\n */\n",
22642
22981
  "excerptTokens": [
22643
22982
  {
22644
22983
  "kind": "Content",
22645
- "text": "export type TimelineMessage = "
22984
+ "text": "export declare class TieredAIProviderSwitcher implements "
22646
22985
  },
22647
22986
  {
22648
22987
  "kind": "Reference",
22649
- "text": "ChatMessage",
22650
- "canonicalReference": "@genesislcap/foundation-ai!ChatMessage:interface"
22651
- },
22652
- {
22653
- "kind": "Content",
22654
- "text": " & {\n kind: 'message';\n subAgentName?: string;\n subAgentDepth?: number;\n subAgentOf?: string;\n}"
22988
+ "text": "AIProviderSwitcher",
22989
+ "canonicalReference": "@genesislcap/ai-assistant!AIProviderSwitcher:interface"
22655
22990
  },
22656
22991
  {
22657
22992
  "kind": "Content",
22658
- "text": ";"
22993
+ "text": " "
22659
22994
  }
22660
22995
  ],
22661
- "fileUrlPath": "src/utils/flatten-sub-agent-messages.ts",
22996
+ "fileUrlPath": "src/provider/tiered-provider-switcher.ts",
22662
22997
  "releaseTag": "Beta",
22663
- "name": "TimelineMessage",
22664
- "typeTokenRange": {
22665
- "startIndex": 1,
22666
- "endIndex": 3
22667
- }
22668
- },
22998
+ "isAbstract": false,
22999
+ "name": "TieredAIProviderSwitcher",
23000
+ "preserveMemberOrder": false,
23001
+ "members": [
23002
+ {
23003
+ "kind": "Constructor",
23004
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher:constructor(1)",
23005
+ "docComment": "/**\n * Constructs a new instance of the `TieredAIProviderSwitcher` class\n */\n",
23006
+ "excerptTokens": [
23007
+ {
23008
+ "kind": "Content",
23009
+ "text": "constructor(options: "
23010
+ },
23011
+ {
23012
+ "kind": "Reference",
23013
+ "text": "TieredAIProviderSwitcherOptions",
23014
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions:interface"
23015
+ },
23016
+ {
23017
+ "kind": "Content",
23018
+ "text": ");"
23019
+ }
23020
+ ],
23021
+ "releaseTag": "Beta",
23022
+ "isProtected": false,
23023
+ "overloadIndex": 1,
23024
+ "parameters": [
23025
+ {
23026
+ "parameterName": "options",
23027
+ "parameterTypeTokenRange": {
23028
+ "startIndex": 1,
23029
+ "endIndex": 2
23030
+ },
23031
+ "isOptional": false
23032
+ }
23033
+ ]
23034
+ },
23035
+ {
23036
+ "kind": "Method",
23037
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher#adoptPersistedVendor:member(1)",
23038
+ "docComment": "/**\n * Adopt a vendor the app read back from its own store — the same registry move as {@link TieredAIProviderSwitcher.switchTo}, without the `onSwitch` callback, because this value came FROM the store and writing it back would be a pointless round-trip on load.\n *\n * Exists because registration has to stay synchronous: an element that connects before the token is registered caches the platform's no-op fallback, so an app cannot await its stored preference before constructing this. It boots on `initialVendor` and adopts the stored one a moment later, through a registry that is mutable and held by reference.\n */\n",
23039
+ "excerptTokens": [
23040
+ {
23041
+ "kind": "Content",
23042
+ "text": "adoptPersistedVendor(vendor: "
23043
+ },
23044
+ {
23045
+ "kind": "Content",
23046
+ "text": "string"
23047
+ },
23048
+ {
23049
+ "kind": "Content",
23050
+ "text": "): "
23051
+ },
23052
+ {
23053
+ "kind": "Content",
23054
+ "text": "void"
23055
+ },
23056
+ {
23057
+ "kind": "Content",
23058
+ "text": ";"
23059
+ }
23060
+ ],
23061
+ "isStatic": false,
23062
+ "returnTypeTokenRange": {
23063
+ "startIndex": 3,
23064
+ "endIndex": 4
23065
+ },
23066
+ "releaseTag": "Beta",
23067
+ "isProtected": false,
23068
+ "overloadIndex": 1,
23069
+ "parameters": [
23070
+ {
23071
+ "parameterName": "vendor",
23072
+ "parameterTypeTokenRange": {
23073
+ "startIndex": 1,
23074
+ "endIndex": 2
23075
+ },
23076
+ "isOptional": false
23077
+ }
23078
+ ],
23079
+ "isOptional": false,
23080
+ "isAbstract": false,
23081
+ "name": "adoptPersistedVendor"
23082
+ },
23083
+ {
23084
+ "kind": "Method",
23085
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher#subscribe:member(1)",
23086
+ "docComment": "",
23087
+ "excerptTokens": [
23088
+ {
23089
+ "kind": "Content",
23090
+ "text": "subscribe(listener: "
23091
+ },
23092
+ {
23093
+ "kind": "Content",
23094
+ "text": "(vendor: string) => void"
23095
+ },
23096
+ {
23097
+ "kind": "Content",
23098
+ "text": "): "
23099
+ },
23100
+ {
23101
+ "kind": "Content",
23102
+ "text": "() => void"
23103
+ },
23104
+ {
23105
+ "kind": "Content",
23106
+ "text": ";"
23107
+ }
23108
+ ],
23109
+ "isStatic": false,
23110
+ "returnTypeTokenRange": {
23111
+ "startIndex": 3,
23112
+ "endIndex": 4
23113
+ },
23114
+ "releaseTag": "Beta",
23115
+ "isProtected": false,
23116
+ "overloadIndex": 1,
23117
+ "parameters": [
23118
+ {
23119
+ "parameterName": "listener",
23120
+ "parameterTypeTokenRange": {
23121
+ "startIndex": 1,
23122
+ "endIndex": 2
23123
+ },
23124
+ "isOptional": false
23125
+ }
23126
+ ],
23127
+ "isOptional": false,
23128
+ "isAbstract": false,
23129
+ "name": "subscribe"
23130
+ },
23131
+ {
23132
+ "kind": "Method",
23133
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher#switchTo:member(1)",
23134
+ "docComment": "/**\n * A user-driven switch: move the registry, then tell the app so it can persist the choice. An unknown vendor is ignored.\n */\n",
23135
+ "excerptTokens": [
23136
+ {
23137
+ "kind": "Content",
23138
+ "text": "switchTo(vendor: "
23139
+ },
23140
+ {
23141
+ "kind": "Content",
23142
+ "text": "string"
23143
+ },
23144
+ {
23145
+ "kind": "Content",
23146
+ "text": "): "
23147
+ },
23148
+ {
23149
+ "kind": "Content",
23150
+ "text": "void"
23151
+ },
23152
+ {
23153
+ "kind": "Content",
23154
+ "text": ";"
23155
+ }
23156
+ ],
23157
+ "isStatic": false,
23158
+ "returnTypeTokenRange": {
23159
+ "startIndex": 3,
23160
+ "endIndex": 4
23161
+ },
23162
+ "releaseTag": "Beta",
23163
+ "isProtected": false,
23164
+ "overloadIndex": 1,
23165
+ "parameters": [
23166
+ {
23167
+ "parameterName": "vendor",
23168
+ "parameterTypeTokenRange": {
23169
+ "startIndex": 1,
23170
+ "endIndex": 2
23171
+ },
23172
+ "isOptional": false
23173
+ }
23174
+ ],
23175
+ "isOptional": false,
23176
+ "isAbstract": false,
23177
+ "name": "switchTo"
23178
+ },
23179
+ {
23180
+ "kind": "Property",
23181
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher#vendor:member",
23182
+ "docComment": "",
23183
+ "excerptTokens": [
23184
+ {
23185
+ "kind": "Content",
23186
+ "text": "get vendor(): "
23187
+ },
23188
+ {
23189
+ "kind": "Reference",
23190
+ "text": "AITierVendor",
23191
+ "canonicalReference": "@genesislcap/foundation-ai!AITierVendor:type"
23192
+ },
23193
+ {
23194
+ "kind": "Content",
23195
+ "text": ";"
23196
+ }
23197
+ ],
23198
+ "isReadonly": true,
23199
+ "isOptional": false,
23200
+ "releaseTag": "Beta",
23201
+ "name": "vendor",
23202
+ "propertyTypeTokenRange": {
23203
+ "startIndex": 1,
23204
+ "endIndex": 2
23205
+ },
23206
+ "isStatic": false,
23207
+ "isProtected": false,
23208
+ "isAbstract": false
23209
+ },
23210
+ {
23211
+ "kind": "Property",
23212
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcher#vendors:member",
23213
+ "docComment": "",
23214
+ "excerptTokens": [
23215
+ {
23216
+ "kind": "Content",
23217
+ "text": "readonly vendors: "
23218
+ },
23219
+ {
23220
+ "kind": "Content",
23221
+ "text": "readonly "
23222
+ },
23223
+ {
23224
+ "kind": "Reference",
23225
+ "text": "AITierVendor",
23226
+ "canonicalReference": "@genesislcap/foundation-ai!AITierVendor:type"
23227
+ },
23228
+ {
23229
+ "kind": "Content",
23230
+ "text": "[]"
23231
+ },
23232
+ {
23233
+ "kind": "Content",
23234
+ "text": ";"
23235
+ }
23236
+ ],
23237
+ "isReadonly": true,
23238
+ "isOptional": false,
23239
+ "releaseTag": "Beta",
23240
+ "name": "vendors",
23241
+ "propertyTypeTokenRange": {
23242
+ "startIndex": 1,
23243
+ "endIndex": 4
23244
+ },
23245
+ "isStatic": false,
23246
+ "isProtected": false,
23247
+ "isAbstract": false
23248
+ }
23249
+ ],
23250
+ "implementsTokenRanges": [
23251
+ {
23252
+ "startIndex": 1,
23253
+ "endIndex": 2
23254
+ }
23255
+ ]
23256
+ },
23257
+ {
23258
+ "kind": "Interface",
23259
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions:interface",
23260
+ "docComment": "/**\n * Options for {@link TieredAIProviderSwitcher}.\n *\n * @beta\n */\n",
23261
+ "excerptTokens": [
23262
+ {
23263
+ "kind": "Content",
23264
+ "text": "export interface TieredAIProviderSwitcherOptions "
23265
+ }
23266
+ ],
23267
+ "fileUrlPath": "src/provider/tiered-provider-switcher.ts",
23268
+ "releaseTag": "Beta",
23269
+ "name": "TieredAIProviderSwitcherOptions",
23270
+ "preserveMemberOrder": false,
23271
+ "members": [
23272
+ {
23273
+ "kind": "PropertySignature",
23274
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#container:member",
23275
+ "docComment": "/**\n * DI container the provider registry is registered on.\n */\n",
23276
+ "excerptTokens": [
23277
+ {
23278
+ "kind": "Content",
23279
+ "text": "container: "
23280
+ },
23281
+ {
23282
+ "kind": "Reference",
23283
+ "text": "Container",
23284
+ "canonicalReference": "@microsoft/fast-foundation!Container:interface"
23285
+ },
23286
+ {
23287
+ "kind": "Content",
23288
+ "text": ";"
23289
+ }
23290
+ ],
23291
+ "isReadonly": false,
23292
+ "isOptional": false,
23293
+ "releaseTag": "Beta",
23294
+ "name": "container",
23295
+ "propertyTypeTokenRange": {
23296
+ "startIndex": 1,
23297
+ "endIndex": 2
23298
+ }
23299
+ },
23300
+ {
23301
+ "kind": "PropertySignature",
23302
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#defaultTier:member",
23303
+ "docComment": "/**\n * Which tier the registry resolves for a caller that names no provider. Defaults to `'high'`.\n *\n * High rather than the cheapest, because of what resolves through it: an orchestrated turn classifies against the REGISTRY DEFAULT, so the classifier sees the session's accumulated history on whatever model this names. On the smallest-window tier, a session grown to size on a bigger model can hand the classifier a history that no longer fits — and the routing turn fails at the moment it was supposed to hand off to a model that could have taken it.\n */\n",
23304
+ "excerptTokens": [
23305
+ {
23306
+ "kind": "Content",
23307
+ "text": "defaultTier?: "
23308
+ },
23309
+ {
23310
+ "kind": "Reference",
23311
+ "text": "AITierId",
23312
+ "canonicalReference": "@genesislcap/foundation-ai!AITierId:type"
23313
+ },
23314
+ {
23315
+ "kind": "Content",
23316
+ "text": ";"
23317
+ }
23318
+ ],
23319
+ "isReadonly": false,
23320
+ "isOptional": true,
23321
+ "releaseTag": "Beta",
23322
+ "name": "defaultTier",
23323
+ "propertyTypeTokenRange": {
23324
+ "startIndex": 1,
23325
+ "endIndex": 2
23326
+ }
23327
+ },
23328
+ {
23329
+ "kind": "PropertySignature",
23330
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#initialVendor:member",
23331
+ "docComment": "/**\n * The vendor to boot on. Required, and deliberately so: the platform has no opinion about which cloud vendor an app should use, and a silent default would make one app's choice look like a platform decision.\n */\n",
23332
+ "excerptTokens": [
23333
+ {
23334
+ "kind": "Content",
23335
+ "text": "initialVendor: "
23336
+ },
23337
+ {
23338
+ "kind": "Reference",
23339
+ "text": "AITierVendor",
23340
+ "canonicalReference": "@genesislcap/foundation-ai!AITierVendor:type"
23341
+ },
23342
+ {
23343
+ "kind": "Content",
23344
+ "text": ";"
23345
+ }
23346
+ ],
23347
+ "isReadonly": false,
23348
+ "isOptional": false,
23349
+ "releaseTag": "Beta",
23350
+ "name": "initialVendor",
23351
+ "propertyTypeTokenRange": {
23352
+ "startIndex": 1,
23353
+ "endIndex": 2
23354
+ }
23355
+ },
23356
+ {
23357
+ "kind": "PropertySignature",
23358
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#onSwitch:member",
23359
+ "docComment": "/**\n * Called when {@link TieredAIProviderSwitcher.switchTo} accepts a vendor — the hook for an app that persists the user's choice.\n *\n * Fires even when the chosen vendor is the one already active. That is not a redundant call: during boot the registry shows this app's initial vendor while a stored preference may still be loading, so \"confirm what I can see\" and \"leave it alone\" are different acts.\n */\n",
23360
+ "excerptTokens": [
23361
+ {
23362
+ "kind": "Content",
23363
+ "text": "onSwitch?: "
23364
+ },
23365
+ {
23366
+ "kind": "Content",
23367
+ "text": "(vendor: "
23368
+ },
23369
+ {
23370
+ "kind": "Reference",
23371
+ "text": "AITierVendor",
23372
+ "canonicalReference": "@genesislcap/foundation-ai!AITierVendor:type"
23373
+ },
23374
+ {
23375
+ "kind": "Content",
23376
+ "text": ") => void"
23377
+ },
23378
+ {
23379
+ "kind": "Content",
23380
+ "text": ";"
23381
+ }
23382
+ ],
23383
+ "isReadonly": false,
23384
+ "isOptional": true,
23385
+ "releaseTag": "Beta",
23386
+ "name": "onSwitch",
23387
+ "propertyTypeTokenRange": {
23388
+ "startIndex": 1,
23389
+ "endIndex": 4
23390
+ }
23391
+ },
23392
+ {
23393
+ "kind": "PropertySignature",
23394
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#serverEndpoint:member",
23395
+ "docComment": "/**\n * Where each vendor's tiers post — passed straight to `buildTierProviders`. A function when more than one vendor is in play, since the switcher builds the other vendor too.\n */\n",
23396
+ "excerptTokens": [
23397
+ {
23398
+ "kind": "Content",
23399
+ "text": "serverEndpoint: "
23400
+ },
23401
+ {
23402
+ "kind": "Content",
23403
+ "text": "string | ((vendor: "
23404
+ },
23405
+ {
23406
+ "kind": "Reference",
23407
+ "text": "AITierVendor",
23408
+ "canonicalReference": "@genesislcap/foundation-ai!AITierVendor:type"
23409
+ },
23410
+ {
23411
+ "kind": "Content",
23412
+ "text": ") => string)"
23413
+ },
23414
+ {
23415
+ "kind": "Content",
23416
+ "text": ";"
23417
+ }
23418
+ ],
23419
+ "isReadonly": false,
23420
+ "isOptional": false,
23421
+ "releaseTag": "Beta",
23422
+ "name": "serverEndpoint",
23423
+ "propertyTypeTokenRange": {
23424
+ "startIndex": 1,
23425
+ "endIndex": 4
23426
+ }
23427
+ },
23428
+ {
23429
+ "kind": "PropertySignature",
23430
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#tiers:member",
23431
+ "docComment": "/**\n * The tier table to build from. Defaults to the platform's.\n */\n",
23432
+ "excerptTokens": [
23433
+ {
23434
+ "kind": "Content",
23435
+ "text": "tiers?: "
23436
+ },
23437
+ {
23438
+ "kind": "Reference",
23439
+ "text": "AITiers",
23440
+ "canonicalReference": "@genesislcap/foundation-ai!AITiers:interface"
23441
+ },
23442
+ {
23443
+ "kind": "Content",
23444
+ "text": ";"
23445
+ }
23446
+ ],
23447
+ "isReadonly": false,
23448
+ "isOptional": true,
23449
+ "releaseTag": "Beta",
23450
+ "name": "tiers",
23451
+ "propertyTypeTokenRange": {
23452
+ "startIndex": 1,
23453
+ "endIndex": 2
23454
+ }
23455
+ },
23456
+ {
23457
+ "kind": "PropertySignature",
23458
+ "canonicalReference": "@genesislcap/ai-assistant!TieredAIProviderSwitcherOptions#vendors:member",
23459
+ "docComment": "/**\n * The vendors this app can switch between. Defaults to every vendor in the table.\n *\n * Narrow it when the app's proxy can only reach one: the others would otherwise report a status, and the assistant's partial-wall UX reads statuses — so a walled vendor would offer \"switch to the other one\" about a vendor that has no key behind it.\n */\n",
23460
+ "excerptTokens": [
23461
+ {
23462
+ "kind": "Content",
23463
+ "text": "vendors?: "
23464
+ },
23465
+ {
23466
+ "kind": "Content",
23467
+ "text": "readonly "
23468
+ },
23469
+ {
23470
+ "kind": "Reference",
23471
+ "text": "AITierVendor",
23472
+ "canonicalReference": "@genesislcap/foundation-ai!AITierVendor:type"
23473
+ },
23474
+ {
23475
+ "kind": "Content",
23476
+ "text": "[]"
23477
+ },
23478
+ {
23479
+ "kind": "Content",
23480
+ "text": ";"
23481
+ }
23482
+ ],
23483
+ "isReadonly": false,
23484
+ "isOptional": true,
23485
+ "releaseTag": "Beta",
23486
+ "name": "vendors",
23487
+ "propertyTypeTokenRange": {
23488
+ "startIndex": 1,
23489
+ "endIndex": 4
23490
+ }
23491
+ }
23492
+ ],
23493
+ "extendsTokenRanges": []
23494
+ },
23495
+ {
23496
+ "kind": "TypeAlias",
23497
+ "canonicalReference": "@genesislcap/ai-assistant!TimelineMessage:type",
23498
+ "docComment": "/**\n * A chat message lifted into the debug-log timeline as a `kind: 'message'` entry.\n *\n * @beta\n */\n",
23499
+ "excerptTokens": [
23500
+ {
23501
+ "kind": "Content",
23502
+ "text": "export type TimelineMessage = "
23503
+ },
23504
+ {
23505
+ "kind": "Reference",
23506
+ "text": "ChatMessage",
23507
+ "canonicalReference": "@genesislcap/foundation-ai!ChatMessage:interface"
23508
+ },
23509
+ {
23510
+ "kind": "Content",
23511
+ "text": " & {\n kind: 'message';\n subAgentName?: string;\n subAgentDepth?: number;\n subAgentOf?: string;\n}"
23512
+ },
23513
+ {
23514
+ "kind": "Content",
23515
+ "text": ";"
23516
+ }
23517
+ ],
23518
+ "fileUrlPath": "src/utils/flatten-sub-agent-messages.ts",
23519
+ "releaseTag": "Beta",
23520
+ "name": "TimelineMessage",
23521
+ "typeTokenRange": {
23522
+ "startIndex": 1,
23523
+ "endIndex": 3
23524
+ }
23525
+ },
22669
23526
  {
22670
23527
  "kind": "TypeAlias",
22671
23528
  "canonicalReference": "@genesislcap/ai-assistant!ToolChoiceInput:type",
@@ -23628,6 +24485,209 @@
23628
24485
  "endIndex": 0
23629
24486
  }
23630
24487
  },
24488
+ {
24489
+ "kind": "Interface",
24490
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetFigures:interface",
24491
+ "docComment": "/**\n * One vendor's AI-spend figures, as fed by the host from the budget endpoint (GENC-1464 — the settings-modal budget meter).\n *\n * Dollars, not a percentage: the meter's text shows the real figures (spend CAN exceed the cap — the last allowed call may overshoot it), and only the bar clamps. Storing a pre-computed percentage would destroy the overshoot.\n *\n * @beta\n */\n",
24492
+ "excerptTokens": [
24493
+ {
24494
+ "kind": "Content",
24495
+ "text": "export interface VendorBudgetFigures "
24496
+ }
24497
+ ],
24498
+ "fileUrlPath": "src/state/ai-assistant-slice.ts",
24499
+ "releaseTag": "Beta",
24500
+ "name": "VendorBudgetFigures",
24501
+ "preserveMemberOrder": false,
24502
+ "members": [
24503
+ {
24504
+ "kind": "PropertySignature",
24505
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetFigures#budgetUsd:member",
24506
+ "docComment": "/**\n * The vendor's budget cap in USD. Finite and `>= 0`.\n */\n",
24507
+ "excerptTokens": [
24508
+ {
24509
+ "kind": "Content",
24510
+ "text": "budgetUsd: "
24511
+ },
24512
+ {
24513
+ "kind": "Content",
24514
+ "text": "number"
24515
+ },
24516
+ {
24517
+ "kind": "Content",
24518
+ "text": ";"
24519
+ }
24520
+ ],
24521
+ "isReadonly": false,
24522
+ "isOptional": false,
24523
+ "releaseTag": "Beta",
24524
+ "name": "budgetUsd",
24525
+ "propertyTypeTokenRange": {
24526
+ "startIndex": 1,
24527
+ "endIndex": 2
24528
+ }
24529
+ },
24530
+ {
24531
+ "kind": "PropertySignature",
24532
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetFigures#segments:member",
24533
+ "docComment": "/**\n * Optional breakdown of {@link VendorBudgetFigures.spentUsd} by whatever the host meters spend by — a surface, a team, an environment. Given, the vendor's bar is drawn stacked with a legend; omitted, it is the single bar it has always been.\n *\n * Host-named, with no platform vocabulary: the assistant has no idea what a host's spend sources are, and inventing labels for them is how a product word ends up in the platform. Segments may cover less than the total (the remainder simply draws unlabelled); they may not cover more, which would be a breakdown of a figure other than the one on screen.\n */\n",
24534
+ "excerptTokens": [
24535
+ {
24536
+ "kind": "Content",
24537
+ "text": "segments?: "
24538
+ },
24539
+ {
24540
+ "kind": "Reference",
24541
+ "text": "VendorBudgetSegment",
24542
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetSegment:interface"
24543
+ },
24544
+ {
24545
+ "kind": "Content",
24546
+ "text": "[]"
24547
+ },
24548
+ {
24549
+ "kind": "Content",
24550
+ "text": ";"
24551
+ }
24552
+ ],
24553
+ "isReadonly": false,
24554
+ "isOptional": true,
24555
+ "releaseTag": "Beta",
24556
+ "name": "segments",
24557
+ "propertyTypeTokenRange": {
24558
+ "startIndex": 1,
24559
+ "endIndex": 3
24560
+ }
24561
+ },
24562
+ {
24563
+ "kind": "PropertySignature",
24564
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetFigures#spentUsd:member",
24565
+ "docComment": "/**\n * Metered spend against that cap in USD. Finite and `>= 0`; may exceed the cap.\n */\n",
24566
+ "excerptTokens": [
24567
+ {
24568
+ "kind": "Content",
24569
+ "text": "spentUsd: "
24570
+ },
24571
+ {
24572
+ "kind": "Content",
24573
+ "text": "number"
24574
+ },
24575
+ {
24576
+ "kind": "Content",
24577
+ "text": ";"
24578
+ }
24579
+ ],
24580
+ "isReadonly": false,
24581
+ "isOptional": false,
24582
+ "releaseTag": "Beta",
24583
+ "name": "spentUsd",
24584
+ "propertyTypeTokenRange": {
24585
+ "startIndex": 1,
24586
+ "endIndex": 2
24587
+ }
24588
+ }
24589
+ ],
24590
+ "extendsTokenRanges": []
24591
+ },
24592
+ {
24593
+ "kind": "Interface",
24594
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetSegment:interface",
24595
+ "docComment": "/**\n * One slice of a vendor's spend — see {@link VendorBudgetFigures.segments}.\n *\n * @beta\n */\n",
24596
+ "excerptTokens": [
24597
+ {
24598
+ "kind": "Content",
24599
+ "text": "export interface VendorBudgetSegment "
24600
+ }
24601
+ ],
24602
+ "fileUrlPath": "src/state/ai-assistant-slice.ts",
24603
+ "releaseTag": "Beta",
24604
+ "name": "VendorBudgetSegment",
24605
+ "preserveMemberOrder": false,
24606
+ "members": [
24607
+ {
24608
+ "kind": "PropertySignature",
24609
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetSegment#id:member",
24610
+ "docComment": "/**\n * Stable id, used to key the bar and legend across re-feeds.\n */\n",
24611
+ "excerptTokens": [
24612
+ {
24613
+ "kind": "Content",
24614
+ "text": "id: "
24615
+ },
24616
+ {
24617
+ "kind": "Content",
24618
+ "text": "string"
24619
+ },
24620
+ {
24621
+ "kind": "Content",
24622
+ "text": ";"
24623
+ }
24624
+ ],
24625
+ "isReadonly": false,
24626
+ "isOptional": false,
24627
+ "releaseTag": "Beta",
24628
+ "name": "id",
24629
+ "propertyTypeTokenRange": {
24630
+ "startIndex": 1,
24631
+ "endIndex": 2
24632
+ }
24633
+ },
24634
+ {
24635
+ "kind": "PropertySignature",
24636
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetSegment#label:member",
24637
+ "docComment": "/**\n * What the host calls this slice of the spend; rendered verbatim in the legend.\n */\n",
24638
+ "excerptTokens": [
24639
+ {
24640
+ "kind": "Content",
24641
+ "text": "label: "
24642
+ },
24643
+ {
24644
+ "kind": "Content",
24645
+ "text": "string"
24646
+ },
24647
+ {
24648
+ "kind": "Content",
24649
+ "text": ";"
24650
+ }
24651
+ ],
24652
+ "isReadonly": false,
24653
+ "isOptional": false,
24654
+ "releaseTag": "Beta",
24655
+ "name": "label",
24656
+ "propertyTypeTokenRange": {
24657
+ "startIndex": 1,
24658
+ "endIndex": 2
24659
+ }
24660
+ },
24661
+ {
24662
+ "kind": "PropertySignature",
24663
+ "canonicalReference": "@genesislcap/ai-assistant!VendorBudgetSegment#spentUsd:member",
24664
+ "docComment": "/**\n * This slice's share of the spend in USD. Finite and `>= 0`.\n */\n",
24665
+ "excerptTokens": [
24666
+ {
24667
+ "kind": "Content",
24668
+ "text": "spentUsd: "
24669
+ },
24670
+ {
24671
+ "kind": "Content",
24672
+ "text": "number"
24673
+ },
24674
+ {
24675
+ "kind": "Content",
24676
+ "text": ";"
24677
+ }
24678
+ ],
24679
+ "isReadonly": false,
24680
+ "isOptional": false,
24681
+ "releaseTag": "Beta",
24682
+ "name": "spentUsd",
24683
+ "propertyTypeTokenRange": {
24684
+ "startIndex": 1,
24685
+ "endIndex": 2
24686
+ }
24687
+ }
24688
+ ],
24689
+ "extendsTokenRanges": []
24690
+ },
23631
24691
  {
23632
24692
  "kind": "Class",
23633
24693
  "canonicalReference": "@genesislcap/ai-assistant!WebStorageSessionProvider:class",