@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.
- package/package.json +17 -18
- package/api-extractor.json +0 -11
- package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.compact.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.invocation-scope.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.thinking-policy.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.trace-capture.test.d.ts.map +0 -1
- package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts +0 -2
- package/dist/dts/components/chat-driver/chat-driver.turn-usage.test.d.ts.map +0 -1
- package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts +0 -2
- package/dist/dts/components/chat-interaction-wrapper/chat-interaction-wrapper.test.d.ts.map +0 -1
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts +0 -2
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.budget.test.d.ts.map +0 -1
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts +0 -2
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.cost.test.d.ts.map +0 -1
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts +0 -2
- package/dist/dts/components/orchestrating-driver/orchestrating-driver.pin.test.d.ts.map +0 -1
- package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts +0 -2
- package/dist/dts/components/settings-modal/settings-modal.styles.test.d.ts.map +0 -1
- package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts +0 -2
- package/dist/dts/components/settings-modal/settings-modal.template.test.d.ts.map +0 -1
- package/dist/dts/config/define-stateful-agent.test.d.ts +0 -2
- package/dist/dts/config/define-stateful-agent.test.d.ts.map +0 -1
- package/dist/dts/config/validate-providers.test.d.ts +0 -2
- package/dist/dts/config/validate-providers.test.d.ts.map +0 -1
- package/dist/dts/main/blocked-state.test.d.ts +0 -2
- package/dist/dts/main/blocked-state.test.d.ts.map +0 -1
- package/dist/dts/main/budget-meter.test.d.ts +0 -2
- package/dist/dts/main/budget-meter.test.d.ts.map +0 -1
- package/dist/dts/main/cost-session-banking.test.d.ts +0 -2
- package/dist/dts/main/cost-session-banking.test.d.ts.map +0 -1
- package/dist/dts/main/file-attachments.test.d.ts +0 -2
- package/dist/dts/main/file-attachments.test.d.ts.map +0 -1
- package/dist/dts/main/interaction-cost.test.d.ts +0 -2
- package/dist/dts/main/interaction-cost.test.d.ts.map +0 -1
- package/dist/dts/main/main.styles.test.d.ts +0 -2
- package/dist/dts/main/main.styles.test.d.ts.map +0 -1
- package/dist/dts/main/persistence-broken-sources.test.d.ts +0 -2
- package/dist/dts/main/persistence-broken-sources.test.d.ts.map +0 -1
- package/dist/dts/main/popout-interaction-gate.test.d.ts +0 -2
- package/dist/dts/main/popout-interaction-gate.test.d.ts.map +0 -1
- package/dist/dts/state/ai-assistant-slice.test.d.ts +0 -2
- package/dist/dts/state/ai-assistant-slice.test.d.ts.map +0 -1
- package/dist/dts/state/debug-event-log.test.d.ts +0 -2
- package/dist/dts/state/debug-event-log.test.d.ts.map +0 -1
- package/dist/dts/state/driver-registry.test.d.ts +0 -2
- package/dist/dts/state/driver-registry.test.d.ts.map +0 -1
- package/dist/dts/state/interaction-context.test.d.ts +0 -2
- package/dist/dts/state/interaction-context.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts +0 -2
- package/dist/dts/state/persistence/diagnostics-cursors.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/diagnostics.test.d.ts +0 -2
- package/dist/dts/state/persistence/diagnostics.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-persistence-provider.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-persistence-provider.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-persistence.integration.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-persistence.integration.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-persister.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-persister.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/session-snapshot.test.d.ts +0 -2
- package/dist/dts/state/persistence/session-snapshot.test.d.ts.map +0 -1
- package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts +0 -2
- package/dist/dts/state/persistence/stateful-restore.e2e.test.d.ts.map +0 -1
- package/dist/dts/utils/animation-exclusivity.test.d.ts +0 -2
- package/dist/dts/utils/animation-exclusivity.test.d.ts.map +0 -1
- package/dist/dts/utils/collect-session-models.test.d.ts +0 -2
- package/dist/dts/utils/collect-session-models.test.d.ts.map +0 -1
- package/dist/dts/utils/condense-history.test.d.ts +0 -2
- package/dist/dts/utils/condense-history.test.d.ts.map +0 -1
- package/dist/dts/utils/cost-session-history.test.d.ts +0 -2
- package/dist/dts/utils/cost-session-history.test.d.ts.map +0 -1
- package/dist/dts/utils/derive-cost-session-title.test.d.ts +0 -2
- package/dist/dts/utils/derive-cost-session-title.test.d.ts.map +0 -1
- package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts +0 -2
- package/dist/dts/utils/flatten-sub-agent-messages.test.d.ts.map +0 -1
- package/dist/dts/utils/history-transform.test.d.ts +0 -2
- package/dist/dts/utils/history-transform.test.d.ts.map +0 -1
- package/dist/dts/utils/message-partition.test.d.ts +0 -2
- package/dist/dts/utils/message-partition.test.d.ts.map +0 -1
- package/dist/dts/utils/resolve-cost-history-config.test.d.ts +0 -2
- package/dist/dts/utils/resolve-cost-history-config.test.d.ts.map +0 -1
- package/dist/dts/utils/resolve-preference-baseline.test.d.ts +0 -2
- package/dist/dts/utils/resolve-preference-baseline.test.d.ts.map +0 -1
- package/dist/dts/utils/strip-agent-handlers.test.d.ts +0 -2
- package/dist/dts/utils/strip-agent-handlers.test.d.ts.map +0 -1
- package/dist/dts/utils/sum-costs.test.d.ts +0 -2
- package/dist/dts/utils/sum-costs.test.d.ts.map +0 -1
- package/dist/dts/utils/sum-tokens.test.d.ts +0 -2
- package/dist/dts/utils/sum-tokens.test.d.ts.map +0 -1
- package/dist/dts/utils/sum-usage.test.d.ts +0 -2
- package/dist/dts/utils/sum-usage.test.d.ts.map +0 -1
- package/dist/dts/utils/usage-rows.test.d.ts +0 -2
- package/dist/dts/utils/usage-rows.test.d.ts.map +0 -1
- package/dist/esm/components/chat-driver/chat-driver.compact.test.js +0 -93
- package/dist/esm/components/chat-driver/chat-driver.invocation-scope.test.js +0 -238
- package/dist/esm/components/chat-driver/chat-driver.test.js +0 -2770
- package/dist/esm/components/chat-driver/chat-driver.thinking-policy.test.js +0 -137
- package/dist/esm/components/chat-driver/chat-driver.trace-capture.test.js +0 -200
- package/dist/esm/components/chat-driver/chat-driver.turn-usage.test.js +0 -268
- package/dist/esm/components/chat-interaction-wrapper/chat-interaction-wrapper.test.js +0 -104
- package/dist/esm/components/orchestrating-driver/orchestrating-driver.budget.test.js +0 -312
- package/dist/esm/components/orchestrating-driver/orchestrating-driver.cost.test.js +0 -76
- package/dist/esm/components/orchestrating-driver/orchestrating-driver.pin.test.js +0 -61
- package/dist/esm/components/settings-modal/settings-modal.styles.test.js +0 -80
- package/dist/esm/components/settings-modal/settings-modal.template.test.js +0 -91
- package/dist/esm/config/define-stateful-agent.test.js +0 -53
- package/dist/esm/config/validate-providers.test.js +0 -100
- package/dist/esm/main/blocked-state.test.js +0 -1065
- package/dist/esm/main/budget-meter.test.js +0 -359
- package/dist/esm/main/cost-session-banking.test.js +0 -538
- package/dist/esm/main/file-attachments.test.js +0 -164
- package/dist/esm/main/interaction-cost.test.js +0 -107
- package/dist/esm/main/main.styles.test.js +0 -161
- package/dist/esm/main/persistence-broken-sources.test.js +0 -180
- package/dist/esm/main/popout-interaction-gate.test.js +0 -54
- package/dist/esm/state/ai-assistant-slice.test.js +0 -229
- package/dist/esm/state/debug-event-log.test.js +0 -117
- package/dist/esm/state/driver-registry.test.js +0 -55
- package/dist/esm/state/interaction-context.test.js +0 -78
- package/dist/esm/state/persistence/diagnostics-cursors.test.js +0 -30
- package/dist/esm/state/persistence/diagnostics.test.js +0 -280
- package/dist/esm/state/persistence/session-persistence-provider.test.js +0 -110
- package/dist/esm/state/persistence/session-persistence.integration.test.js +0 -113
- package/dist/esm/state/persistence/session-persister.test.js +0 -613
- package/dist/esm/state/persistence/session-snapshot.test.js +0 -256
- package/dist/esm/state/persistence/stateful-restore.e2e.test.js +0 -158
- package/dist/esm/utils/animation-exclusivity.test.js +0 -52
- package/dist/esm/utils/collect-session-models.test.js +0 -53
- package/dist/esm/utils/condense-history.test.js +0 -547
- package/dist/esm/utils/cost-session-history.test.js +0 -174
- package/dist/esm/utils/derive-cost-session-title.test.js +0 -37
- package/dist/esm/utils/flatten-sub-agent-messages.test.js +0 -139
- package/dist/esm/utils/history-transform.test.js +0 -158
- package/dist/esm/utils/message-partition.test.js +0 -90
- package/dist/esm/utils/resolve-cost-history-config.test.js +0 -32
- package/dist/esm/utils/resolve-preference-baseline.test.js +0 -69
- package/dist/esm/utils/strip-agent-handlers.test.js +0 -81
- package/dist/esm/utils/sum-costs.test.js +0 -114
- package/dist/esm/utils/sum-tokens.test.js +0 -51
- package/dist/esm/utils/sum-usage.test.js +0 -164
- package/dist/esm/utils/usage-rows.test.js +0 -189
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/license.txt +0 -46
- package/sandbox/tsconfig.json +0 -8
- package/src/channel/ai-activity-bus.ts +0 -209
- package/src/channel/ai-activity-channel.ts +0 -146
- package/src/chat-driver-node.ts +0 -159
- package/src/components/activity-halo/activity-halo.ts +0 -106
- package/src/components/agent-picker/agent-picker.constants.ts +0 -2
- package/src/components/agent-picker/agent-picker.styles.ts +0 -24
- package/src/components/agent-picker/agent-picker.template.ts +0 -54
- package/src/components/agent-picker/agent-picker.ts +0 -99
- package/src/components/agent-picker/index.ts +0 -1
- package/src/components/ai-driver/ai-driver.ts +0 -166
- package/src/components/ai-driver/index.ts +0 -1
- package/src/components/chat-bubble/chat-bubble.styles.ts +0 -194
- package/src/components/chat-bubble/chat-bubble.template.ts +0 -67
- package/src/components/chat-bubble/chat-bubble.ts +0 -436
- package/src/components/chat-bubble/index.ts +0 -1
- package/src/components/chat-driver/align-event-globals.ts +0 -23
- package/src/components/chat-driver/chat-driver.compact.test.ts +0 -131
- package/src/components/chat-driver/chat-driver.invocation-scope.test.ts +0 -285
- package/src/components/chat-driver/chat-driver.test.ts +0 -3679
- package/src/components/chat-driver/chat-driver.thinking-policy.test.ts +0 -185
- package/src/components/chat-driver/chat-driver.trace-capture.test.ts +0 -251
- package/src/components/chat-driver/chat-driver.ts +0 -3925
- package/src/components/chat-driver/chat-driver.turn-usage.test.ts +0 -362
- package/src/components/chat-driver/index.ts +0 -1
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.styles.ts +0 -7
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.template.ts +0 -6
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.test.ts +0 -144
- package/src/components/chat-interaction-wrapper/chat-interaction-wrapper.ts +0 -243
- package/src/components/chat-interaction-wrapper/index.ts +0 -3
- package/src/components/chat-markdown/chat-markdown.ts +0 -89
- package/src/components/chat-markdown/index.ts +0 -1
- package/src/components/flowing-waves-indicator.ts +0 -286
- package/src/components/halo-overlay.ts +0 -184
- package/src/components/orchestrating-driver/index.ts +0 -1
- package/src/components/orchestrating-driver/orchestrating-driver.budget.test.ts +0 -438
- package/src/components/orchestrating-driver/orchestrating-driver.cost.test.ts +0 -107
- package/src/components/orchestrating-driver/orchestrating-driver.pin.test.ts +0 -96
- package/src/components/orchestrating-driver/orchestrating-driver.ts +0 -813
- package/src/components/plasma-orb-indicator.ts +0 -281
- package/src/components/popout-manager/index.ts +0 -1
- package/src/components/popout-manager/popout-manager.ts +0 -212
- package/src/components/settings-modal/index.ts +0 -2
- package/src/components/settings-modal/settings-modal.styles.test.ts +0 -94
- package/src/components/settings-modal/settings-modal.styles.ts +0 -853
- package/src/components/settings-modal/settings-modal.template.test.ts +0 -124
- package/src/components/settings-modal/settings-modal.template.ts +0 -943
- package/src/components/waves-indicator.ts +0 -241
- package/src/config/config.ts +0 -608
- package/src/config/define-stateful-agent.test.ts +0 -64
- package/src/config/define-stateful-agent.ts +0 -642
- package/src/config/fallback-agents.ts +0 -29
- package/src/config/index.ts +0 -2
- package/src/config/validate-providers.test.ts +0 -148
- package/src/config/validate-providers.ts +0 -58
- package/src/index.ts +0 -29
- package/src/main/blocked-state.test.ts +0 -1444
- package/src/main/budget-meter.test.ts +0 -477
- package/src/main/cost-session-banking.test.ts +0 -679
- package/src/main/file-attachments.test.ts +0 -215
- package/src/main/index.ts +0 -3
- package/src/main/interaction-cost.test.ts +0 -140
- package/src/main/main.styles.test.ts +0 -216
- package/src/main/main.styles.ts +0 -995
- package/src/main/main.template.ts +0 -1119
- package/src/main/main.ts +0 -5432
- package/src/main/main.types.ts +0 -225
- package/src/main/persistence-broken-sources.test.ts +0 -219
- package/src/main/popout-interaction-gate.test.ts +0 -87
- package/src/provider/ai-provider-switcher.ts +0 -40
- package/src/provider/assistant-app-settings.ts +0 -84
- package/src/state/ai-assistant-slice.test.ts +0 -336
- package/src/state/ai-assistant-slice.ts +0 -604
- package/src/state/debug-event-log.test.ts +0 -154
- package/src/state/debug-event-log.ts +0 -358
- package/src/state/driver-registry.test.ts +0 -70
- package/src/state/driver-registry.ts +0 -79
- package/src/state/interaction-context.test.ts +0 -90
- package/src/state/interaction-context.ts +0 -101
- package/src/state/persistence/build-timeline-entries.ts +0 -66
- package/src/state/persistence/diagnostics-cursors.test.ts +0 -53
- package/src/state/persistence/diagnostics-cursors.ts +0 -80
- package/src/state/persistence/diagnostics.test.ts +0 -346
- package/src/state/persistence/diagnostics.ts +0 -220
- package/src/state/persistence/index.ts +0 -10
- package/src/state/persistence/persister-registry.ts +0 -55
- package/src/state/persistence/session-persistence-provider.test.ts +0 -136
- package/src/state/persistence/session-persistence-provider.ts +0 -226
- package/src/state/persistence/session-persistence.integration.test.ts +0 -141
- package/src/state/persistence/session-persister.test.ts +0 -787
- package/src/state/persistence/session-persister.ts +0 -917
- package/src/state/persistence/session-snapshot.test.ts +0 -352
- package/src/state/persistence/session-snapshot.ts +0 -344
- package/src/state/persistence/stateful-restore.e2e.test.ts +0 -229
- package/src/state/session-store.ts +0 -56
- package/src/styles/ai-colours.ts +0 -30
- package/src/styles/menu.ts +0 -187
- package/src/styles/settings-section.ts +0 -40
- package/src/suggestions/chat-suggestions.ts +0 -186
- package/src/tags/index.ts +0 -1
- package/src/types/ai-chat-widget.ts +0 -67
- package/src/types/interaction-context.ts +0 -82
- package/src/utils/animated-panel-toggle.ts +0 -62
- package/src/utils/animation-exclusivity.test.ts +0 -72
- package/src/utils/animation-exclusivity.ts +0 -40
- package/src/utils/banked-usage-baselines.ts +0 -90
- package/src/utils/collect-session-models.test.ts +0 -82
- package/src/utils/collect-session-models.ts +0 -65
- package/src/utils/condense-history.test.ts +0 -746
- package/src/utils/condense-history.ts +0 -448
- package/src/utils/cost-session-history.test.ts +0 -226
- package/src/utils/cost-session-history.ts +0 -218
- package/src/utils/derive-cost-session-title.test.ts +0 -63
- package/src/utils/derive-cost-session-title.ts +0 -76
- package/src/utils/flatten-sub-agent-messages.test.ts +0 -163
- package/src/utils/flatten-sub-agent-messages.ts +0 -88
- package/src/utils/format-usd.ts +0 -26
- package/src/utils/history-transform.test.ts +0 -228
- package/src/utils/history-transform.ts +0 -163
- package/src/utils/index.ts +0 -3
- package/src/utils/logger.ts +0 -3
- package/src/utils/message-partition.test.ts +0 -129
- package/src/utils/message-partition.ts +0 -115
- package/src/utils/resolve-cost-history-config.test.ts +0 -38
- package/src/utils/resolve-cost-history-config.ts +0 -38
- package/src/utils/resolve-preference-baseline.test.ts +0 -84
- package/src/utils/resolve-preference-baseline.ts +0 -80
- package/src/utils/strip-agent-handlers.test.ts +0 -99
- package/src/utils/strip-agent-handlers.ts +0 -53
- package/src/utils/sum-costs.test.ts +0 -136
- package/src/utils/sum-costs.ts +0 -18
- package/src/utils/sum-tokens.test.ts +0 -93
- package/src/utils/sum-tokens.ts +0 -68
- package/src/utils/sum-usage.test.ts +0 -191
- package/src/utils/sum-usage.ts +0 -208
- package/src/utils/tool-fold.ts +0 -181
- package/src/utils/usage-rows.test.ts +0 -237
- package/src/utils/usage-rows.ts +0 -187
- package/src/utils/with-timeout.ts +0 -24
- package/tsconfig.json +0 -9
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AIProvider,
|
|
3
|
-
AIProviderRegistry,
|
|
4
|
-
ChatMessage,
|
|
5
|
-
ChatRequestOptions,
|
|
6
|
-
} from '@genesislcap/foundation-ai';
|
|
7
|
-
import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
|
|
8
|
-
import type { AgentConfig } from '../../config/config';
|
|
9
|
-
import type { ChatDriver } from '../chat-driver/chat-driver';
|
|
10
|
-
// Side-effect import — MUST precede `./orchestrating-driver` so the driver
|
|
11
|
-
// subclasses jsdom's EventTarget (CustomEvent dispatch then works in node).
|
|
12
|
-
import '../chat-driver/align-event-globals';
|
|
13
|
-
import { OrchestratingDriver } from './orchestrating-driver';
|
|
14
|
-
|
|
15
|
-
// GENC-1508 — `recordExternalCost` is OPTIONAL on `AiDriver`, so a missing delegation here
|
|
16
|
-
// is not a compile error: the host's `driver?.recordExternalCost?.(…)` simply evaluates to
|
|
17
|
-
// undefined and every post-resolve charge from every widget disappears — silently, and only
|
|
18
|
-
// in orchestrated setups. That is the same invisible-when-broken failure the method exists to
|
|
19
|
-
// fix, so the delegation gets a test rather than trust.
|
|
20
|
-
|
|
21
|
-
const makeRegistry = (provider: AIProvider): AIProviderRegistry => ({
|
|
22
|
-
get: () => provider,
|
|
23
|
-
default: () => provider,
|
|
24
|
-
defaultName: () => 'test',
|
|
25
|
-
names: () => ['test'],
|
|
26
|
-
getStatus: async () => null,
|
|
27
|
-
listStatuses: async () => [],
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
const noToolProvider = (): AIProvider =>
|
|
31
|
-
({
|
|
32
|
-
chat: async (
|
|
33
|
-
_history: ChatMessage[],
|
|
34
|
-
_userMessage: string,
|
|
35
|
-
_options?: ChatRequestOptions,
|
|
36
|
-
): Promise<ChatMessage> => ({ role: 'assistant', content: 'ok' }),
|
|
37
|
-
}) as AIProvider;
|
|
38
|
-
|
|
39
|
-
const agent = (overrides: Partial<AgentConfig> & { name: string }): AgentConfig =>
|
|
40
|
-
({ description: 'test agent', ...overrides }) as AgentConfig;
|
|
41
|
-
|
|
42
|
-
const makeDriver = () =>
|
|
43
|
-
new OrchestratingDriver(makeRegistry(noToolProvider()), [agent({ name: 'Genesis Assistant' })], {
|
|
44
|
-
sessionKey: 'k',
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
/** The orchestrator does not expose `requestInteraction`, so the interaction is ARRANGED on the
|
|
48
|
-
* wrapped driver. Every assertion below goes through the orchestrator's own public surface. */
|
|
49
|
-
const wrapped = (driver: OrchestratingDriver): ChatDriver =>
|
|
50
|
-
(driver as unknown as { chatDriver: ChatDriver }).chatDriver;
|
|
51
|
-
|
|
52
|
-
const Suite = createLogicSuite('orchestrating-driver external cost');
|
|
53
|
-
|
|
54
|
-
Suite('post-resolve spend delegates to the wrapped driver', async () => {
|
|
55
|
-
const driver = makeDriver();
|
|
56
|
-
const inner = wrapped(driver);
|
|
57
|
-
const pending = inner.requestInteraction('planning-question', { question: 'Pick one' });
|
|
58
|
-
const id = driver.getRawHistory().at(-1)!.interaction!.interactionId;
|
|
59
|
-
driver.resolveInteraction(id, { status: 'approved', costUsd: 0.5 });
|
|
60
|
-
await pending;
|
|
61
|
-
|
|
62
|
-
assert.is(driver.recordExternalCost(id, 0.25), true);
|
|
63
|
-
|
|
64
|
-
const msg = driver.getRawHistory().find((m) => m.interaction?.interactionId === id);
|
|
65
|
-
assert.is(msg?.externalCostUsd, 0.75);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
Suite('an unknown interaction is reported as unrecorded, not thrown', async () => {
|
|
69
|
-
const driver = makeDriver();
|
|
70
|
-
assert.is(driver.recordExternalCost('never-existed', 0.25), false);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
Suite('the announcement reaches the HOST, which only ever holds this wrapper', async () => {
|
|
74
|
-
// The delegation test above passes with the forward missing: the money still lands on the
|
|
75
|
-
// message. What breaks is quieter — `createDriver` hands the host an OrchestratingDriver for any
|
|
76
|
-
// non-empty `agents`, so an event the inner driver raises and the constructor's forward list
|
|
77
|
-
// omits is one the host never sees. The totals then never refresh and the save is never
|
|
78
|
-
// scheduled, and because this flow's interaction is the last thing in the session, "stale until
|
|
79
|
-
// the next history change" means permanently. Asserted on the WRAPPER for that reason.
|
|
80
|
-
const driver = makeDriver();
|
|
81
|
-
const inner = wrapped(driver);
|
|
82
|
-
const pending = inner.requestInteraction('planning-question', { question: 'Pick one' });
|
|
83
|
-
const id = driver.getRawHistory().at(-1)!.interaction!.interactionId;
|
|
84
|
-
driver.resolveInteraction(id, { status: 'approved' });
|
|
85
|
-
await pending;
|
|
86
|
-
|
|
87
|
-
let seen = 0;
|
|
88
|
-
let detail: { interactionId?: string; costUsd?: number } | undefined;
|
|
89
|
-
driver.addEventListener('external-cost-recorded', (e) => {
|
|
90
|
-
seen += 1;
|
|
91
|
-
detail = (e as CustomEvent).detail;
|
|
92
|
-
});
|
|
93
|
-
// …and never on `history-updated`, which would rebuild the reporting widget.
|
|
94
|
-
let historyUpdated = 0;
|
|
95
|
-
driver.addEventListener('history-updated', () => {
|
|
96
|
-
historyUpdated += 1;
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
driver.recordExternalCost(id, 0.25);
|
|
100
|
-
|
|
101
|
-
assert.is(seen, 1);
|
|
102
|
-
assert.is(detail?.costUsd, 0.25);
|
|
103
|
-
assert.is(detail?.interactionId, id);
|
|
104
|
-
assert.is(historyUpdated, 0);
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
Suite.run();
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AIProvider,
|
|
3
|
-
AIProviderRegistry,
|
|
4
|
-
ChatMessage,
|
|
5
|
-
ChatRequestOptions,
|
|
6
|
-
} from '@genesislcap/foundation-ai';
|
|
7
|
-
import { assert, createLogicSuite } from '@genesislcap/foundation-testing';
|
|
8
|
-
import type { AgentConfig } from '../../config/config';
|
|
9
|
-
// Side-effect import — MUST precede `./orchestrating-driver` so the driver
|
|
10
|
-
// subclasses jsdom's EventTarget (CustomEvent dispatch then works in node).
|
|
11
|
-
import '../chat-driver/align-event-globals';
|
|
12
|
-
import { OrchestratingDriver } from './orchestrating-driver';
|
|
13
|
-
|
|
14
|
-
// GENC-1351 — a set routing pin must be honoured on the next turn. This is the
|
|
15
|
-
// invariant that broke on restore (found via the §5.8 diagnostics log): the pin
|
|
16
|
-
// was hydrated into the store but never pushed to the driver, so the first
|
|
17
|
-
// post-restore message fell through to the classifier and re-routed away from the
|
|
18
|
-
// pinned agent. `Guided Booking` here is `excludeFromClassifier`, so the classifier
|
|
19
|
-
// can NEVER pick it — a turn landing on it proves the pin (not classification)
|
|
20
|
-
// routed it. The element-side fix (restore → `driver.setPinnedAgent`) is what makes
|
|
21
|
-
// the pin reach the driver; this locks the driver half of the contract.
|
|
22
|
-
|
|
23
|
-
const makeRegistry = (provider: AIProvider): AIProviderRegistry => ({
|
|
24
|
-
get: () => provider,
|
|
25
|
-
default: () => provider,
|
|
26
|
-
defaultName: () => 'test',
|
|
27
|
-
names: () => ['test'],
|
|
28
|
-
getStatus: async () => null,
|
|
29
|
-
listStatuses: async () => [],
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
/** A provider that ends every turn immediately with a plain-text reply (no tools). */
|
|
33
|
-
const noToolProvider = (): AIProvider =>
|
|
34
|
-
({
|
|
35
|
-
chat: async (
|
|
36
|
-
_history: ChatMessage[],
|
|
37
|
-
_userMessage: string,
|
|
38
|
-
_options?: ChatRequestOptions,
|
|
39
|
-
): Promise<ChatMessage> => ({ role: 'assistant', content: 'ok' }),
|
|
40
|
-
}) as AIProvider;
|
|
41
|
-
|
|
42
|
-
const agent = (overrides: Partial<AgentConfig> & { name: string }): AgentConfig =>
|
|
43
|
-
({ description: 'test agent', ...overrides }) as AgentConfig;
|
|
44
|
-
|
|
45
|
-
const makeDriver = () =>
|
|
46
|
-
new OrchestratingDriver(
|
|
47
|
-
makeRegistry(noToolProvider()),
|
|
48
|
-
[
|
|
49
|
-
agent({ name: 'Genesis Assistant' }), // classifier-eligible specialist
|
|
50
|
-
agent({ name: 'Guided Booking', excludeFromClassifier: true }), // pin-only
|
|
51
|
-
],
|
|
52
|
-
{ sessionKey: 'k' },
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
const Suite = createLogicSuite('orchestrating-driver-pin');
|
|
56
|
-
|
|
57
|
-
Suite('a set pin routes the next turn to the pinned agent (bypassing the classifier)', async () => {
|
|
58
|
-
const driver = makeDriver();
|
|
59
|
-
driver.setPinnedAgent('Guided Booking');
|
|
60
|
-
await driver.sendMessage('hi');
|
|
61
|
-
assert.is(
|
|
62
|
-
driver.getActiveAgent()?.name,
|
|
63
|
-
'Guided Booking',
|
|
64
|
-
'pinned agent ran; it is excludeFromClassifier, so only the pin could have routed it',
|
|
65
|
-
);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
Suite('the pin is sticky across turns', async () => {
|
|
69
|
-
const driver = makeDriver();
|
|
70
|
-
driver.setPinnedAgent('Guided Booking');
|
|
71
|
-
await driver.sendMessage('one');
|
|
72
|
-
await driver.sendMessage('two');
|
|
73
|
-
assert.is(driver.getActiveAgent()?.name, 'Guided Booking', 'still pinned on the second turn');
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// GENC-1351 — the flow-owner lock is the *unpinned* routing path. A classifier-routed
|
|
77
|
-
// stateful flow (flow-owned but never user-pinned) must resume on restore without
|
|
78
|
-
// re-classifying: the persister re-applies BOTH `setPinnedAgent` and `setFlowOwner` on
|
|
79
|
-
// restore, and `resolvePinnedAgent` reads `flowOwnerAgentName ?? pinnedAgentName`. Here
|
|
80
|
-
// `Guided Booking` is `excludeFromClassifier` AND left unpinned, so a turn landing on it
|
|
81
|
-
// proves the flow-owner lock (not the pin, not classification) routed it.
|
|
82
|
-
Suite(
|
|
83
|
-
'a set flow-owner lock routes the next turn to that agent (bypassing the classifier)',
|
|
84
|
-
async () => {
|
|
85
|
-
const driver = makeDriver();
|
|
86
|
-
driver.setFlowOwner('Guided Booking'); // flow-owned but NOT pinned
|
|
87
|
-
await driver.sendMessage('hi');
|
|
88
|
-
assert.is(
|
|
89
|
-
driver.getActiveAgent()?.name,
|
|
90
|
-
'Guided Booking',
|
|
91
|
-
'flow-owner routed it; it is excludeFromClassifier and unpinned, so only the flow-owner lock could have',
|
|
92
|
-
);
|
|
93
|
-
},
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
Suite.run();
|