@agtlantis/core 0.5.0 → 0.5.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/dist/errors/index.d.ts +4 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +3 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/types.d.ts +69 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +119 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/errors/utils.d.ts +17 -0
- package/dist/errors/utils.d.ts.map +1 -0
- package/dist/errors/utils.js +16 -0
- package/dist/errors/utils.js.map +1 -0
- package/dist/execution/constants.d.ts +7 -0
- package/dist/execution/constants.d.ts.map +1 -0
- package/dist/execution/constants.js +7 -0
- package/dist/execution/constants.js.map +1 -0
- package/dist/execution/index.d.ts +8 -0
- package/dist/execution/index.d.ts.map +1 -0
- package/dist/execution/index.js +7 -0
- package/dist/execution/index.js.map +1 -0
- package/dist/execution/mapping.d.ts +17 -0
- package/dist/execution/mapping.d.ts.map +1 -0
- package/dist/execution/mapping.js +197 -0
- package/dist/execution/mapping.js.map +1 -0
- package/dist/execution/shared.d.ts +86 -0
- package/dist/execution/shared.d.ts.map +1 -0
- package/dist/execution/shared.js +100 -0
- package/dist/execution/shared.js.map +1 -0
- package/dist/execution/simple-host.d.ts +56 -0
- package/dist/execution/simple-host.d.ts.map +1 -0
- package/dist/execution/simple-host.js +126 -0
- package/dist/execution/simple-host.js.map +1 -0
- package/dist/execution/streaming-host.d.ts +79 -0
- package/dist/execution/streaming-host.d.ts.map +1 -0
- package/dist/execution/streaming-host.js +276 -0
- package/dist/execution/streaming-host.js.map +1 -0
- package/dist/execution/testing/fixtures.d.ts +67 -0
- package/dist/execution/testing/fixtures.d.ts.map +1 -0
- package/dist/execution/testing/fixtures.js +145 -0
- package/dist/execution/testing/fixtures.js.map +1 -0
- package/dist/execution/testing/helpers.d.ts +218 -0
- package/dist/execution/testing/helpers.d.ts.map +1 -0
- package/dist/execution/testing/helpers.js +327 -0
- package/dist/execution/testing/helpers.js.map +1 -0
- package/dist/execution/testing/host-configs.d.ts +56 -0
- package/dist/execution/testing/host-configs.d.ts.map +1 -0
- package/dist/execution/testing/host-configs.js +154 -0
- package/dist/execution/testing/host-configs.js.map +1 -0
- package/dist/execution/testing/vitest-assertions.d.ts +102 -0
- package/dist/execution/testing/vitest-assertions.d.ts.map +1 -0
- package/dist/execution/testing/vitest-assertions.js +142 -0
- package/dist/execution/testing/vitest-assertions.js.map +1 -0
- package/dist/execution/types.d.ts +432 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +2 -0
- package/dist/execution/types.js.map +1 -0
- package/dist/execution/utils.d.ts +68 -0
- package/dist/execution/utils.d.ts.map +1 -0
- package/dist/execution/utils.js +93 -0
- package/dist/execution/utils.js.map +1 -0
- package/dist/index.d.ts +10 -1506
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -2979
- package/dist/index.js.map +1 -1
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +2 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/logger.d.ts +161 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +31 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/types.d.ts +46 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +2 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/patterns/index.d.ts +2 -0
- package/dist/patterns/index.d.ts.map +1 -0
- package/dist/patterns/index.js +2 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/patterns/progressive/index.d.ts +2 -0
- package/dist/patterns/progressive/index.d.ts.map +1 -0
- package/dist/patterns/progressive/index.js +2 -0
- package/dist/patterns/progressive/index.js.map +1 -0
- package/dist/patterns/progressive/progressive-pattern.d.ts +174 -0
- package/dist/patterns/progressive/progressive-pattern.d.ts.map +1 -0
- package/dist/patterns/progressive/progressive-pattern.js +260 -0
- package/dist/patterns/progressive/progressive-pattern.js.map +1 -0
- package/dist/pricing/calculator.d.ts +71 -0
- package/dist/pricing/calculator.d.ts.map +1 -0
- package/dist/pricing/calculator.js +127 -0
- package/dist/pricing/calculator.js.map +1 -0
- package/dist/pricing/config.d.ts +61 -0
- package/dist/pricing/config.d.ts.map +1 -0
- package/dist/pricing/config.js +87 -0
- package/dist/pricing/config.js.map +1 -0
- package/dist/pricing/defaults.d.ts +29 -0
- package/dist/pricing/defaults.d.ts.map +1 -0
- package/dist/pricing/defaults.js +139 -0
- package/dist/pricing/defaults.js.map +1 -0
- package/dist/pricing/index.d.ts +40 -0
- package/dist/pricing/index.d.ts.map +1 -0
- package/dist/pricing/index.js +43 -0
- package/dist/pricing/index.js.map +1 -0
- package/dist/pricing/types.d.ts +96 -0
- package/dist/pricing/types.d.ts.map +1 -0
- package/dist/pricing/types.js +7 -0
- package/dist/pricing/types.js.map +1 -0
- package/dist/pricing/validator.d.ts +55 -0
- package/dist/pricing/validator.d.ts.map +1 -0
- package/dist/pricing/validator.js +84 -0
- package/dist/pricing/validator.js.map +1 -0
- package/dist/prompt/errors.d.ts +112 -0
- package/dist/prompt/errors.d.ts.map +1 -0
- package/dist/prompt/errors.js +175 -0
- package/dist/prompt/errors.js.map +1 -0
- package/dist/prompt/file-prompt-repository.d.ts +80 -0
- package/dist/prompt/file-prompt-repository.d.ts.map +1 -0
- package/dist/prompt/file-prompt-repository.js +287 -0
- package/dist/prompt/file-prompt-repository.js.map +1 -0
- package/dist/prompt/index.d.ts +34 -0
- package/dist/prompt/index.d.ts.map +1 -0
- package/dist/prompt/index.js +37 -0
- package/dist/prompt/index.js.map +1 -0
- package/dist/prompt/prompt-template.d.ts +64 -0
- package/dist/prompt/prompt-template.d.ts.map +1 -0
- package/dist/prompt/prompt-template.js +90 -0
- package/dist/prompt/prompt-template.js.map +1 -0
- package/dist/prompt/template.d.ts +23 -0
- package/dist/prompt/template.d.ts.map +1 -0
- package/dist/prompt/template.js +70 -0
- package/dist/prompt/template.js.map +1 -0
- package/dist/prompt/types.d.ts +148 -0
- package/dist/prompt/types.d.ts.map +1 -0
- package/dist/prompt/types.js +7 -0
- package/dist/prompt/types.js.map +1 -0
- package/dist/provider/base-provider.d.ts +41 -0
- package/dist/provider/base-provider.d.ts.map +1 -0
- package/dist/provider/base-provider.js +21 -0
- package/dist/provider/base-provider.js.map +1 -0
- package/dist/provider/file-cache.d.ts +14 -0
- package/dist/provider/file-cache.d.ts.map +1 -0
- package/dist/provider/file-cache.js +29 -0
- package/dist/provider/file-cache.js.map +1 -0
- package/dist/provider/file-source.d.ts +32 -0
- package/dist/provider/file-source.d.ts.map +1 -0
- package/dist/provider/file-source.js +180 -0
- package/dist/provider/file-source.js.map +1 -0
- package/dist/provider/google/factory.d.ts +107 -0
- package/dist/provider/google/factory.d.ts.map +1 -0
- package/dist/provider/google/factory.js +143 -0
- package/dist/provider/google/factory.js.map +1 -0
- package/dist/provider/google/file-manager.d.ts +14 -0
- package/dist/provider/google/file-manager.d.ts.map +1 -0
- package/dist/provider/google/file-manager.js +183 -0
- package/dist/provider/google/file-manager.js.map +1 -0
- package/dist/provider/google/index.d.ts +8 -0
- package/dist/provider/google/index.d.ts.map +1 -0
- package/dist/provider/google/index.js +10 -0
- package/dist/provider/google/index.js.map +1 -0
- package/dist/provider/hash.d.ts +3 -0
- package/dist/provider/hash.d.ts.map +1 -0
- package/dist/provider/hash.js +34 -0
- package/dist/provider/hash.js.map +1 -0
- package/dist/provider/index.d.ts +9 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +11 -0
- package/dist/provider/index.js.map +1 -0
- package/dist/provider/noop-file-manager.d.ts +9 -0
- package/dist/provider/noop-file-manager.d.ts.map +1 -0
- package/dist/provider/noop-file-manager.js +28 -0
- package/dist/provider/noop-file-manager.js.map +1 -0
- package/dist/provider/openai/factory.d.ts +67 -0
- package/dist/provider/openai/factory.d.ts.map +1 -0
- package/dist/provider/openai/factory.js +95 -0
- package/dist/provider/openai/factory.js.map +1 -0
- package/dist/provider/openai/index.d.ts +7 -0
- package/dist/provider/openai/index.d.ts.map +1 -0
- package/dist/provider/openai/index.js +7 -0
- package/dist/provider/openai/index.js.map +1 -0
- package/dist/provider/types.d.ts +105 -0
- package/dist/provider/types.d.ts.map +1 -0
- package/dist/provider/types.js +19 -0
- package/dist/provider/types.js.map +1 -0
- package/dist/session/index.d.ts +7 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +5 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/simple-session.d.ts +98 -0
- package/dist/session/simple-session.d.ts.map +1 -0
- package/dist/session/simple-session.js +299 -0
- package/dist/session/simple-session.js.map +1 -0
- package/dist/session/streaming-session.d.ts +90 -0
- package/dist/session/streaming-session.d.ts.map +1 -0
- package/dist/session/streaming-session.js +151 -0
- package/dist/session/streaming-session.js.map +1 -0
- package/dist/session/test-utils.d.ts +19 -0
- package/dist/session/test-utils.d.ts.map +1 -0
- package/dist/session/test-utils.js +65 -0
- package/dist/session/test-utils.js.map +1 -0
- package/dist/session/types.d.ts +219 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +181 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session/usage-extractors.d.ts +7 -0
- package/dist/session/usage-extractors.d.ts.map +1 -0
- package/dist/session/usage-extractors.js +71 -0
- package/dist/session/usage-extractors.js.map +1 -0
- package/dist/testing/fixtures.d.ts +34 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +65 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/helpers.d.ts +20 -0
- package/dist/testing/helpers.d.ts.map +1 -0
- package/dist/testing/helpers.js +32 -0
- package/dist/testing/helpers.js.map +1 -0
- package/dist/testing/index.d.ts +7 -519
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +21 -2123
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/mock-provider.d.ts +79 -0
- package/dist/testing/mock-provider.d.ts.map +1 -0
- package/dist/testing/mock-provider.js +152 -0
- package/dist/testing/mock-provider.js.map +1 -0
- package/dist/testing/mock.d.ts +29 -0
- package/dist/testing/mock.d.ts.map +1 -0
- package/dist/testing/mock.js +154 -0
- package/dist/testing/mock.js.map +1 -0
- package/dist/testing/test-execution.d.ts +14 -0
- package/dist/testing/test-execution.d.ts.map +1 -0
- package/dist/testing/test-execution.js +108 -0
- package/dist/testing/test-execution.js.map +1 -0
- package/dist/utils/deep-merge.d.ts +6 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +24 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/validation/errors.d.ts +28 -0
- package/dist/validation/errors.d.ts.map +1 -0
- package/dist/validation/errors.js +39 -0
- package/dist/validation/errors.js.map +1 -0
- package/dist/validation/index.d.ts +5 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +4 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/types.d.ts +49 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +2 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/validation-history.d.ts +12 -0
- package/dist/validation/validation-history.d.ts.map +1 -0
- package/dist/validation/validation-history.js +29 -0
- package/dist/validation/validation-history.js.map +1 -0
- package/dist/validation/with-validation.d.ts +38 -0
- package/dist/validation/with-validation.d.ts.map +1 -0
- package/dist/validation/with-validation.js +58 -0
- package/dist/validation/with-validation.js.map +1 -0
- package/package.json +72 -76
- package/dist/base-provider-2TTw5HAa.d.cts +0 -1254
- package/dist/base-provider-2TTw5HAa.d.ts +0 -1254
- package/dist/index.cjs +0 -3085
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -1506
- package/dist/testing/index.cjs +0 -2167
- package/dist/testing/index.cjs.map +0 -1
- package/dist/testing/index.d.cts +0 -520
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test helpers for execution module tests.
|
|
3
|
+
* Provides reusable utilities for abort scenarios, generator creation,
|
|
4
|
+
* and logger tracking.
|
|
5
|
+
*
|
|
6
|
+
* These helpers are framework-agnostic (no vitest/jest dependency).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Create an abort scenario for testing cancellation.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const { signal, abort, isAborted } = createAbortScenario();
|
|
14
|
+
* const execution = new SimpleExecutionHost(factory, fn, signal);
|
|
15
|
+
*
|
|
16
|
+
* abort('User canceled');
|
|
17
|
+
* expect(isAborted()).toBe(true);
|
|
18
|
+
*
|
|
19
|
+
* const result = await execution.result();
|
|
20
|
+
* expectCanceledResult(result);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export function createAbortScenario() {
|
|
24
|
+
const controller = new AbortController();
|
|
25
|
+
return {
|
|
26
|
+
controller,
|
|
27
|
+
signal: controller.signal,
|
|
28
|
+
abort: (reason) => controller.abort(reason),
|
|
29
|
+
isAborted: () => controller.signal.aborted,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create an already-aborted signal for testing pre-aborted scenarios.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const signal = createAlreadyAbortedSignal('Pre-aborted');
|
|
38
|
+
* const execution = new SimpleExecutionHost(factory, fn, signal);
|
|
39
|
+
*
|
|
40
|
+
* const result = await execution.result();
|
|
41
|
+
* expectCanceledResult(result);
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function createAlreadyAbortedSignal(reason = 'Already aborted') {
|
|
45
|
+
const controller = new AbortController();
|
|
46
|
+
controller.abort(reason);
|
|
47
|
+
return controller.signal;
|
|
48
|
+
}
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Generator Helpers (for StreamingExecutionHost)
|
|
51
|
+
// ============================================================================
|
|
52
|
+
/**
|
|
53
|
+
* Create a simple generator that emits specified events and returns the result.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* const generator = createSimpleGenerator('result-value', [
|
|
58
|
+
* { type: 'progress', message: 'step 1' },
|
|
59
|
+
* { type: 'progress', message: 'step 2' },
|
|
60
|
+
* ]);
|
|
61
|
+
* const execution = new StreamingExecutionHost(factory, generator);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function createSimpleGenerator(result, events = []) {
|
|
65
|
+
return async function* (session) {
|
|
66
|
+
for (const event of events) {
|
|
67
|
+
yield session.emit(event);
|
|
68
|
+
}
|
|
69
|
+
return session.done(result);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Create a generator that throws an error.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const generator = createErrorGenerator(new Error('Test error'));
|
|
78
|
+
* const execution = new StreamingExecutionHost(factory, generator);
|
|
79
|
+
*
|
|
80
|
+
* const result = await execution.result();
|
|
81
|
+
* expectFailedResult(result, 'Test error');
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export function createErrorGenerator(error, eventsBeforeError = []) {
|
|
85
|
+
return async function* (session) {
|
|
86
|
+
for (const event of eventsBeforeError) {
|
|
87
|
+
yield session.emit(event);
|
|
88
|
+
}
|
|
89
|
+
throw error;
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Create a generator that waits for cancellation using closure pattern.
|
|
94
|
+
* Uses the provided AbortScenario to detect when to abort.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const abortScenario = createAbortScenario();
|
|
99
|
+
* const onCancelCalled = vi.fn();
|
|
100
|
+
* const generator = createCancelableGenerator(abortScenario, onCancelCalled);
|
|
101
|
+
*
|
|
102
|
+
* const execution = new StreamingExecutionHost(factory, generator, abortScenario.signal);
|
|
103
|
+
* abortScenario.abort();
|
|
104
|
+
*
|
|
105
|
+
* const result = await execution.result();
|
|
106
|
+
* expectCanceledResult(result);
|
|
107
|
+
* expect(onCancelCalled).toHaveBeenCalled();
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export function createCancelableGenerator(abortScenario, onCancel, eventsBeforeWait = []) {
|
|
111
|
+
return async function* (session) {
|
|
112
|
+
for (const event of eventsBeforeWait) {
|
|
113
|
+
yield session.emit(event);
|
|
114
|
+
}
|
|
115
|
+
// Wait indefinitely, checking for abort via closure
|
|
116
|
+
await new Promise((_, reject) => {
|
|
117
|
+
const signal = abortScenario.signal;
|
|
118
|
+
if (signal.aborted) {
|
|
119
|
+
onCancel?.();
|
|
120
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
signal.addEventListener('abort', () => {
|
|
124
|
+
onCancel?.();
|
|
125
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a function that waits for cancellation using closure pattern.
|
|
132
|
+
* Uses the provided AbortScenario to detect when to abort.
|
|
133
|
+
* Equivalent of createCancelableGenerator for SimpleExecutionHost.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* const abortScenario = createAbortScenario();
|
|
138
|
+
* const onCancelCalled = vi.fn();
|
|
139
|
+
* const fn = createCancelableFunction(abortScenario, onCancelCalled);
|
|
140
|
+
*
|
|
141
|
+
* const execution = new SimpleExecutionHost(factory, fn, abortScenario.signal);
|
|
142
|
+
* abortScenario.abort();
|
|
143
|
+
*
|
|
144
|
+
* const result = await execution.result();
|
|
145
|
+
* expectCanceledResult(result);
|
|
146
|
+
* expect(onCancelCalled).toHaveBeenCalled();
|
|
147
|
+
* ```
|
|
148
|
+
*/
|
|
149
|
+
export function createCancelableFunction(abortScenario, onCancel) {
|
|
150
|
+
return async () => {
|
|
151
|
+
// Wait indefinitely, checking for abort via closure
|
|
152
|
+
await new Promise((_, reject) => {
|
|
153
|
+
const signal = abortScenario.signal;
|
|
154
|
+
if (signal.aborted) {
|
|
155
|
+
onCancel?.();
|
|
156
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
signal.addEventListener('abort', () => {
|
|
160
|
+
onCancel?.();
|
|
161
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
return 'should-not-reach';
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Create a generator with delay, useful for timing-related tests.
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const generator = createDelayedGenerator(100, 'result');
|
|
173
|
+
* const execution = new StreamingExecutionHost(factory, generator);
|
|
174
|
+
*
|
|
175
|
+
* // Cancel before delay completes
|
|
176
|
+
* setTimeout(() => execution.cancel(), 50);
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function createDelayedGenerator(delayMs, result, abortScenario) {
|
|
180
|
+
return async function* (session) {
|
|
181
|
+
await new Promise((resolve, reject) => {
|
|
182
|
+
const timeoutId = setTimeout(resolve, delayMs);
|
|
183
|
+
if (abortScenario) {
|
|
184
|
+
abortScenario.signal.addEventListener('abort', () => {
|
|
185
|
+
clearTimeout(timeoutId);
|
|
186
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
return session.done(result);
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// ============================================================================
|
|
194
|
+
// Race Condition & Concurrency Test Helpers
|
|
195
|
+
// ============================================================================
|
|
196
|
+
/**
|
|
197
|
+
* Create a generator that yields events with a configurable delay between each.
|
|
198
|
+
* Useful for race condition testing where timing control is needed.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* const generator = createSlowGenerator([
|
|
203
|
+
* { type: 'chunk', content: 'A' },
|
|
204
|
+
* { type: 'chunk', content: 'B' },
|
|
205
|
+
* ], 10);
|
|
206
|
+
* const execution = new StreamingExecutionHost(factory, generator);
|
|
207
|
+
*
|
|
208
|
+
* // Cancel mid-stream
|
|
209
|
+
* setTimeout(() => execution.cancel(), 15);
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
export function createSlowGenerator(events, delayBetweenEventsMs, abortScenario) {
|
|
213
|
+
return async function* (session) {
|
|
214
|
+
for (const event of events) {
|
|
215
|
+
// Check abort before each event
|
|
216
|
+
if (abortScenario?.isAborted()) {
|
|
217
|
+
throw new DOMException('Aborted', 'AbortError');
|
|
218
|
+
}
|
|
219
|
+
await new Promise((resolve, reject) => {
|
|
220
|
+
const timeoutId = setTimeout(resolve, delayBetweenEventsMs);
|
|
221
|
+
if (abortScenario) {
|
|
222
|
+
if (abortScenario.signal.aborted) {
|
|
223
|
+
clearTimeout(timeoutId);
|
|
224
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
abortScenario.signal.addEventListener('abort', () => {
|
|
228
|
+
clearTimeout(timeoutId);
|
|
229
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
230
|
+
}, { once: true });
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
yield session.emit(event);
|
|
234
|
+
}
|
|
235
|
+
return undefined;
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Collect all events from an async iterable stream.
|
|
240
|
+
* Useful for testing stream() output in race condition scenarios.
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* const events = await collectStreamAsync(execution.stream());
|
|
245
|
+
* expect(events).toHaveLength(3);
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export async function collectStreamAsync(stream) {
|
|
249
|
+
const collected = [];
|
|
250
|
+
for await (const event of stream) {
|
|
251
|
+
collected.push(event);
|
|
252
|
+
}
|
|
253
|
+
return collected;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a generator that never completes (infinite wait).
|
|
257
|
+
* Useful for testing cleanup and cancellation behavior.
|
|
258
|
+
*
|
|
259
|
+
* @example
|
|
260
|
+
* ```typescript
|
|
261
|
+
* const generator = createNeverEndingGenerator([
|
|
262
|
+
* { type: 'chunk', content: 'A' },
|
|
263
|
+
* ]);
|
|
264
|
+
* const execution = new StreamingExecutionHost(factory, generator);
|
|
265
|
+
*
|
|
266
|
+
* // Must cancel to complete
|
|
267
|
+
* execution.cancel();
|
|
268
|
+
* ```
|
|
269
|
+
*/
|
|
270
|
+
export function createNeverEndingGenerator(eventsBeforeWait = [], abortScenario) {
|
|
271
|
+
return async function* (session) {
|
|
272
|
+
for (const event of eventsBeforeWait) {
|
|
273
|
+
yield session.emit(event);
|
|
274
|
+
}
|
|
275
|
+
// Wait forever unless aborted
|
|
276
|
+
await new Promise((_, reject) => {
|
|
277
|
+
if (abortScenario) {
|
|
278
|
+
if (abortScenario.signal.aborted) {
|
|
279
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
abortScenario.signal.addEventListener('abort', () => reject(new DOMException('Aborted', 'AbortError')), { once: true });
|
|
283
|
+
}
|
|
284
|
+
// Without abort scenario, this promise never settles
|
|
285
|
+
});
|
|
286
|
+
return undefined;
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
// ============================================================================
|
|
290
|
+
// Logger Tracking Helpers (framework-agnostic)
|
|
291
|
+
// ============================================================================
|
|
292
|
+
/**
|
|
293
|
+
* Create a logger that tracks call order for sequence verification.
|
|
294
|
+
* This version is framework-agnostic (no vitest/jest dependency).
|
|
295
|
+
*
|
|
296
|
+
* @example
|
|
297
|
+
* ```typescript
|
|
298
|
+
* const { logger, getCallOrder } = createOrderTrackingLogger();
|
|
299
|
+
* // ... run execution with logger ...
|
|
300
|
+
*
|
|
301
|
+
* expect(getCallOrder()).toEqual(['start', 'emit', 'done']);
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
export function createOrderTrackingLogger() {
|
|
305
|
+
const callOrder = [];
|
|
306
|
+
const logger = {
|
|
307
|
+
onLLMCallStart: () => { },
|
|
308
|
+
onLLMCallEnd: () => { },
|
|
309
|
+
onExecutionStart: () => {
|
|
310
|
+
callOrder.push('start');
|
|
311
|
+
},
|
|
312
|
+
onExecutionEmit: () => {
|
|
313
|
+
callOrder.push('emit');
|
|
314
|
+
},
|
|
315
|
+
onExecutionDone: () => {
|
|
316
|
+
callOrder.push('done');
|
|
317
|
+
},
|
|
318
|
+
onExecutionError: () => {
|
|
319
|
+
callOrder.push('error');
|
|
320
|
+
},
|
|
321
|
+
};
|
|
322
|
+
return {
|
|
323
|
+
logger,
|
|
324
|
+
getCallOrder: () => [...callOrder],
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../src/execution/testing/helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA8BH;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,GAAkB;IACnD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,OAAO;QACL,UAAU;QACV,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,KAAK,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;QACpD,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO;KAC3C,CAAC;AAAA,CACH;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAM,GAAG,iBAAiB,EAAe;IAClF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACzB,OAAO,UAAU,CAAC,MAAM,CAAC;AAAA,CAC1B;AAED,+EAA+E;AAC/E,iDAAiD;AACjD,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CAGnC,MAA6B,EAC7B,MAAM,GAAkC,EAAE,EAI8D;IACxG,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,EAAE;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,CAC7B,CAAC;AAAA,CACH;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAGlC,KAAY,EACZ,iBAAiB,GAAkC,EAAE,EAGI;IACzD,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,EAAE;QAC/B,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;YACtC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,MAAM,KAAK,CAAC;IAAA,CACb,CAAC;AAAA,CACH;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,yBAAyB,CAGvC,aAA4B,EAC5B,QAAqB,EACrB,gBAAgB,GAAkC,EAAE,EAGI;IACxD,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,EAAE;QAC/B,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,oDAAoD;QACpD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YACpC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,QAAQ,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;gBACrC,QAAQ,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAAA,CACnD,CAAC,CAAC;QAAA,CACJ,CAAC,CAAC;IAAA,CACJ,CAAC;AAAA,CACH;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,wBAAwB,CACtC,aAA4B,EAC5B,QAAqB,EACyB;IAC9C,OAAO,KAAK,IAAI,EAAE,CAAC;QACjB,oDAAoD;QACpD,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;YACpC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,QAAQ,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;gBACrC,QAAQ,EAAE,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;YAAA,CACnD,CAAC,CAAC;QAAA,CACJ,CAAC,CAAC;QACH,OAAO,kBAAkB,CAAC;IAAA,CAC3B,CAAC;AAAA,CACH;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,sBAAsB,CAGpC,OAAe,EACf,MAA6B,EAC7B,aAA6B,EAI2E;IACxG,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,EAAE;QAC/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;oBACnD,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;gBAAA,CACnD,CAAC,CAAC;YACL,CAAC;QAAA,CACF,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,CAC7B,CAAC;AAAA,CACH;AAED,+EAA+E;AAC/E,4CAA4C;AAC5C,+EAA+E;AAE/E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,mBAAmB,CAGjC,MAAqC,EACrC,oBAA4B,EAC5B,aAA6B,EAGuD;IACpF,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,EAAE;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,gCAAgC;YAChC,IAAI,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC;gBAC/B,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;gBAC5D,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjC,YAAY,CAAC,SAAS,CAAC,CAAC;wBACxB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;wBAClD,OAAO;oBACT,CAAC;oBACD,aAAa,CAAC,MAAM,CAAC,gBAAgB,CACnC,OAAO,EACP,GAAG,EAAE,CAAC;wBACJ,YAAY,CAAC,SAAS,CAAC,CAAC;wBACxB,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;oBAAA,CACnD,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;gBACJ,CAAC;YAAA,CACF,CAAC,CAAC;YAEH,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,SAAS,CAAC;IAAA,CAClB,CAAC;AAAA,CACH;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAI,MAAwB,EAAgB;IAClF,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,0BAA0B,CAGxC,gBAAgB,GAAkC,EAAE,EACpD,aAA6B,EAGuD;IACpF,OAAO,KAAK,SAAS,CAAC,EAAE,OAAO,EAAE;QAC/B,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;YACrC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,8BAA8B;QAC9B,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;YACrC,IAAI,aAAa,EAAE,CAAC;gBAClB,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;oBAClD,OAAO;gBACT,CAAC;gBACD,aAAa,CAAC,MAAM,CAAC,gBAAgB,CACnC,OAAO,EACP,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,EACvD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;YACJ,CAAC;YACD,qDAAqD;QADpD,CAEF,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IAAA,CAClB,CAAC;AAAA,CACH;AAED,+EAA+E;AAC/E,+CAA+C;AAC/C,+EAA+E;AAE/E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,yBAAyB,GAGvC;IACA,MAAM,SAAS,GAAsB,EAAE,CAAC;IAExC,MAAM,MAAM,GAAW;QACrB,cAAc,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;QACxB,YAAY,EAAE,GAAG,EAAE,CAAC,EAAC,CAAC;QACtB,gBAAgB,EAAE,GAAG,EAAE,CAAC;YACtB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAA,CACzB;QACD,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAA,CACxB;QACD,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAAA,CACxB;QACD,gBAAgB,EAAE,GAAG,EAAE,CAAC;YACtB,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAA,CACzB;KACF,CAAC;IAEF,OAAO;QACL,MAAM;QACN,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC;KACnC,CAAC;AAAA,CACH"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration objects for ExecutionHost contract tests.
|
|
3
|
+
* Abstracts the differences between SimpleHost and StreamingHost
|
|
4
|
+
* to enable shared contract testing.
|
|
5
|
+
*/
|
|
6
|
+
import type { SessionStreamGeneratorFn } from '../types.js';
|
|
7
|
+
import { SimpleSession } from '../../session/simple-session.js';
|
|
8
|
+
import { StreamingSession } from '../../session/streaming-session.js';
|
|
9
|
+
import { TestEvent } from './fixtures.js';
|
|
10
|
+
import type { AbortScenario } from './helpers.js';
|
|
11
|
+
import type { Logger } from '../../observability/logger.js';
|
|
12
|
+
export type SimpleSessionFactory = (signal?: AbortSignal) => SimpleSession;
|
|
13
|
+
export type StreamingSessionFactory = (signal?: AbortSignal) => StreamingSession<TestEvent>;
|
|
14
|
+
export type SimpleWorkload = (session: SimpleSession) => Promise<unknown>;
|
|
15
|
+
export type StreamingWorkload = SessionStreamGeneratorFn<TestEvent>;
|
|
16
|
+
export interface ExecutionHost<TResult = string> {
|
|
17
|
+
result(): Promise<{
|
|
18
|
+
status: string;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
}>;
|
|
21
|
+
cancel(): void;
|
|
22
|
+
cleanup(): Promise<void>;
|
|
23
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Configuration for testing an ExecutionHost implementation.
|
|
27
|
+
* Abstracts the differences between SimpleHost and StreamingHost.
|
|
28
|
+
*/
|
|
29
|
+
export interface ExecutionHostTestConfig<TResult = string> {
|
|
30
|
+
/** Name of the host for test descriptions */
|
|
31
|
+
name: 'SimpleExecutionHost' | 'StreamingExecutionHost';
|
|
32
|
+
/** Create a host with given factory, workload, and optional signal */
|
|
33
|
+
createHost: (factory: SimpleSessionFactory | StreamingSessionFactory, workload: SimpleWorkload | StreamingWorkload, signal?: AbortSignal) => ExecutionHost<TResult>;
|
|
34
|
+
/** Create a session factory with optional logger */
|
|
35
|
+
createSessionFactory: (logger?: Logger) => SimpleSessionFactory | StreamingSessionFactory;
|
|
36
|
+
/** Create a session factory spy for signal verification */
|
|
37
|
+
createSessionFactorySpy: () => {
|
|
38
|
+
factory: SimpleSessionFactory | StreamingSessionFactory;
|
|
39
|
+
getPassedSignal: () => AbortSignal | undefined;
|
|
40
|
+
};
|
|
41
|
+
/** Create a workload that succeeds with the given result */
|
|
42
|
+
createSuccessWorkload: (result: TResult) => SimpleWorkload | StreamingWorkload;
|
|
43
|
+
/** Create a workload that fails with the given error */
|
|
44
|
+
createErrorWorkload: (error: Error) => SimpleWorkload | StreamingWorkload;
|
|
45
|
+
/** Create a workload that waits for cancellation via closure pattern */
|
|
46
|
+
createCancelableWorkload: (abortScenario: AbortScenario, onCancel?: () => void) => SimpleWorkload | StreamingWorkload;
|
|
47
|
+
/** Create a workload that registers onDone hooks */
|
|
48
|
+
createHookWorkload: (hook: () => void, options?: {
|
|
49
|
+
shouldFail?: boolean;
|
|
50
|
+
}) => SimpleWorkload | StreamingWorkload;
|
|
51
|
+
}
|
|
52
|
+
export declare const simpleHostConfig: ExecutionHostTestConfig<string>;
|
|
53
|
+
export declare const streamingHostConfig: ExecutionHostTestConfig<string>;
|
|
54
|
+
/** All host configurations for parameterized testing */
|
|
55
|
+
export declare const allHostConfigs: readonly [ExecutionHostTestConfig<string>, ExecutionHostTestConfig<string>];
|
|
56
|
+
//# sourceMappingURL=host-configs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-configs.d.ts","sourceRoot":"","sources":["../../../src/execution/testing/host-configs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAEL,SAAS,EAGV,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAM5D,MAAM,MAAM,oBAAoB,GAAG,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,aAAa,CAAC;AAC3E,MAAM,MAAM,uBAAuB,GAAG,CACpC,MAAM,CAAC,EAAE,WAAW,KACjB,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAEjC,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1E,MAAM,MAAM,iBAAiB,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;AAEpE,MAAM,WAAW,aAAa,CAAC,OAAO,GAAG,MAAM;IAC7C,MAAM,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,IAAI,CAAC;IACf,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxC;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB,CAAC,OAAO,GAAG,MAAM;IACvD,6CAA6C;IAC7C,IAAI,EAAE,qBAAqB,GAAG,wBAAwB,CAAC;IAEvD,sEAAsE;IACtE,UAAU,EAAE,CACV,OAAO,EAAE,oBAAoB,GAAG,uBAAuB,EACvD,QAAQ,EAAE,cAAc,GAAG,iBAAiB,EAC5C,MAAM,CAAC,EAAE,WAAW,KACjB,aAAa,CAAC,OAAO,CAAC,CAAC;IAE5B,oDAAoD;IACpD,oBAAoB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,oBAAoB,GAAG,uBAAuB,CAAC;IAE1F,2DAA2D;IAC3D,uBAAuB,EAAE,MAAM;QAC7B,OAAO,EAAE,oBAAoB,GAAG,uBAAuB,CAAC;QACxD,eAAe,EAAE,MAAM,WAAW,GAAG,SAAS,CAAC;KAChD,CAAC;IAEF,4DAA4D;IAC5D,qBAAqB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,cAAc,GAAG,iBAAiB,CAAC;IAE/E,wDAAwD;IACxD,mBAAmB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,cAAc,GAAG,iBAAiB,CAAC;IAE1E,wEAAwE;IACxE,wBAAwB,EAAE,CACxB,aAAa,EAAE,aAAa,EAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,KAClB,cAAc,GAAG,iBAAiB,CAAC;IAExC,oDAAoD;IACpD,kBAAkB,EAAE,CAClB,IAAI,EAAE,MAAM,IAAI,EAChB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,KAC/B,cAAc,GAAG,iBAAiB,CAAC;CACzC;AAMD,eAAO,MAAM,gBAAgB,EAAE,uBAAuB,CAAC,MAAM,CA0E5D,CAAC;AAMF,eAAO,MAAM,mBAAmB,EAAE,uBAAuB,CAAC,MAAM,CAiF/D,CAAC;AAMF,wDAAwD;AACxD,eAAO,MAAM,cAAc,6EAAmD,CAAC"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration objects for ExecutionHost contract tests.
|
|
3
|
+
* Abstracts the differences between SimpleHost and StreamingHost
|
|
4
|
+
* to enable shared contract testing.
|
|
5
|
+
*/
|
|
6
|
+
import { vi } from 'vitest';
|
|
7
|
+
import { SimpleExecutionHost } from '../simple-host.js';
|
|
8
|
+
import { StreamingExecutionHost } from '../streaming-host.js';
|
|
9
|
+
import { SimpleSession } from '../../session/simple-session.js';
|
|
10
|
+
import { StreamingSession } from '../../session/streaming-session.js';
|
|
11
|
+
import { TEST_PROVIDER_TYPE, createMockModel, createMockFileManager, } from './fixtures.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// SimpleHost Configuration
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export const simpleHostConfig = {
|
|
16
|
+
name: 'SimpleExecutionHost',
|
|
17
|
+
createHost(factory, workload, signal) {
|
|
18
|
+
return new SimpleExecutionHost(factory, workload, signal);
|
|
19
|
+
},
|
|
20
|
+
createSessionFactory(logger) {
|
|
21
|
+
return (signal) => new SimpleSession({
|
|
22
|
+
defaultLanguageModel: createMockModel(),
|
|
23
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
24
|
+
fileManager: createMockFileManager(),
|
|
25
|
+
signal,
|
|
26
|
+
logger,
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
createSessionFactorySpy() {
|
|
30
|
+
let passedSignal;
|
|
31
|
+
const factory = vi.fn().mockImplementation((signal) => {
|
|
32
|
+
passedSignal = signal;
|
|
33
|
+
return new SimpleSession({
|
|
34
|
+
defaultLanguageModel: createMockModel(),
|
|
35
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
36
|
+
fileManager: createMockFileManager(),
|
|
37
|
+
signal,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
factory,
|
|
42
|
+
getPassedSignal: () => passedSignal,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
createSuccessWorkload(result) {
|
|
46
|
+
return vi.fn().mockResolvedValue(result);
|
|
47
|
+
},
|
|
48
|
+
createErrorWorkload(error) {
|
|
49
|
+
return vi.fn().mockRejectedValue(error);
|
|
50
|
+
},
|
|
51
|
+
createCancelableWorkload(abortScenario, onCancel) {
|
|
52
|
+
return async () => {
|
|
53
|
+
await new Promise((_, reject) => {
|
|
54
|
+
const signal = abortScenario.signal;
|
|
55
|
+
if (signal.aborted) {
|
|
56
|
+
onCancel?.();
|
|
57
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
signal.addEventListener('abort', () => {
|
|
61
|
+
onCancel?.();
|
|
62
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
return 'should-not-reach';
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
createHookWorkload(hook, options) {
|
|
69
|
+
return async (session) => {
|
|
70
|
+
session.onDone(hook);
|
|
71
|
+
if (options?.shouldFail) {
|
|
72
|
+
throw new Error('Intentional failure');
|
|
73
|
+
}
|
|
74
|
+
return 'result';
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
// ============================================================================
|
|
79
|
+
// StreamingHost Configuration
|
|
80
|
+
// ============================================================================
|
|
81
|
+
export const streamingHostConfig = {
|
|
82
|
+
name: 'StreamingExecutionHost',
|
|
83
|
+
createHost(factory, workload, signal) {
|
|
84
|
+
return new StreamingExecutionHost(factory, workload, signal);
|
|
85
|
+
},
|
|
86
|
+
createSessionFactory(logger) {
|
|
87
|
+
return (signal) => new StreamingSession({
|
|
88
|
+
defaultLanguageModel: createMockModel(),
|
|
89
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
90
|
+
fileManager: createMockFileManager(),
|
|
91
|
+
signal,
|
|
92
|
+
logger,
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
createSessionFactorySpy() {
|
|
96
|
+
let passedSignal;
|
|
97
|
+
const factory = vi.fn().mockImplementation((signal) => {
|
|
98
|
+
passedSignal = signal;
|
|
99
|
+
return new StreamingSession({
|
|
100
|
+
defaultLanguageModel: createMockModel(),
|
|
101
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
102
|
+
fileManager: createMockFileManager(),
|
|
103
|
+
signal,
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
return {
|
|
107
|
+
factory,
|
|
108
|
+
getPassedSignal: () => passedSignal,
|
|
109
|
+
};
|
|
110
|
+
},
|
|
111
|
+
createSuccessWorkload(result) {
|
|
112
|
+
return async function* (session) {
|
|
113
|
+
return session.done(result);
|
|
114
|
+
};
|
|
115
|
+
},
|
|
116
|
+
createErrorWorkload(error) {
|
|
117
|
+
return async function* () {
|
|
118
|
+
throw error;
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
createCancelableWorkload(abortScenario, onCancel) {
|
|
122
|
+
return async function* (session) {
|
|
123
|
+
yield session.emit({ type: 'start' });
|
|
124
|
+
await new Promise((_, reject) => {
|
|
125
|
+
const signal = abortScenario.signal;
|
|
126
|
+
if (signal.aborted) {
|
|
127
|
+
onCancel?.();
|
|
128
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
signal.addEventListener('abort', () => {
|
|
132
|
+
onCancel?.();
|
|
133
|
+
reject(new DOMException('Aborted', 'AbortError'));
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
return session.done('should-not-reach');
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
createHookWorkload(hook, options) {
|
|
140
|
+
return async function* (session) {
|
|
141
|
+
session.onDone(hook);
|
|
142
|
+
if (options?.shouldFail) {
|
|
143
|
+
throw new Error('Intentional failure');
|
|
144
|
+
}
|
|
145
|
+
return session.done('result');
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
// ============================================================================
|
|
150
|
+
// Exports
|
|
151
|
+
// ============================================================================
|
|
152
|
+
/** All host configurations for parameterized testing */
|
|
153
|
+
export const allHostConfigs = [simpleHostConfig, streamingHostConfig];
|
|
154
|
+
//# sourceMappingURL=host-configs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-configs.js","sourceRoot":"","sources":["../../../src/execution/testing/host-configs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vitest-specific assertion helpers for execution module tests.
|
|
3
|
+
* These helpers depend on vitest and should only be used in internal tests.
|
|
4
|
+
*/
|
|
5
|
+
import { vi } from 'vitest';
|
|
6
|
+
import type { ExecutionResult, StreamingResult } from '../types.js';
|
|
7
|
+
import type { Logger } from '../../observability/logger.js';
|
|
8
|
+
export type MockLogger = Logger & {
|
|
9
|
+
onLLMCallStart: ReturnType<typeof vi.fn>;
|
|
10
|
+
onLLMCallEnd: ReturnType<typeof vi.fn>;
|
|
11
|
+
onExecutionStart: ReturnType<typeof vi.fn>;
|
|
12
|
+
onExecutionEmit: ReturnType<typeof vi.fn>;
|
|
13
|
+
onExecutionDone: ReturnType<typeof vi.fn>;
|
|
14
|
+
onExecutionError: ReturnType<typeof vi.fn>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Assert that an execution result is successful and optionally check the value.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const result = await execution.result();
|
|
22
|
+
* expectSuccessResult(result, 'expected-value');
|
|
23
|
+
* // result is now narrowed to succeeded type
|
|
24
|
+
* console.log(result.value);
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare function expectSuccessResult<T>(result: ExecutionResult<T>, expectedValue?: T): asserts result is Extract<ExecutionResult<T>, {
|
|
28
|
+
status: 'succeeded';
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Assert that an execution result is failed and optionally check the error.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* const result = await execution.result();
|
|
36
|
+
* expectFailedResult(result, 'Expected error message');
|
|
37
|
+
* // or with regex
|
|
38
|
+
* expectFailedResult(result, /timeout/i);
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function expectFailedResult<T>(result: ExecutionResult<T>, errorMatcher?: string | RegExp | Error): asserts result is Extract<ExecutionResult<T>, {
|
|
42
|
+
status: 'failed';
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Assert that an execution result is canceled.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* const result = await execution.result();
|
|
50
|
+
* expectCanceledResult(result);
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function expectCanceledResult<T>(result: ExecutionResult<T>): asserts result is Extract<ExecutionResult<T>, {
|
|
54
|
+
status: 'canceled';
|
|
55
|
+
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Assert streaming result status and optionally check events count.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```typescript
|
|
61
|
+
* const result = await execution.result();
|
|
62
|
+
* expectStreamingSuccessResult(result, 'value', 3);
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function expectStreamingSuccessResult<TEvent, T>(result: StreamingResult<TEvent, T>, expectedValue?: T, expectedEventCount?: number): asserts result is Extract<StreamingResult<TEvent, T>, {
|
|
66
|
+
status: 'succeeded';
|
|
67
|
+
}>;
|
|
68
|
+
type LoggerEventType = 'start' | 'emit' | 'done' | 'error';
|
|
69
|
+
/**
|
|
70
|
+
* Verify that logger was called in the expected sequence.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const logger = createMockLogger();
|
|
75
|
+
* // ... run execution ...
|
|
76
|
+
*
|
|
77
|
+
* verifyLoggerSequence(logger, ['start', 'emit', 'emit', 'done']);
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function verifyLoggerSequence(logger: MockLogger, expectedSequence: LoggerEventType[]): void;
|
|
81
|
+
/**
|
|
82
|
+
* Create a vitest mock logger.
|
|
83
|
+
*/
|
|
84
|
+
export declare function createVitestMockLogger(): MockLogger;
|
|
85
|
+
/**
|
|
86
|
+
* @deprecated Use createVitestMockLogger instead
|
|
87
|
+
*/
|
|
88
|
+
export declare const createMockLogger: typeof createVitestMockLogger;
|
|
89
|
+
/**
|
|
90
|
+
* Get vitest's vi.fn for use with framework-agnostic fixtures.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* import { vitestMockFn } from './vitest-assertions';
|
|
95
|
+
* import { createStreamingSessionFactory } from './fixtures';
|
|
96
|
+
*
|
|
97
|
+
* const factory = createStreamingSessionFactory({ mockFn: vitestMockFn });
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export declare const vitestMockFn: () => (...args: unknown[]) => unknown;
|
|
101
|
+
export {};
|
|
102
|
+
//# sourceMappingURL=vitest-assertions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest-assertions.d.ts","sourceRoot":"","sources":["../../../src/execution/testing/vitest-assertions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,EAAE,EAAU,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AAM5D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAChC,cAAc,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACzC,YAAY,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACvC,gBAAgB,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3C,eAAe,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,eAAe,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1C,gBAAgB,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;CAC5C,CAAC;AAMF;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EACnC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,aAAa,CAAC,EAAE,CAAC,GAChB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAQxE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GACrC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAC,CAcrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE,CAAC,CAEvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,CAAC,EACpD,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,EAClC,aAAa,CAAC,EAAE,CAAC,EACjB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAKhF;AAMD,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,gBAAgB,EAAE,eAAe,EAAE,GAClC,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,UAAU,CASnD;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,+BAAyB,CAAC;AAEvD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAuB,CAAC"}
|