@genesislcap/ai-assistant 15.19.0 → 15.19.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 (288) hide show
  1. package/package.json +17 -18
  2. package/api-extractor.json +0 -11
  3. package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts +0 -2
  4. package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts.map +0 -1
  5. package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts +0 -2
  6. package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts.map +0 -1
  7. package/dist/dts/components/chat-driver/chat-driver.test.d.ts +0 -2
  8. package/dist/dts/components/chat-driver/chat-driver.test.d.ts.map +0 -1
  9. package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts +0 -2
  10. package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts.map +0 -1
  11. package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts +0 -2
  12. package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts.map +0 -1
  13. package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts +0 -2
  14. package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts.map +0 -1
  15. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts +0 -2
  16. package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts.map +0 -1
  17. package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts +0 -2
  18. package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts.map +0 -1
  19. package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts +0 -2
  20. package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts.map +0 -1
  21. package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts +0 -2
  22. package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts.map +0 -1
  23. package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts +0 -2
  24. package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts.map +0 -1
  25. package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts +0 -2
  26. package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts.map +0 -1
  27. package/dist/dts/config/define-stateful-agent.test.d.ts +0 -2
  28. package/dist/dts/config/define-stateful-agent.test.d.ts.map +0 -1
  29. package/dist/dts/config/validate-providers.test.d.ts +0 -2
  30. package/dist/dts/config/validate-providers.test.d.ts.map +0 -1
  31. package/dist/dts/main/blocked-state.test.d.ts +0 -2
  32. package/dist/dts/main/blocked-state.test.d.ts.map +0 -1
  33. package/dist/dts/main/budget-meter.test.d.ts +0 -2
  34. package/dist/dts/main/budget-meter.test.d.ts.map +0 -1
  35. package/dist/dts/main/cost-session-banking.test.d.ts +0 -2
  36. package/dist/dts/main/cost-session-banking.test.d.ts.map +0 -1
  37. package/dist/dts/main/file-attachments.test.d.ts +0 -2
  38. package/dist/dts/main/file-attachments.test.d.ts.map +0 -1
  39. package/dist/dts/main/interaction-cost.test.d.ts +0 -2
  40. package/dist/dts/main/interaction-cost.test.d.ts.map +0 -1
  41. package/dist/dts/main/main.styles.test.d.ts +0 -2
  42. package/dist/dts/main/main.styles.test.d.ts.map +0 -1
  43. package/dist/dts/main/persistence-broken-sources.test.d.ts +0 -2
  44. package/dist/dts/main/persistence-broken-sources.test.d.ts.map +0 -1
  45. package/dist/dts/main/popout-interaction-gate.test.d.ts +0 -2
  46. package/dist/dts/main/popout-interaction-gate.test.d.ts.map +0 -1
  47. package/dist/dts/state/ai-assistant-slice.test.d.ts +0 -2
  48. package/dist/dts/state/ai-assistant-slice.test.d.ts.map +0 -1
  49. package/dist/dts/state/debug-event-log.test.d.ts +0 -2
  50. package/dist/dts/state/debug-event-log.test.d.ts.map +0 -1
  51. package/dist/dts/state/driver-registry.test.d.ts +0 -2
  52. package/dist/dts/state/driver-registry.test.d.ts.map +0 -1
  53. package/dist/dts/state/interaction-context.test.d.ts +0 -2
  54. package/dist/dts/state/interaction-context.test.d.ts.map +0 -1
  55. package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts +0 -2
  56. package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts.map +0 -1
  57. package/dist/dts/state/persistence/diagnostics.test.d.ts +0 -2
  58. package/dist/dts/state/persistence/diagnostics.test.d.ts.map +0 -1
  59. package/dist/dts/state/persistence/session-persistence-provider.test.d.ts +0 -2
  60. package/dist/dts/state/persistence/session-persistence-provider.test.d.ts.map +0 -1
  61. package/dist/dts/state/persistence/session-persistence.integration.test.d.ts +0 -2
  62. package/dist/dts/state/persistence/session-persistence.integration.test.d.ts.map +0 -1
  63. package/dist/dts/state/persistence/session-persister.test.d.ts +0 -2
  64. package/dist/dts/state/persistence/session-persister.test.d.ts.map +0 -1
  65. package/dist/dts/state/persistence/session-snapshot.test.d.ts +0 -2
  66. package/dist/dts/state/persistence/session-snapshot.test.d.ts.map +0 -1
  67. package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts +0 -2
  68. package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts.map +0 -1
  69. package/dist/dts/utils/animation-exclusivity.test.d.ts +0 -2
  70. package/dist/dts/utils/animation-exclusivity.test.d.ts.map +0 -1
  71. package/dist/dts/utils/collect-session-models.test.d.ts +0 -2
  72. package/dist/dts/utils/collect-session-models.test.d.ts.map +0 -1
  73. package/dist/dts/utils/condense-history.test.d.ts +0 -2
  74. package/dist/dts/utils/condense-history.test.d.ts.map +0 -1
  75. package/dist/dts/utils/cost-session-history.test.d.ts +0 -2
  76. package/dist/dts/utils/cost-session-history.test.d.ts.map +0 -1
  77. package/dist/dts/utils/derive-cost-session-title.test.d.ts +0 -2
  78. package/dist/dts/utils/derive-cost-session-title.test.d.ts.map +0 -1
  79. package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts +0 -2
  80. package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts.map +0 -1
  81. package/dist/dts/utils/history-transform.test.d.ts +0 -2
  82. package/dist/dts/utils/history-transform.test.d.ts.map +0 -1
  83. package/dist/dts/utils/message-partition.test.d.ts +0 -2
  84. package/dist/dts/utils/message-partition.test.d.ts.map +0 -1
  85. package/dist/dts/utils/resolve-cost-history-config.test.d.ts +0 -2
  86. package/dist/dts/utils/resolve-cost-history-config.test.d.ts.map +0 -1
  87. package/dist/dts/utils/resolve-preference-baseline.test.d.ts +0 -2
  88. package/dist/dts/utils/resolve-preference-baseline.test.d.ts.map +0 -1
  89. package/dist/dts/utils/strip-agent-handlers.test.d.ts +0 -2
  90. package/dist/dts/utils/strip-agent-handlers.test.d.ts.map +0 -1
  91. package/dist/dts/utils/sum-costs.test.d.ts +0 -2
  92. package/dist/dts/utils/sum-costs.test.d.ts.map +0 -1
  93. package/dist/dts/utils/sum-tokens.test.d.ts +0 -2
  94. package/dist/dts/utils/sum-tokens.test.d.ts.map +0 -1
  95. package/dist/dts/utils/sum-usage.test.d.ts +0 -2
  96. package/dist/dts/utils/sum-usage.test.d.ts.map +0 -1
  97. package/dist/dts/utils/usage-rows.test.d.ts +0 -2
  98. package/dist/dts/utils/usage-rows.test.d.ts.map +0 -1
  99. package/dist/esm/components/chat-driver/chat-driver.compact.test.js +0 -93
  100. package/dist/esm/components/chat-driver/chat-driver.invocation-scope.test.js +0 -238
  101. package/dist/esm/components/chat-driver/chat-driver.test.js +0 -2770
  102. package/dist/esm/components/chat-driver/chat-driver.thinking-policy.test.js +0 -137
  103. package/dist/esm/components/chat-driver/chat-driver.trace-capture.test.js +0 -200
  104. package/dist/esm/components/chat-driver/chat-driver.turn-usage.test.js +0 -268
  105. package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.test.js +0 -104
  106. package/dist/esm/components/orchestrating-driver/orchestrating-driver.budget.test.js +0 -312
  107. package/dist/esm/components/orchestrating-driver/orchestrating-driver.cost.test.js +0 -76
  108. package/dist/esm/components/orchestrating-driver/orchestrating-driver.pin.test.js +0 -61
  109. package/dist/esm/components/settings-modal/settings-modal.styles.test.js +0 -80
  110. package/dist/esm/components/settings-modal/settings-modal.template.test.js +0 -91
  111. package/dist/esm/config/define-stateful-agent.test.js +0 -53
  112. package/dist/esm/config/validate-providers.test.js +0 -100
  113. package/dist/esm/main/blocked-state.test.js +0 -1065
  114. package/dist/esm/main/budget-meter.test.js +0 -359
  115. package/dist/esm/main/cost-session-banking.test.js +0 -538
  116. package/dist/esm/main/file-attachments.test.js +0 -164
  117. package/dist/esm/main/interaction-cost.test.js +0 -107
  118. package/dist/esm/main/main.styles.test.js +0 -161
  119. package/dist/esm/main/persistence-broken-sources.test.js +0 -180
  120. package/dist/esm/main/popout-interaction-gate.test.js +0 -54
  121. package/dist/esm/state/ai-assistant-slice.test.js +0 -229
  122. package/dist/esm/state/debug-event-log.test.js +0 -117
  123. package/dist/esm/state/driver-registry.test.js +0 -55
  124. package/dist/esm/state/interaction-context.test.js +0 -78
  125. package/dist/esm/state/persistence/diagnostics-cursors.test.js +0 -30
  126. package/dist/esm/state/persistence/diagnostics.test.js +0 -280
  127. package/dist/esm/state/persistence/session-persistence-provider.test.js +0 -110
  128. package/dist/esm/state/persistence/session-persistence.integration.test.js +0 -113
  129. package/dist/esm/state/persistence/session-persister.test.js +0 -613
  130. package/dist/esm/state/persistence/session-snapshot.test.js +0 -256
  131. package/dist/esm/state/persistence/stateful-restore.e2e.test.js +0 -158
  132. package/dist/esm/utils/animation-exclusivity.test.js +0 -52
  133. package/dist/esm/utils/collect-session-models.test.js +0 -53
  134. package/dist/esm/utils/condense-history.test.js +0 -547
  135. package/dist/esm/utils/cost-session-history.test.js +0 -174
  136. package/dist/esm/utils/derive-cost-session-title.test.js +0 -37
  137. package/dist/esm/utils/flatten-sub-agent-messages.test.js +0 -139
  138. package/dist/esm/utils/history-transform.test.js +0 -158
  139. package/dist/esm/utils/message-partition.test.js +0 -90
  140. package/dist/esm/utils/resolve-cost-history-config.test.js +0 -32
  141. package/dist/esm/utils/resolve-preference-baseline.test.js +0 -69
  142. package/dist/esm/utils/strip-agent-handlers.test.js +0 -81
  143. package/dist/esm/utils/sum-costs.test.js +0 -114
  144. package/dist/esm/utils/sum-tokens.test.js +0 -51
  145. package/dist/esm/utils/sum-usage.test.js +0 -164
  146. package/dist/esm/utils/usage-rows.test.js +0 -189
  147. package/dist/tsconfig.tsbuildinfo +0 -1
  148. package/license.txt +0 -46
  149. package/sandbox/tsconfig.json +0 -8
  150. package/src/channel/ai-activity-bus.ts +0 -209
  151. package/src/channel/ai-activity-channel.ts +0 -146
  152. package/src/chat-driver-node.ts +0 -159
  153. package/src/components/activity-halo/activity-halo.ts +0 -106
  154. package/src/components/agent-picker/agent-picker.constants.ts +0 -2
  155. package/src/components/agent-picker/agent-picker.styles.ts +0 -24
  156. package/src/components/agent-picker/agent-picker.template.ts +0 -54
  157. package/src/components/agent-picker/agent-picker.ts +0 -99
  158. package/src/components/agent-picker/index.ts +0 -1
  159. package/src/components/ai-driver/ai-driver.ts +0 -166
  160. package/src/components/ai-driver/index.ts +0 -1
  161. package/src/components/chat-bubble/chat-bubble.styles.ts +0 -194
  162. package/src/components/chat-bubble/chat-bubble.template.ts +0 -67
  163. package/src/components/chat-bubble/chat-bubble.ts +0 -436
  164. package/src/components/chat-bubble/index.ts +0 -1
  165. package/src/components/chat-driver/align-event-globals.ts +0 -23
  166. package/src/components/chat-driver/chat-driver.compact.test.ts +0 -131
  167. package/src/components/chat-driver/chat-driver.invocation-scope.test.ts +0 -285
  168. package/src/components/chat-driver/chat-driver.test.ts +0 -3679
  169. package/src/components/chat-driver/chat-driver.thinking-policy.test.ts +0 -185
  170. package/src/components/chat-driver/chat-driver.trace-capture.test.ts +0 -251
  171. package/src/components/chat-driver/chat-driver.ts +0 -3925
  172. package/src/components/chat-driver/chat-driver.turn-usage.test.ts +0 -362
  173. package/src/components/chat-driver/index.ts +0 -1
  174. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.ts +0 -7
  175. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.template.ts +0 -6
  176. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.test.ts +0 -144
  177. package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.ts +0 -243
  178. package/src/components/chat-interaction-wrapper/index.ts +0 -3
  179. package/src/components/chat-markdown/chat-markdown.ts +0 -89
  180. package/src/components/chat-markdown/index.ts +0 -1
  181. package/src/components/flowing-waves-indicator.ts +0 -286
  182. package/src/components/halo-overlay.ts +0 -184
  183. package/src/components/orchestrating-driver/index.ts +0 -1
  184. package/src/components/orchestrating-driver/orchestrating-driver.budget.test.ts +0 -438
  185. package/src/components/orchestrating-driver/orchestrating-driver.cost.test.ts +0 -107
  186. package/src/components/orchestrating-driver/orchestrating-driver.pin.test.ts +0 -96
  187. package/src/components/orchestrating-driver/orchestrating-driver.ts +0 -813
  188. package/src/components/plasma-orb-indicator.ts +0 -281
  189. package/src/components/popout-manager/index.ts +0 -1
  190. package/src/components/popout-manager/popout-manager.ts +0 -212
  191. package/src/components/settings-modal/index.ts +0 -2
  192. package/src/components/settings-modal/settings-modal.styles.test.ts +0 -94
  193. package/src/components/settings-modal/settings-modal.styles.ts +0 -853
  194. package/src/components/settings-modal/settings-modal.template.test.ts +0 -124
  195. package/src/components/settings-modal/settings-modal.template.ts +0 -943
  196. package/src/components/waves-indicator.ts +0 -241
  197. package/src/config/config.ts +0 -608
  198. package/src/config/define-stateful-agent.test.ts +0 -64
  199. package/src/config/define-stateful-agent.ts +0 -642
  200. package/src/config/fallback-agents.ts +0 -29
  201. package/src/config/index.ts +0 -2
  202. package/src/config/validate-providers.test.ts +0 -148
  203. package/src/config/validate-providers.ts +0 -58
  204. package/src/index.ts +0 -29
  205. package/src/main/blocked-state.test.ts +0 -1444
  206. package/src/main/budget-meter.test.ts +0 -477
  207. package/src/main/cost-session-banking.test.ts +0 -679
  208. package/src/main/file-attachments.test.ts +0 -215
  209. package/src/main/index.ts +0 -3
  210. package/src/main/interaction-cost.test.ts +0 -140
  211. package/src/main/main.styles.test.ts +0 -216
  212. package/src/main/main.styles.ts +0 -995
  213. package/src/main/main.template.ts +0 -1119
  214. package/src/main/main.ts +0 -5432
  215. package/src/main/main.types.ts +0 -225
  216. package/src/main/persistence-broken-sources.test.ts +0 -219
  217. package/src/main/popout-interaction-gate.test.ts +0 -87
  218. package/src/provider/ai-provider-switcher.ts +0 -40
  219. package/src/provider/assistant-app-settings.ts +0 -84
  220. package/src/state/ai-assistant-slice.test.ts +0 -336
  221. package/src/state/ai-assistant-slice.ts +0 -604
  222. package/src/state/debug-event-log.test.ts +0 -154
  223. package/src/state/debug-event-log.ts +0 -358
  224. package/src/state/driver-registry.test.ts +0 -70
  225. package/src/state/driver-registry.ts +0 -79
  226. package/src/state/interaction-context.test.ts +0 -90
  227. package/src/state/interaction-context.ts +0 -101
  228. package/src/state/persistence/build-timeline-entries.ts +0 -66
  229. package/src/state/persistence/diagnostics-cursors.test.ts +0 -53
  230. package/src/state/persistence/diagnostics-cursors.ts +0 -80
  231. package/src/state/persistence/diagnostics.test.ts +0 -346
  232. package/src/state/persistence/diagnostics.ts +0 -220
  233. package/src/state/persistence/index.ts +0 -10
  234. package/src/state/persistence/persister-registry.ts +0 -55
  235. package/src/state/persistence/session-persistence-provider.test.ts +0 -136
  236. package/src/state/persistence/session-persistence-provider.ts +0 -226
  237. package/src/state/persistence/session-persistence.integration.test.ts +0 -141
  238. package/src/state/persistence/session-persister.test.ts +0 -787
  239. package/src/state/persistence/session-persister.ts +0 -917
  240. package/src/state/persistence/session-snapshot.test.ts +0 -352
  241. package/src/state/persistence/session-snapshot.ts +0 -344
  242. package/src/state/persistence/stateful-restore.e2e.test.ts +0 -229
  243. package/src/state/session-store.ts +0 -56
  244. package/src/styles/ai-colours.ts +0 -30
  245. package/src/styles/menu.ts +0 -187
  246. package/src/styles/settings-section.ts +0 -40
  247. package/src/suggestions/chat-suggestions.ts +0 -186
  248. package/src/tags/index.ts +0 -1
  249. package/src/types/ai-chat-widget.ts +0 -67
  250. package/src/types/interaction-context.ts +0 -82
  251. package/src/utils/animated-panel-toggle.ts +0 -62
  252. package/src/utils/animation-exclusivity.test.ts +0 -72
  253. package/src/utils/animation-exclusivity.ts +0 -40
  254. package/src/utils/banked-usage-baselines.ts +0 -90
  255. package/src/utils/collect-session-models.test.ts +0 -82
  256. package/src/utils/collect-session-models.ts +0 -65
  257. package/src/utils/condense-history.test.ts +0 -746
  258. package/src/utils/condense-history.ts +0 -448
  259. package/src/utils/cost-session-history.test.ts +0 -226
  260. package/src/utils/cost-session-history.ts +0 -218
  261. package/src/utils/derive-cost-session-title.test.ts +0 -63
  262. package/src/utils/derive-cost-session-title.ts +0 -76
  263. package/src/utils/flatten-sub-agent-messages.test.ts +0 -163
  264. package/src/utils/flatten-sub-agent-messages.ts +0 -88
  265. package/src/utils/format-usd.ts +0 -26
  266. package/src/utils/history-transform.test.ts +0 -228
  267. package/src/utils/history-transform.ts +0 -163
  268. package/src/utils/index.ts +0 -3
  269. package/src/utils/logger.ts +0 -3
  270. package/src/utils/message-partition.test.ts +0 -129
  271. package/src/utils/message-partition.ts +0 -115
  272. package/src/utils/resolve-cost-history-config.test.ts +0 -38
  273. package/src/utils/resolve-cost-history-config.ts +0 -38
  274. package/src/utils/resolve-preference-baseline.test.ts +0 -84
  275. package/src/utils/resolve-preference-baseline.ts +0 -80
  276. package/src/utils/strip-agent-handlers.test.ts +0 -99
  277. package/src/utils/strip-agent-handlers.ts +0 -53
  278. package/src/utils/sum-costs.test.ts +0 -136
  279. package/src/utils/sum-costs.ts +0 -18
  280. package/src/utils/sum-tokens.test.ts +0 -93
  281. package/src/utils/sum-tokens.ts +0 -68
  282. package/src/utils/sum-usage.test.ts +0 -191
  283. package/src/utils/sum-usage.ts +0 -208
  284. package/src/utils/tool-fold.ts +0 -181
  285. package/src/utils/usage-rows.test.ts +0 -237
  286. package/src/utils/usage-rows.ts +0 -187
  287. package/src/utils/with-timeout.ts +0 -24
  288. package/tsconfig.json +0 -9
