@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,238 +0,0 @@
1
- import { __awaiter } from "tslib";
2
- import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
3
- import { defineStatefulAgent } from '../../config/define-stateful-agent';
4
- // Side-effect import — MUST come before `./chat-driver` so the driver subclasses
5
- // jsdom's EventTarget rather than Node's native one. Mirrors chat-driver.test.ts.
6
- import './align-event-globals';
7
- import { ChatDriver } from './chat-driver';
8
- // ---------------------------------------------------------------------------
9
- // Sub-agent state scoping.
10
- //
11
- // A sub-agent config lives in the parent's `subAgentsMap`, keyed by NAME — one
12
- // config object, reused for every invocation. Anything a handler closes over is
13
- // therefore scoped to the *config*, not to the invocation.
14
- //
15
- // These tests PIN that behaviour; they do not wish it away. Per-conversation
16
- // registration is deliberate, so a closure in a sub-agent config will always be
17
- // config-scoped — no planned platform change (F8 included) alters it. F8 adds a
18
- // separate invocation-scoped store to write to instead; it does not re-scope
19
- // closures. Consumers that accumulate across a child's turns must use that store
20
- // (today: a WeakMap keyed on `promptCtx.signal`), never a closure.
21
- //
22
- // ⚠ TO WHOEVER IMPLEMENTS THE PER-ACTIVATION-STATE TICKET
23
- // (`defineStatefulAgent`: per-activation state and headless execution)
24
- //
25
- // Its acceptance criterion 2 — "two concurrent activations of the same config
26
- // hold independent state, with a test that fails against today's shared closure
27
- // variable" — reads almost word-for-word like the first two tests below. It is
28
- // not the same subject, and they must be treated differently:
29
- //
30
- // • Criterion 2 concerns FRAMEWORK-owned state: `defineStatefulAgent`'s single
31
- // `let state` (define-stateful-agent.ts:374). That is the bug it fixes, and
32
- // it needs a NEW test of its own.
33
- // • The first two tests below concern CONSUMER-owned closures in a plain
34
- // `AgentConfig`. The platform cannot re-scope a closure someone wrote in
35
- // their own factory, so these stay true afterwards. Do not delete or invert
36
- // them to make criterion 2 look satisfied.
37
- // • The third test — "a defineStatefulAgent config cannot be used as a
38
- // sub-agent" — IS invalidated by that ticket (its criteria 1 and 3), and
39
- // must be rewritten when it lands, not before.
40
- //
41
- // The provider here answers by rule rather than by scripted queue: sub-agent
42
- // invocations dispatched from one assistant turn run concurrently under
43
- // `Promise.all`, so a shared FIFO queue would make ordering — and the test —
44
- // nondeterministic.
45
- // ---------------------------------------------------------------------------
46
- /**
47
- * Answers by rule, not by scripted queue: sub-agent invocations dispatched from
48
- * one assistant turn run concurrently under `Promise.all`, so a shared FIFO
49
- * would make ordering — and the test — nondeterministic.
50
- *
51
- * `fanOut` controls how many `delegate` calls the parent emits in its single
52
- * delegating turn. Parent turns after the first return plain text so the loop
53
- * terminates.
54
- */
55
- const ruleProvider = (fanOut) => {
56
- let parentTurns = 0;
57
- return {
58
- chat: (_history, _userMessage, options) => __awaiter(void 0, void 0, void 0, function* () {
59
- var _a;
60
- const tools = ((_a = options === null || options === void 0 ? void 0 : options.tools) !== null && _a !== void 0 ? _a : []).map((t) => t.name);
61
- // Child turn: it can only finish via its completion tool.
62
- if (tools.includes('work')) {
63
- return {
64
- role: 'assistant',
65
- content: '',
66
- toolCalls: [{ id: 'w1', name: 'work', args: {} }],
67
- };
68
- }
69
- // Parent turn — delegate once, then wrap up.
70
- if (tools.includes('delegate') && parentTurns === 0) {
71
- parentTurns += 1;
72
- return {
73
- role: 'assistant',
74
- content: '',
75
- toolCalls: Array.from({ length: fanOut }, (_, i) => ({
76
- id: `d${i}`,
77
- name: 'delegate',
78
- args: {},
79
- })),
80
- };
81
- }
82
- return { role: 'assistant', content: 'done' };
83
- }),
84
- };
85
- };
86
- const makeRegistry = (provider) => ({
87
- get: () => provider,
88
- default: () => provider,
89
- defaultName: () => 'test',
90
- names: () => ['test'],
91
- getStatus: () => __awaiter(void 0, void 0, void 0, function* () { return null; }),
92
- listStatuses: () => __awaiter(void 0, void 0, void 0, function* () { return []; }),
93
- });
94
- const agent = (overrides) => (Object.assign({ description: 'test agent' }, overrides));
95
- const makeDriver = (config, provider) => {
96
- const driver = new ChatDriver(makeRegistry(provider), {
97
- maxToolIterations: 20,
98
- maxFoldOperations: 5,
99
- sessionKey: '',
100
- });
101
- driver.applyAgent(config);
102
- return driver;
103
- };
104
- const scope = createLogicSuite('ChatDriver sub-agent invocation scope');
105
- // ---------------------------------------------------------------------------
106
- scope('closure state is config-scoped, so concurrent invocations contaminate each other', () => __awaiter(void 0, void 0, void 0, function* () {
107
- // The natural-looking way to accumulate across a sub-agent's turns — a closure
108
- // in the config factory — is created once, with the config, and shared by every
109
- // invocation. This is the trap; the assertion records it rather than wanting it.
110
- const collected = [];
111
- const worker = agent({
112
- name: 'worker',
113
- toolDefinitions: [
114
- { name: 'work', description: 'work', parameters: { type: 'object', properties: {} } },
115
- ],
116
- toolHandlers: {
117
- work: (_args, ctx) => __awaiter(void 0, void 0, void 0, function* () {
118
- var _a;
119
- collected.push('item');
120
- // Report what THIS invocation believes it has accumulated.
121
- (_a = ctx.completeSubAgent) === null || _a === void 0 ? void 0 : _a.call(ctx, { seen: collected.length });
122
- return 'worked';
123
- }),
124
- },
125
- });
126
- const outcomes = [];
127
- const parent = agent({
128
- name: 'boss',
129
- subAgents: [worker],
130
- toolDefinitions: [
131
- {
132
- name: 'delegate',
133
- description: 'delegate',
134
- parameters: { type: 'object', properties: {} },
135
- },
136
- ],
137
- toolHandlers: {
138
- delegate: (_args, ctx) => __awaiter(void 0, void 0, void 0, function* () {
139
- const outcome = yield ctx.requestSubAgent('worker', { task: 'go' });
140
- outcomes.push(outcome);
141
- return 'delegated';
142
- }),
143
- },
144
- });
145
- yield makeDriver(parent, ruleProvider(2)).sendMessage('go');
146
- assert.is(outcomes.length, 2, 'both delegations should have resolved');
147
- // Each invocation did exactly one unit of work, so an invocation-scoped
148
- // accumulator would report 1 from both. A config-scoped one reports 1 and 2.
149
- // Deterministic despite the concurrency: the handler pushes and reads with no
150
- // await between, so two invocations cannot interleave mid-body.
151
- const seen = outcomes.map((o) => { var _a; return (_a = o === null || o === void 0 ? void 0 : o.result) === null || _a === void 0 ? void 0 : _a.seen; }).sort();
152
- assert.equal(seen, [1, 2], "the second invocation sees the first's work — if this ever reports [1,1], closures " +
153
- 'have become invocation-scoped and this test should be rewritten, not deleted');
154
- }));
155
- // ---------------------------------------------------------------------------
156
- scope('closure state is config-scoped, so a later invocation resumes the earlier one', () => __awaiter(void 0, void 0, void 0, function* () {
157
- // The sequential form of the same trap: nothing resets the closure between
158
- // invocations, so a second delegation resumes where the first left off. This is
159
- // the failure CG8 describes — a retried child whose cursor is already exhausted
160
- // emits nothing and completes silently.
161
- const collected = [];
162
- const worker = agent({
163
- name: 'worker',
164
- toolDefinitions: [
165
- { name: 'work', description: 'work', parameters: { type: 'object', properties: {} } },
166
- ],
167
- toolHandlers: {
168
- work: (_args, ctx) => __awaiter(void 0, void 0, void 0, function* () {
169
- var _a;
170
- collected.push('item');
171
- (_a = ctx.completeSubAgent) === null || _a === void 0 ? void 0 : _a.call(ctx, { seen: collected.length });
172
- return 'worked';
173
- }),
174
- },
175
- });
176
- const outcomes = [];
177
- const parent = agent({
178
- name: 'boss',
179
- subAgents: [worker],
180
- toolDefinitions: [
181
- { name: 'delegate', description: 'delegate', parameters: { type: 'object', properties: {} } },
182
- ],
183
- toolHandlers: {
184
- // Await them one after the other — no concurrency involved.
185
- delegate: (_args, ctx) => __awaiter(void 0, void 0, void 0, function* () {
186
- outcomes.push(yield ctx.requestSubAgent('worker', { task: 'first' }));
187
- outcomes.push(yield ctx.requestSubAgent('worker', { task: 'second' }));
188
- return 'delegated';
189
- }),
190
- },
191
- });
192
- yield makeDriver(parent, ruleProvider(1)).sendMessage('go');
193
- const seen = outcomes.map((o) => { var _a; return (_a = o === null || o === void 0 ? void 0 : o.result) === null || _a === void 0 ? void 0 : _a.seen; });
194
- assert.equal(seen, [1, 2], "a second invocation does NOT start from zero — it resumes the first's accumulator");
195
- }));
196
- // ---------------------------------------------------------------------------
197
- scope('a defineStatefulAgent config cannot be used as a sub-agent', () => __awaiter(void 0, void 0, void 0, function* () {
198
- // `init` runs from `onActivate`, which only OrchestratingDriver fires on an
199
- // agent switch. `invokeSubAgent` builds a raw ChatDriver and calls
200
- // `applyAgent` directly, so a stateful sub-agent never initialises. This test
201
- // pins that boundary — it is a documented-by-behaviour constraint, not a bug,
202
- // and the failure is loud rather than silent.
203
- const stateful = defineStatefulAgent({
204
- name: 'worker',
205
- description: 'stateful worker',
206
- init: () => ({ count: 0 }),
207
- systemPrompt: ({ state }) => `count=${state.count}`,
208
- toolDefinitions: [
209
- { name: 'work', description: 'work', parameters: { type: 'object', properties: {} } },
210
- ],
211
- toolHandlers: () => ({
212
- work: (_args, ctx) => __awaiter(void 0, void 0, void 0, function* () {
213
- var _a;
214
- (_a = ctx.completeSubAgent) === null || _a === void 0 ? void 0 : _a.call(ctx, { ok: true });
215
- return 'worked';
216
- }),
217
- }),
218
- });
219
- let outcome;
220
- const parent = agent({
221
- name: 'boss',
222
- subAgents: [stateful],
223
- toolDefinitions: [
224
- { name: 'delegate', description: 'delegate', parameters: { type: 'object', properties: {} } },
225
- ],
226
- toolHandlers: {
227
- delegate: (_args, ctx) => __awaiter(void 0, void 0, void 0, function* () {
228
- outcome = yield ctx.requestSubAgent('worker', { task: 'go' });
229
- return 'delegated';
230
- }),
231
- },
232
- });
233
- yield makeDriver(parent, ruleProvider(1)).sendMessage('go');
234
- assert.ok(outcome, 'the delegation should have resolved rather than hanging');
235
- assert.is(outcome.ok, false, `a stateful sub-agent never runs init (onActivate is orchestrator-only), so the ` +
236
- `invocation must fail rather than silently run with undefined state — got ${JSON.stringify(outcome)}`);
237
- }));
238
- scope.run();