@agtlantis/core 0.5.0 → 0.6.0
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/README.md +18 -5
- 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 +116 -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 +174 -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-file-manager.d.ts +14 -0
- package/dist/provider/base-file-manager.d.ts.map +1 -0
- package/dist/provider/base-file-manager.js +91 -0
- package/dist/provider/base-file-manager.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/file-utils.d.ts +5 -0
- package/dist/provider/file-utils.d.ts.map +1 -0
- package/dist/provider/file-utils.js +15 -0
- package/dist/provider/file-utils.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 +10 -0
- package/dist/provider/google/file-manager.d.ts.map +1 -0
- package/dist/provider/google/file-manager.js +93 -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 +10 -0
- package/dist/provider/index.d.ts.map +1 -0
- package/dist/provider/index.js +12 -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 +100 -0
- package/dist/provider/openai/factory.js.map +1 -0
- package/dist/provider/openai/file-manager.d.ts +17 -0
- package/dist/provider/openai/file-manager.d.ts.map +1 -0
- package/dist/provider/openai/file-manager.js +108 -0
- package/dist/provider/openai/file-manager.js.map +1 -0
- package/dist/provider/openai/index.d.ts +8 -0
- package/dist/provider/openai/index.d.ts.map +1 -0
- package/dist/provider/openai/index.js +8 -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 +38 -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 +71 -75
- 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,276 @@
|
|
|
1
|
+
import { ERRORS } from './constants.js';
|
|
2
|
+
import { combineSignals, Deferred } from './utils.js';
|
|
3
|
+
import { isAbortError, normalizeError, createHookRunner } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* Streaming execution host that uses StreamingSession.
|
|
6
|
+
* Starts execution eagerly on construction - events are buffered automatically.
|
|
7
|
+
*
|
|
8
|
+
* @typeParam TEvent - User's pure domain event type with required `type` field (metrics added automatically)
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const execution = new StreamingExecutionHost(
|
|
13
|
+
* () => new StreamingSession({
|
|
14
|
+
* defaultLanguageModel: provider.model,
|
|
15
|
+
* fileManager: new GoogleFileManager(apiKey),
|
|
16
|
+
* }),
|
|
17
|
+
* async function* (session) {
|
|
18
|
+
* session.onDone(() => session.fileManager.clear());
|
|
19
|
+
* const result = await session.generateText({ prompt: 'Hello' });
|
|
20
|
+
* yield session.emit({ type: 'progress', message: 'Working...' });
|
|
21
|
+
* return session.done(result.text);
|
|
22
|
+
* }
|
|
23
|
+
* );
|
|
24
|
+
* // ↑ Execution already started, events being buffered
|
|
25
|
+
*
|
|
26
|
+
* // Option 1: Stream events (buffered + real-time)
|
|
27
|
+
* for await (const event of execution.stream()) {
|
|
28
|
+
* console.log(event.type, event.metrics.elapsedMs);
|
|
29
|
+
* }
|
|
30
|
+
* const result = await execution.result();
|
|
31
|
+
*
|
|
32
|
+
* // Option 2: Skip streaming, events available in result
|
|
33
|
+
* const result = await execution.result();
|
|
34
|
+
* console.log(`Received ${result.events.length} events`);
|
|
35
|
+
*
|
|
36
|
+
* if (result.status === 'succeeded') {
|
|
37
|
+
* console.log(result.value);
|
|
38
|
+
* }
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export class StreamingExecutionHost {
|
|
42
|
+
createSession;
|
|
43
|
+
generator;
|
|
44
|
+
abortController = new AbortController();
|
|
45
|
+
effectiveSignal;
|
|
46
|
+
consumerPromise;
|
|
47
|
+
eventBuffer = [];
|
|
48
|
+
subscribers = new Set();
|
|
49
|
+
completed = false;
|
|
50
|
+
cleaned = false;
|
|
51
|
+
hookRunner = null;
|
|
52
|
+
cancelRequested = false;
|
|
53
|
+
extractedOutcome = null;
|
|
54
|
+
extractedSummary = null;
|
|
55
|
+
constructor(createSession, generator, userSignal) {
|
|
56
|
+
this.createSession = createSession;
|
|
57
|
+
this.generator = generator;
|
|
58
|
+
// Combine user signal with internal controller for dual cancellation support
|
|
59
|
+
this.effectiveSignal = userSignal
|
|
60
|
+
? combineSignals(userSignal, this.abortController.signal)
|
|
61
|
+
: this.abortController.signal;
|
|
62
|
+
// Eager start! Begin consuming immediately
|
|
63
|
+
this.consumerPromise = this.startConsuming();
|
|
64
|
+
}
|
|
65
|
+
hasDataField(event) {
|
|
66
|
+
return 'data' in event && event.data !== undefined;
|
|
67
|
+
}
|
|
68
|
+
hasSummaryField(event) {
|
|
69
|
+
return 'summary' in event && event.summary !== undefined;
|
|
70
|
+
}
|
|
71
|
+
hasErrorField(event) {
|
|
72
|
+
return 'error' in event && event.error instanceof Error;
|
|
73
|
+
}
|
|
74
|
+
extractResultAndMetadata(event) {
|
|
75
|
+
const isCompleteOrError = event.type === 'complete' || event.type === 'error';
|
|
76
|
+
if (!isCompleteOrError) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
// Extract outcome (error takes precedence if both present)
|
|
80
|
+
if (this.hasErrorField(event)) {
|
|
81
|
+
this.extractedOutcome = { type: 'error', error: event.error };
|
|
82
|
+
}
|
|
83
|
+
else if (this.hasDataField(event)) {
|
|
84
|
+
this.extractedOutcome = { type: 'result', value: event.data };
|
|
85
|
+
}
|
|
86
|
+
if (this.hasSummaryField(event)) {
|
|
87
|
+
this.extractedSummary = event.summary;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
notifySubscribers(event) {
|
|
91
|
+
this.subscribers.forEach(fn => fn(event));
|
|
92
|
+
}
|
|
93
|
+
async startConsuming() {
|
|
94
|
+
// Pass the effective signal to session for AI SDK cancellation
|
|
95
|
+
const session = this.createSession(this.effectiveSignal);
|
|
96
|
+
this.hookRunner = createHookRunner(() => session.runOnDoneHooks());
|
|
97
|
+
const gen = this.generator(session);
|
|
98
|
+
try {
|
|
99
|
+
let next = await gen.next();
|
|
100
|
+
while (!next.done) {
|
|
101
|
+
// Buffer and notify
|
|
102
|
+
this.eventBuffer.push(next.value);
|
|
103
|
+
this.notifySubscribers(next.value);
|
|
104
|
+
// Auto-abort after terminal events to prevent further AI calls
|
|
105
|
+
const isTerminal = next.value.type === 'complete' || next.value.type === 'error';
|
|
106
|
+
if (isTerminal) {
|
|
107
|
+
this.extractResultAndMetadata(next.value);
|
|
108
|
+
this.abortController.abort();
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
if (this.abortController.signal.aborted) {
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
next = await gen.next();
|
|
115
|
+
}
|
|
116
|
+
// Handle return value from generator
|
|
117
|
+
if (next.done && next.value !== undefined) {
|
|
118
|
+
const finalEvent = await Promise.resolve(next.value);
|
|
119
|
+
this.eventBuffer.push(finalEvent);
|
|
120
|
+
this.notifySubscribers(finalEvent);
|
|
121
|
+
this.extractResultAndMetadata(finalEvent);
|
|
122
|
+
// Auto-abort after terminal event from return statement
|
|
123
|
+
const isTerminal = finalEvent.type === 'complete' || finalEvent.type === 'error';
|
|
124
|
+
if (isTerminal) {
|
|
125
|
+
this.abortController.abort();
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return this.buildResult(session);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const errorObj = normalizeError(error);
|
|
132
|
+
// AbortError is treated as normal cancellation
|
|
133
|
+
if (isAbortError(error, this.abortController.signal)) {
|
|
134
|
+
return {
|
|
135
|
+
success: false,
|
|
136
|
+
aborted: true,
|
|
137
|
+
error: errorObj,
|
|
138
|
+
summary: await session.getSummary(),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Generate error event via session.fail()
|
|
142
|
+
const errorEvent = await session.fail(errorObj);
|
|
143
|
+
this.eventBuffer.push(errorEvent);
|
|
144
|
+
this.notifySubscribers(errorEvent);
|
|
145
|
+
this.extractResultAndMetadata(errorEvent);
|
|
146
|
+
// Auto-abort after error event
|
|
147
|
+
this.abortController.abort();
|
|
148
|
+
return this.buildResult(session);
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
this.completed = true;
|
|
152
|
+
// Note: Don't clear subscribers here - each stream() consumer
|
|
153
|
+
// cleans up its own subscriber in its finally block to avoid orphaning
|
|
154
|
+
await this.hookRunner?.ensureRun();
|
|
155
|
+
await gen.return(undefined);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async buildResult(session) {
|
|
159
|
+
const summary = this.extractedSummary ?? await session.getSummary();
|
|
160
|
+
// Use discriminated union for clean pattern matching
|
|
161
|
+
if (this.extractedOutcome?.type === 'error') {
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
aborted: false,
|
|
165
|
+
error: this.extractedOutcome.error,
|
|
166
|
+
summary,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (this.extractedOutcome?.type === 'result') {
|
|
170
|
+
return {
|
|
171
|
+
success: true,
|
|
172
|
+
result: this.extractedOutcome.value,
|
|
173
|
+
summary,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
// No result extracted - likely canceled or abnormal termination
|
|
177
|
+
return {
|
|
178
|
+
success: false,
|
|
179
|
+
aborted: true,
|
|
180
|
+
error: new Error(ERRORS.NO_RESULT),
|
|
181
|
+
summary,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Get the event stream.
|
|
186
|
+
* Returns buffered events first, then real-time events.
|
|
187
|
+
* Can be called multiple times - replays buffer each time.
|
|
188
|
+
*/
|
|
189
|
+
async *stream() {
|
|
190
|
+
// 1. Yield buffered events first
|
|
191
|
+
let index = 0;
|
|
192
|
+
while (index < this.eventBuffer.length) {
|
|
193
|
+
yield this.eventBuffer[index++];
|
|
194
|
+
}
|
|
195
|
+
// 2. If completed, we're done
|
|
196
|
+
if (this.completed) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// 3. Subscribe for real-time events using Deferred for clean async coordination
|
|
200
|
+
const queue = [];
|
|
201
|
+
let pending = new Deferred();
|
|
202
|
+
const subscriber = (event) => {
|
|
203
|
+
queue.push(event);
|
|
204
|
+
pending.resolve();
|
|
205
|
+
};
|
|
206
|
+
this.subscribers.add(subscriber);
|
|
207
|
+
try {
|
|
208
|
+
while (!this.completed || queue.length > 0) {
|
|
209
|
+
if (queue.length > 0) {
|
|
210
|
+
yield queue.shift();
|
|
211
|
+
}
|
|
212
|
+
else if (!this.completed) {
|
|
213
|
+
await pending.promise;
|
|
214
|
+
pending = new Deferred(); // Reset for next wait
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
finally {
|
|
219
|
+
this.subscribers.delete(subscriber);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
cancel() {
|
|
223
|
+
this.cancelRequested = true;
|
|
224
|
+
this.abortController.abort();
|
|
225
|
+
}
|
|
226
|
+
async cleanup() {
|
|
227
|
+
if (this.cleaned) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this.cleaned = true;
|
|
231
|
+
// Cancel if still running
|
|
232
|
+
if (!this.completed) {
|
|
233
|
+
this.cancel();
|
|
234
|
+
await this.consumerPromise.catch(() => { });
|
|
235
|
+
}
|
|
236
|
+
// Clean up resources
|
|
237
|
+
this.subscribers.clear();
|
|
238
|
+
await this.hookRunner?.ensureRun();
|
|
239
|
+
}
|
|
240
|
+
async [Symbol.asyncDispose]() {
|
|
241
|
+
await this.cleanup();
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Get the execution result with status, summary, and all events.
|
|
245
|
+
* Never throws - returns a discriminated union with status.
|
|
246
|
+
*/
|
|
247
|
+
async result() {
|
|
248
|
+
const internal = await this.consumerPromise;
|
|
249
|
+
const events = Object.freeze([...this.eventBuffer]);
|
|
250
|
+
// Success state
|
|
251
|
+
if (internal.success) {
|
|
252
|
+
return {
|
|
253
|
+
status: 'succeeded',
|
|
254
|
+
value: internal.result,
|
|
255
|
+
summary: internal.summary,
|
|
256
|
+
events,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
// Canceled state
|
|
260
|
+
if (this.cancelRequested || internal.aborted) {
|
|
261
|
+
return {
|
|
262
|
+
status: 'canceled',
|
|
263
|
+
summary: internal.summary,
|
|
264
|
+
events,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
// Failed state
|
|
268
|
+
return {
|
|
269
|
+
status: 'failed',
|
|
270
|
+
error: internal.error,
|
|
271
|
+
summary: internal.summary,
|
|
272
|
+
events,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=streaming-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-host.js","sourceRoot":"","sources":["../../src/execution/streaming-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test fixtures for execution module tests.
|
|
3
|
+
* Provides mock factories and session factories for testing.
|
|
4
|
+
*
|
|
5
|
+
* These fixtures are framework-agnostic (no vitest/jest dependency).
|
|
6
|
+
* Pass your own mock function (vi.fn, jest.fn, etc.) or use the noop default.
|
|
7
|
+
*/
|
|
8
|
+
import type { LanguageModel, LanguageModelUsage } from 'ai';
|
|
9
|
+
import type { CompletionEvent } from '../types.js';
|
|
10
|
+
import type { FileManager } from '../../provider/types.js';
|
|
11
|
+
import type { Logger } from '../../observability/logger.js';
|
|
12
|
+
import { SimpleSession } from '../../session/simple-session.js';
|
|
13
|
+
import { StreamingSession } from '../../session/streaming-session.js';
|
|
14
|
+
export type MockFn = (...args: unknown[]) => unknown;
|
|
15
|
+
export type MockFnFactory = () => MockFn;
|
|
16
|
+
export declare const TEST_PROVIDER_TYPE: 'google';
|
|
17
|
+
/**
|
|
18
|
+
* Base test event — the domain event users emit via session.emit().
|
|
19
|
+
*/
|
|
20
|
+
export interface TestBaseEvent {
|
|
21
|
+
type: string;
|
|
22
|
+
message?: string;
|
|
23
|
+
data?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Full test event union including CompletionEvent.
|
|
27
|
+
* ExtractResult<TestEvent> = string, EmittableEventInput<TestEvent> = TestBaseEvent.
|
|
28
|
+
*/
|
|
29
|
+
export type TestEvent = TestBaseEvent | CompletionEvent<string>;
|
|
30
|
+
export interface CreateMockModelOptions {
|
|
31
|
+
mockFn?: MockFnFactory;
|
|
32
|
+
}
|
|
33
|
+
export declare function createMockModel(options?: CreateMockModelOptions): LanguageModel;
|
|
34
|
+
export interface CreateMockFileManagerOptions {
|
|
35
|
+
mockFn?: MockFnFactory;
|
|
36
|
+
}
|
|
37
|
+
export declare function createMockFileManager(options?: CreateMockFileManagerOptions): FileManager;
|
|
38
|
+
export interface CreateMockLoggerOptions {
|
|
39
|
+
mockFn?: MockFnFactory;
|
|
40
|
+
}
|
|
41
|
+
export declare function createMockLogger(options?: CreateMockLoggerOptions): Logger;
|
|
42
|
+
export declare function createMockUsage(overrides?: Partial<LanguageModelUsage>): LanguageModelUsage;
|
|
43
|
+
export interface CreateSessionFactoryOptions {
|
|
44
|
+
mockFn?: MockFnFactory;
|
|
45
|
+
logger?: Logger;
|
|
46
|
+
}
|
|
47
|
+
export declare function createSimpleSessionFactory(options?: CreateSessionFactoryOptions): (signal?: AbortSignal) => SimpleSession;
|
|
48
|
+
export declare function createStreamingSessionFactory<TEvent extends {
|
|
49
|
+
type: string;
|
|
50
|
+
} = TestEvent>(options?: CreateSessionFactoryOptions): () => StreamingSession<TEvent>;
|
|
51
|
+
export interface CreateStreamingSessionFactoryWithSignalOptions extends CreateSessionFactoryOptions {
|
|
52
|
+
onSignalCapture?: (signal: AbortSignal | undefined) => void;
|
|
53
|
+
}
|
|
54
|
+
export declare function createStreamingSessionFactoryWithSignal<TEvent extends {
|
|
55
|
+
type: string;
|
|
56
|
+
} = TestEvent>(options?: CreateStreamingSessionFactoryWithSignalOptions): (signal?: AbortSignal) => StreamingSession<TEvent>;
|
|
57
|
+
export declare function collectEvents<T>(stream: AsyncIterable<T>): Promise<T[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Creates a controllable promise for testing async flows
|
|
60
|
+
*/
|
|
61
|
+
export declare function createControllablePromise<T = void>(): {
|
|
62
|
+
promise: Promise<T>;
|
|
63
|
+
resolve: (value: T) => void;
|
|
64
|
+
reject: (error: Error) => void;
|
|
65
|
+
};
|
|
66
|
+
export { createAbortScenario, createAlreadyAbortedSignal, type AbortScenario, createSimpleGenerator, createErrorGenerator, createCancelableGenerator, createCancelableFunction, createDelayedGenerator, createSlowGenerator, collectStreamAsync, createNeverEndingGenerator, createOrderTrackingLogger, type LoggerEventType, } from './helpers.js';
|
|
67
|
+
//# sourceMappingURL=fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../../src/execution/testing/fixtures.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test fixtures for execution module tests.
|
|
3
|
+
* Provides mock factories and session factories for testing.
|
|
4
|
+
*
|
|
5
|
+
* These fixtures are framework-agnostic (no vitest/jest dependency).
|
|
6
|
+
* Pass your own mock function (vi.fn, jest.fn, etc.) or use the noop default.
|
|
7
|
+
*/
|
|
8
|
+
import { SimpleSession } from '../../session/simple-session.js';
|
|
9
|
+
import { StreamingSession } from '../../session/streaming-session.js';
|
|
10
|
+
export const TEST_PROVIDER_TYPE = 'google';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// Default noop mock factory
|
|
13
|
+
// ============================================================================
|
|
14
|
+
const noop = () => { };
|
|
15
|
+
const noopFactory = () => noop;
|
|
16
|
+
function createNoopWithReturn(value) {
|
|
17
|
+
return () => value;
|
|
18
|
+
}
|
|
19
|
+
function createNoopAsync(value) {
|
|
20
|
+
return () => Promise.resolve(value);
|
|
21
|
+
}
|
|
22
|
+
export function createMockModel(options = {}) {
|
|
23
|
+
const { mockFn = noopFactory } = options;
|
|
24
|
+
return {
|
|
25
|
+
specificationVersion: 'v1',
|
|
26
|
+
provider: 'test-provider',
|
|
27
|
+
modelId: 'test-model',
|
|
28
|
+
defaultObjectGenerationMode: 'json',
|
|
29
|
+
doGenerate: mockFn(),
|
|
30
|
+
doStream: mockFn(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
export function createMockFileManager(options = {}) {
|
|
34
|
+
const { mockFn } = options;
|
|
35
|
+
if (mockFn) {
|
|
36
|
+
return {
|
|
37
|
+
upload: mockFn(),
|
|
38
|
+
delete: mockFn(),
|
|
39
|
+
clear: mockFn(),
|
|
40
|
+
getUploadedFiles: mockFn(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Default noop implementation with proper return values
|
|
44
|
+
return {
|
|
45
|
+
upload: createNoopAsync([]),
|
|
46
|
+
delete: createNoopAsync(undefined),
|
|
47
|
+
clear: createNoopAsync(undefined),
|
|
48
|
+
getUploadedFiles: createNoopWithReturn([]),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function createMockLogger(options = {}) {
|
|
52
|
+
const { mockFn = noopFactory } = options;
|
|
53
|
+
return {
|
|
54
|
+
onLLMCallStart: mockFn(),
|
|
55
|
+
onLLMCallEnd: mockFn(),
|
|
56
|
+
onExecutionStart: mockFn(),
|
|
57
|
+
onExecutionEmit: mockFn(),
|
|
58
|
+
onExecutionDone: mockFn(),
|
|
59
|
+
onExecutionError: mockFn(),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function createMockUsage(overrides = {}) {
|
|
63
|
+
return {
|
|
64
|
+
inputTokens: 100,
|
|
65
|
+
outputTokens: 50,
|
|
66
|
+
totalTokens: 150,
|
|
67
|
+
inputTokenDetails: {
|
|
68
|
+
noCacheTokens: 100,
|
|
69
|
+
cacheReadTokens: 0,
|
|
70
|
+
cacheWriteTokens: 0,
|
|
71
|
+
},
|
|
72
|
+
outputTokenDetails: {
|
|
73
|
+
textTokens: 50,
|
|
74
|
+
reasoningTokens: 0,
|
|
75
|
+
},
|
|
76
|
+
...overrides,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function createSimpleSessionFactory(options = {}) {
|
|
80
|
+
const { mockFn, logger } = options;
|
|
81
|
+
return (signal) => new SimpleSession({
|
|
82
|
+
defaultLanguageModel: createMockModel({ mockFn }),
|
|
83
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
84
|
+
fileManager: createMockFileManager({ mockFn }),
|
|
85
|
+
signal,
|
|
86
|
+
logger,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export function createStreamingSessionFactory(options = {}) {
|
|
90
|
+
const { mockFn, logger } = options;
|
|
91
|
+
return () => new StreamingSession({
|
|
92
|
+
defaultLanguageModel: createMockModel({ mockFn }),
|
|
93
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
94
|
+
fileManager: createMockFileManager({ mockFn }),
|
|
95
|
+
logger,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
export function createStreamingSessionFactoryWithSignal(options = {}) {
|
|
99
|
+
const { mockFn, logger, onSignalCapture } = options;
|
|
100
|
+
return (signal) => {
|
|
101
|
+
onSignalCapture?.(signal);
|
|
102
|
+
return new StreamingSession({
|
|
103
|
+
defaultLanguageModel: createMockModel({ mockFn }),
|
|
104
|
+
providerType: TEST_PROVIDER_TYPE,
|
|
105
|
+
fileManager: createMockFileManager({ mockFn }),
|
|
106
|
+
signal,
|
|
107
|
+
logger,
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// ============================================================================
|
|
112
|
+
// Utilities
|
|
113
|
+
// ============================================================================
|
|
114
|
+
export async function collectEvents(stream) {
|
|
115
|
+
const events = [];
|
|
116
|
+
for await (const event of stream) {
|
|
117
|
+
events.push(event);
|
|
118
|
+
}
|
|
119
|
+
return events;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Creates a controllable promise for testing async flows
|
|
123
|
+
*/
|
|
124
|
+
export function createControllablePromise() {
|
|
125
|
+
let resolve;
|
|
126
|
+
let reject;
|
|
127
|
+
const promise = new Promise((res, rej) => {
|
|
128
|
+
resolve = res;
|
|
129
|
+
reject = rej;
|
|
130
|
+
});
|
|
131
|
+
return { promise, resolve, reject };
|
|
132
|
+
}
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// Re-export Test Helpers
|
|
135
|
+
// ============================================================================
|
|
136
|
+
export {
|
|
137
|
+
// Abort/Signal helpers
|
|
138
|
+
createAbortScenario, createAlreadyAbortedSignal,
|
|
139
|
+
// Generator helpers
|
|
140
|
+
createSimpleGenerator, createErrorGenerator, createCancelableGenerator, createCancelableFunction, createDelayedGenerator,
|
|
141
|
+
// Race condition & concurrency helpers
|
|
142
|
+
createSlowGenerator, collectStreamAsync, createNeverEndingGenerator,
|
|
143
|
+
// Logger helpers
|
|
144
|
+
createOrderTrackingLogger, } from './helpers.js';
|
|
145
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sourceRoot":"","sources":["../../../src/execution/testing/fixtures.ts"],"names":[],"mappings":"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"}
|