@@ -1,91 +0,0 @@
1
- import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
2
- import { FoundationAiAssistant } from '../../main/main';
3
- import { getSessionStore, clearAllSessionStores } from '../../state/session-store';
4
- import { settingsUsageMetersTemplate } from './settings-modal.template';
5
- // Hold a reference so the custom-element registration isn't tree-shaken.
6
- FoundationAiAssistant;
7
- // GENC-1464 — the shared meter column in the settings modal's "AI Model
8
- // Settings" section.
9
- //
10
- // The section body is a 4-unit flex column and the budget meter is a 2-unit
11
- // one, so an unwrapped context indicator sat 4 units above the first vendor row
12
- // while the vendor rows sat 2 apart — three visually identical meter rows
13
- // reading as an uneven 4/2/2. Both meters now share ONE 2-unit column
14
- // (`.settings-usage-meters`, grouped with `.settings-budget-usage` in the
15
- // styles — see settings-modal.styles.test.ts for the gap itself).
16
- //
17
- // The wrapper must also be ABSENT when neither meter shows: a permanent wrapper
18
- // is a permanent flex child of the section body, so a host with no meters would
19
- // pay a stray 4-unit gap after its model slot for a div that renders nothing.
20
- // That is a structural claim about the template, so this suite renders the
21
- // template rather than reading a getter — the getter cannot show whether the
22
- // `when` was wired to it.
23
- //
24
- // The element is created but never CONNECTED (`document.createElement` upgrades
25
- // only), for the reason budget-meter.test.ts gives: connecting subscribes to
26
- // `agenticActivityBus` and leaves the runner's event loop open.
27
- const Suite = createLogicSuite('settings-modal usage meters structure');
28
- const template = settingsUsageMetersTemplate('test-progress', 'test-button', 'test-icon');
29
- let storeSeq = 0;
30
- /** A fresh (unconnected) element wired to its own real session store. */
31
- function element() {
32
- const el = document.createElement('foundation-ai-assistant');
33
- storeSeq += 1;
34
- el._sessionRef = getSessionStore(`usage-meters-test-${storeSeq}`, false);
35
- return el;
36
- }
37
- /** Renders the meters for `el` into a detached host and returns it. */
38
- function render(el) {
39
- const host = document.createElement('div');
40
- template.render(el, host);
41
- return host;
42
- }
43
- Suite.after(() => {
44
- clearAllSessionStores();
45
- });
46
- Suite('both meters render inside one shared column', () => {
47
- const el = element();
48
- el.contextTokens = 1000;
49
- el.contextLimit = 4000;
50
- el.setVendorBudget('anthropic', { budgetUsd: 50, spentUsd: 45 });
51
- const host = render(el);
52
- const wrapper = host.querySelector('.settings-usage-meters');
53
- assert.ok(wrapper, 'the shared column is rendered');
54
- assert.ok(wrapper.querySelector('.settings-context-usage'), 'the context indicator is inside it');
55
- assert.ok(wrapper.querySelector('.settings-budget-usage'), 'so is the budget meter');
56
- // The rhythm the wrapper exists for: every meter row is a child of a 2-unit
57
- // column, none of them of the section body's 4-unit one.
58
- assert.is(host.querySelectorAll('.settings-usage-meters').length, 1, 'one column, not one per meter');
59
- });
60
- Suite('neither meter visible → no wrapper at all, not an empty one', () => {
61
- // The stray-gap case. Nothing fed, no context figures: the section body must
62
- // see no flex child from the meters.
63
- const el = element();
64
- const host = render(el);
65
- assert.is(el.settingsContextUsageVisible, false, 'precondition: no context data');
66
- assert.is(el.settingsBudgetUsageVisible, false, 'precondition: no budget data');
67
- assert.is(host.querySelector('.settings-usage-meters'), null, 'no wrapper element');
68
- assert.is(host.querySelectorAll('*').length, 0, 'and no element of any kind — comment markers only');
69
- });
70
- Suite('one meter alone still gets the shared column, with only its own child', () => {
71
- // Both single-meter cases: the wrapper appears for either meter on its own,
72
- // and the hidden sibling contributes NO element inside it (both gate with
73
- // `when`, which emplaces comment markers, not empty divs — an empty div would
74
- // be a second stray gap, inside the column this time).
75
- const contextOnly = element();
76
- contextOnly.contextTokens = 1000;
77
- contextOnly.contextLimit = 4000;
78
- const contextHost = render(contextOnly);
79
- const contextWrapper = contextHost.querySelector('.settings-usage-meters');
80
- assert.ok(contextWrapper, 'context alone still gets the column');
81
- assert.is(contextWrapper.children.length, 1, 'the hidden budget meter adds no flex child');
82
- assert.ok(contextWrapper.querySelector('.settings-context-usage'));
83
- const budgetOnly = element();
84
- budgetOnly.setVendorBudget('gemini', { budgetUsd: 50, spentUsd: 15 });
85
- const budgetHost = render(budgetOnly);
86
- const budgetWrapper = budgetHost.querySelector('.settings-usage-meters');
87
- assert.ok(budgetWrapper, 'budget alone still gets the column');
88
- assert.is(budgetWrapper.children.length, 1, 'the hidden context indicator adds no flex child');
89
- assert.ok(budgetWrapper.querySelector('.settings-budget-usage'));
90
- });
91
- Suite.run();
@@ -1,53 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
3
- import { defineStatefulAgent } from './define-stateful-agent';
4
- // A minimal lifecycle context — `onActivate`/`onDeactivate` only read what the
5
- // helper passes through, so the agent name, session key, and a live signal are
6
- // enough to drive init/dispose in a Node-runnable test.
7
- const lifecycleCtx = () => ({
8
- agentName: 'wizard',
9
- sessionKey: 'test-session',
10
- signal: new AbortController().signal,
11
- });
12
- const onUnresolvedTool = createLogicSuite('defineStatefulAgent onUnresolvedTool');
13
- onUnresolvedTool('threads the live state into the hook after init', () => __awaiter(void 0, void 0, void 0, function* () {
14
- const config = defineStatefulAgent({
15
- name: 'wizard',
16
- description: 'guided wizard',
17
- init: () => ({ step: 'intake' }),
18
- onUnresolvedTool: ({ state, toolName, kind, availableTools }) => `step=${state.step} tool=${toolName} kind=${kind} avail=${availableTools.join(',')}`,
19
- });
20
- yield config.onActivate(lifecycleCtx());
21
- const result = yield config.onUnresolvedTool({
22
- toolName: 'generate_view',
23
- kind: 'stale',
24
- availableTools: ['ask_user', 'validate'],
25
- });
26
- assert.is(result, 'step=intake tool=generate_view kind=stale avail=ask_user,validate');
27
- }));
28
- onUnresolvedTool('returns undefined before init rather than throwing', () => __awaiter(void 0, void 0, void 0, function* () {
29
- const config = defineStatefulAgent({
30
- name: 'wizard',
31
- description: 'guided wizard',
32
- init: () => ({ step: 'intake' }),
33
- // Would throw if it were ever reached without state — proves the wrapper
34
- // short-circuits before delegating.
35
- onUnresolvedTool: ({ state }) => `step=${state.step}`,
36
- });
37
- // No `onActivate` call — state has not been built yet.
38
- const result = yield config.onUnresolvedTool({
39
- toolName: 'generate_view',
40
- kind: 'unknown',
41
- availableTools: [],
42
- });
43
- assert.is(result, undefined, 'a pre-init call must degrade to the framework default');
44
- }));
45
- onUnresolvedTool('omits the hook from the config when not supplied', () => {
46
- const config = defineStatefulAgent({
47
- name: 'wizard',
48
- description: 'guided wizard',
49
- init: () => ({ step: 'intake' }),
50
- });
51
- assert.is(config.onUnresolvedTool, undefined);
52
- });
53
- onUnresolvedTool.run();
@@ -1,100 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
3
- import { resolveChatProvider, validateStaticAgentProviders } from './validate-providers';
4
- const chatProvider = () => ({
5
- chat: () => __awaiter(void 0, void 0, void 0, function* () { return ({ role: 'assistant', content: '' }); }),
6
- });
7
- const promptOnlyProvider = () => ({
8
- prompt: () => __awaiter(void 0, void 0, void 0, function* () { return ''; }),
9
- });
10
- /**
11
- * Minimal in-test registry — implements only what the validation helpers
12
- * touch (`get`, `names`). Avoids depending on foundation-ai's concrete
13
- * registry impl, and keeps these tests Node-runnable.
14
- */
15
- const makeRegistry = (providers) => {
16
- const map = new Map(Object.entries(providers));
17
- return {
18
- get: (name) => map.get(name),
19
- default: () => map.values().next().value,
20
- defaultName: () => map.keys().next().value,
21
- names: () => [...map.keys()],
22
- getStatus: () => __awaiter(void 0, void 0, void 0, function* () { return null; }),
23
- listStatuses: () => __awaiter(void 0, void 0, void 0, function* () { return []; }),
24
- };
25
- };
26
- const specialist = (overrides) => (Object.assign({ name: overrides.name, description: 'test specialist' }, overrides));
27
- // ---------------------------------------------------------------------------
28
- // resolveChatProvider
29
- // ---------------------------------------------------------------------------
30
- const resolve = createLogicSuite('resolveChatProvider');
31
- resolve('returns the provider when the name is registered and has chat()', () => {
32
- const fast = chatProvider();
33
- const registry = makeRegistry({ fast });
34
- assert.is(resolveChatProvider(registry, 'fast', 'A'), fast);
35
- });
36
- resolve('throws on an unknown provider name with the agent name in the message', () => {
37
- const registry = makeRegistry({ fast: chatProvider() });
38
- assert.throws(() => resolveChatProvider(registry, 'deep', 'A'), /Agent "A" references unknown provider "deep"/);
39
- });
40
- resolve('throws including the registered names so the misconfiguration is debuggable', () => {
41
- const registry = makeRegistry({
42
- fast: chatProvider(),
43
- deep: chatProvider(),
44
- cheap: chatProvider(),
45
- });
46
- assert.throws(() => resolveChatProvider(registry, 'typo', 'A'), /Registered: fast, deep, cheap/);
47
- });
48
- resolve('throws when the resolved provider does not implement chat()', () => {
49
- const registry = makeRegistry({ chrome: promptOnlyProvider() });
50
- assert.throws(() => resolveChatProvider(registry, 'chrome', 'A'), /Agent "A" resolved to provider "chrome" which does not implement chat\(\)/);
51
- });
52
- resolve.run();
53
- // ---------------------------------------------------------------------------
54
- // validateStaticAgentProviders
55
- // ---------------------------------------------------------------------------
56
- const validate = createLogicSuite('validateStaticAgentProviders');
57
- validate('accepts agents with no `provider` field (back-compat path)', () => {
58
- const registry = makeRegistry({ default: chatProvider() });
59
- assert.not.throws(() => validateStaticAgentProviders([specialist({ name: 'A' })], registry));
60
- });
61
- validate('accepts agents that name a registered chat-capable provider', () => {
62
- const registry = makeRegistry({ fast: chatProvider(), deep: chatProvider() });
63
- assert.not.throws(() => validateStaticAgentProviders([specialist({ name: 'A', provider: 'deep' })], registry));
64
- });
65
- validate('throws when a top-level agent references an unknown provider', () => {
66
- const registry = makeRegistry({ fast: chatProvider() });
67
- assert.throws(() => validateStaticAgentProviders([specialist({ name: 'A', provider: 'deep' })], registry), /Agent "A" references unknown provider "deep"/);
68
- });
69
- validate('recurses into subAgents — bad provider on a sub-agent throws', () => {
70
- const registry = makeRegistry({ fast: chatProvider() });
71
- const sub = specialist({ name: 'Sub', provider: 'missing' });
72
- assert.throws(() => validateStaticAgentProviders([specialist({ name: 'A', subAgents: [sub] })], registry), /Agent "Sub" references unknown provider "missing"/);
73
- });
74
- validate('recurses through multiple levels — bad provider on a deeply-nested sub-agent throws', () => {
75
- const registry = makeRegistry({ fast: chatProvider() });
76
- const deepest = specialist({ name: 'Deepest', provider: 'missing' });
77
- const middle = specialist({ name: 'Middle', subAgents: [deepest] });
78
- assert.throws(() => validateStaticAgentProviders([specialist({ name: 'Top', subAgents: [middle] })], registry), /Agent "Deepest" references unknown provider "missing"/);
79
- });
80
- validate('defers function-form `provider` — it is not invoked at validation time', () => {
81
- const registry = makeRegistry({ fast: chatProvider() });
82
- const agent = specialist({
83
- name: 'A',
84
- // If validateStaticAgentProviders eagerly resolved this, it would throw
85
- // here. The contract is that function-form is deferred to the driver's
86
- // per-turn resolver.
87
- provider: () => {
88
- throw new Error('function-form provider should not be invoked at validation time');
89
- },
90
- });
91
- assert.not.throws(() => validateStaticAgentProviders([agent], registry));
92
- });
93
- validate('shared sub-agent across two parents validates cleanly', () => {
94
- const registry = makeRegistry({ fast: chatProvider() });
95
- const shared = specialist({ name: 'Shared', provider: 'fast' });
96
- const parentA = specialist({ name: 'ParentA', subAgents: [shared] });
97
- const parentB = specialist({ name: 'ParentB', subAgents: [shared] });
98
- assert.not.throws(() => validateStaticAgentProviders([parentA, parentB], registry));
99
- });
100
- validate.run();