@agtlantis/core 0.4.1 → 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 -1502
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -3081
- 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 -515
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +21 -2096
- 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 -78
- package/dist/base-provider-C3mFLNiN.d.cts +0 -1236
- package/dist/base-provider-C3mFLNiN.d.ts +0 -1236
- package/dist/index.cjs +0 -3188
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -1502
- package/dist/testing/index.cjs +0 -2144
- package/dist/testing/index.cjs.map +0 -1
- package/dist/testing/index.d.cts +0 -516
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for execution hosts.
|
|
3
|
+
*
|
|
4
|
+
* These functions extract common patterns from SimpleExecutionHost and
|
|
5
|
+
* StreamingExecutionHost to reduce code duplication and ensure consistent
|
|
6
|
+
* behavior across both implementations.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Checks if an error is an abort-related error.
|
|
10
|
+
*
|
|
11
|
+
* An error is considered abort-related if either:
|
|
12
|
+
* - The error has the name 'AbortError' (standard for AbortController)
|
|
13
|
+
* - The signal has been aborted (covers edge cases where error name differs)
|
|
14
|
+
*
|
|
15
|
+
* @param error - The error to check
|
|
16
|
+
* @param signal - The AbortSignal associated with the execution
|
|
17
|
+
* @returns true if this is an abort-related error
|
|
18
|
+
*/
|
|
19
|
+
export function isAbortError(error, signal) {
|
|
20
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
return signal.aborted;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Normalizes an unknown error to an Error instance.
|
|
27
|
+
*
|
|
28
|
+
* If the error is already an Error instance, it's returned as-is.
|
|
29
|
+
* Otherwise, it's converted to a string and wrapped in a new Error.
|
|
30
|
+
*
|
|
31
|
+
* @param error - The unknown error to normalize
|
|
32
|
+
* @returns A proper Error instance
|
|
33
|
+
*/
|
|
34
|
+
export function normalizeError(error) {
|
|
35
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Determines the execution status based on the execution state.
|
|
39
|
+
*
|
|
40
|
+
* Status determination priority:
|
|
41
|
+
* 1. If user called cancel() OR the operation was aborted → 'canceled'
|
|
42
|
+
* 2. If there's an error → 'failed'
|
|
43
|
+
* 3. Otherwise → 'succeeded'
|
|
44
|
+
*
|
|
45
|
+
* Note: The 'aborted' flag takes precedence over 'hasError' because
|
|
46
|
+
* AbortError is treated as a normal cancellation, not a failure.
|
|
47
|
+
*
|
|
48
|
+
* @param cancelRequested - Whether cancel() was explicitly called
|
|
49
|
+
* @param aborted - Whether the signal was aborted (includes external abort)
|
|
50
|
+
* @param hasError - Whether the execution ended with an error
|
|
51
|
+
* @returns The appropriate execution status
|
|
52
|
+
*/
|
|
53
|
+
export function determineResultStatus(cancelRequested, aborted, hasError) {
|
|
54
|
+
// Cancellation takes priority (abort errors are treated as cancellation)
|
|
55
|
+
if (cancelRequested || aborted) {
|
|
56
|
+
return 'canceled';
|
|
57
|
+
}
|
|
58
|
+
// Error state
|
|
59
|
+
if (hasError) {
|
|
60
|
+
return 'failed';
|
|
61
|
+
}
|
|
62
|
+
// Success
|
|
63
|
+
return 'succeeded';
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a hook runner that ensures hooks run exactly once.
|
|
67
|
+
*
|
|
68
|
+
* This utility encapsulates the common pattern of running cleanup hooks
|
|
69
|
+
* with a guard flag to prevent double execution. Both SimpleExecutionHost
|
|
70
|
+
* and StreamingExecutionHost use this pattern for onDone hooks.
|
|
71
|
+
*
|
|
72
|
+
* @param runHooks - The async function to run hooks
|
|
73
|
+
* @returns Object with ensureRun() and hasRun() methods
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const hookRunner = createHookRunner(async () => {
|
|
78
|
+
* await session.runOnDoneHooks();
|
|
79
|
+
* });
|
|
80
|
+
*
|
|
81
|
+
* // In finally block or cleanup:
|
|
82
|
+
* await hookRunner.ensureRun();
|
|
83
|
+
*
|
|
84
|
+
* // Safe to call multiple times - only executes once
|
|
85
|
+
* await hookRunner.ensureRun(); // no-op
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function createHookRunner(runHooks) {
|
|
89
|
+
let ran = false;
|
|
90
|
+
return {
|
|
91
|
+
ensureRun: async () => {
|
|
92
|
+
if (!ran) {
|
|
93
|
+
ran = true;
|
|
94
|
+
await runHooks();
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
hasRun: () => ran,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/execution/shared.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,KAAc,EAAE,MAAmB,EAAW;IACzE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC;AAAA,CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc,EAAS;IACpD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAAA,CAClE;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAAwB,EACxB,OAAgB,EAChB,QAAiB,EACA;IACjB,yEAAyE;IACzE,IAAI,eAAe,IAAI,OAAO,EAAE,CAAC;QAC/B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,cAAc;IACd,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,UAAU;IACV,OAAO,WAAW,CAAC;AAAA,CACpB;AAiBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA6B,EAAc;IAC1E,IAAI,GAAG,GAAG,KAAK,CAAC;IAEhB,OAAO;QACL,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,IAAI,CAAC;gBACX,MAAM,QAAQ,EAAE,CAAC;YACnB,CAAC;QAAA,CACF;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;KAClB,CAAC;AAAA,CACH"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { SimpleSession } from '../session/simple-session.js';
|
|
2
|
+
import type { SimpleExecution, SimpleResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* SimpleExecutionHost implements the SimpleExecution interface for eager execution.
|
|
5
|
+
*
|
|
6
|
+
* Execution starts immediately on construction (eager evaluation).
|
|
7
|
+
* Use result() to get the execution outcome with status and summary.
|
|
8
|
+
*
|
|
9
|
+
* Signal combination:
|
|
10
|
+
* - If userSignal is provided, it's combined with internal AbortController
|
|
11
|
+
* - Both cancel() and userSignal abort will trigger cancellation
|
|
12
|
+
* - The combined signal is passed to SimpleSession for AI SDK calls
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const execution = new SimpleExecutionHost(createSession, async (session) => {
|
|
17
|
+
* return await session.generateText({ prompt: 'Hello' });
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* const result = await execution.result();
|
|
21
|
+
*
|
|
22
|
+
* if (result.status === 'succeeded') {
|
|
23
|
+
* console.log(result.value);
|
|
24
|
+
* }
|
|
25
|
+
* console.log(`Cost: $${result.summary.totalCost}`);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare class SimpleExecutionHost<TResult> implements SimpleExecution<TResult> {
|
|
29
|
+
private readonly abortController;
|
|
30
|
+
private readonly effectiveSignal;
|
|
31
|
+
private readonly consumerPromise;
|
|
32
|
+
private cachedSession?;
|
|
33
|
+
private readonly startTime;
|
|
34
|
+
private cancelRequested;
|
|
35
|
+
constructor(createSession: (signal?: AbortSignal) => SimpleSession, fn: (session: SimpleSession) => Promise<TResult>, userSignal?: AbortSignal);
|
|
36
|
+
private execute;
|
|
37
|
+
/**
|
|
38
|
+
* Request cancellation of the execution.
|
|
39
|
+
* Aborts the current LLM call if in progress.
|
|
40
|
+
* No-op if execution already completed.
|
|
41
|
+
*/
|
|
42
|
+
cancel(): void;
|
|
43
|
+
/**
|
|
44
|
+
* Get the execution result with status and summary.
|
|
45
|
+
* Never throws - returns a discriminated union with status.
|
|
46
|
+
*/
|
|
47
|
+
result(): Promise<SimpleResult<TResult>>;
|
|
48
|
+
/**
|
|
49
|
+
* Cleanup resources.
|
|
50
|
+
* For SimpleExecution, hooks are already run during execution,
|
|
51
|
+
* so this is intentionally a no-op.
|
|
52
|
+
*/
|
|
53
|
+
cleanup(): Promise<void>;
|
|
54
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=simple-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-host.d.ts","sourceRoot":"","sources":["../../src/execution/simple-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAYhE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,mBAAmB,CAAC,OAAO,CAAE,YAAW,eAAe,CAAC,OAAO,CAAC;IAC3E,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmC;IACnE,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,eAAe,CAAS;IAEhC,YACE,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,aAAa,EACtD,EAAE,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,EAChD,UAAU,CAAC,EAAE,WAAW,EASzB;YAEa,OAAO;IA0CrB;;;;OAIG;IACH,MAAM,IAAI,IAAI,CAGb;IAED;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CA0B7C;IAED;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAE7B;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;CACF"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { combineSignals } from './utils.js';
|
|
2
|
+
import { isAbortError, normalizeError, createHookRunner } from './shared.js';
|
|
3
|
+
/**
|
|
4
|
+
* SimpleExecutionHost implements the SimpleExecution interface for eager execution.
|
|
5
|
+
*
|
|
6
|
+
* Execution starts immediately on construction (eager evaluation).
|
|
7
|
+
* Use result() to get the execution outcome with status and summary.
|
|
8
|
+
*
|
|
9
|
+
* Signal combination:
|
|
10
|
+
* - If userSignal is provided, it's combined with internal AbortController
|
|
11
|
+
* - Both cancel() and userSignal abort will trigger cancellation
|
|
12
|
+
* - The combined signal is passed to SimpleSession for AI SDK calls
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const execution = new SimpleExecutionHost(createSession, async (session) => {
|
|
17
|
+
* return await session.generateText({ prompt: 'Hello' });
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* const result = await execution.result();
|
|
21
|
+
*
|
|
22
|
+
* if (result.status === 'succeeded') {
|
|
23
|
+
* console.log(result.value);
|
|
24
|
+
* }
|
|
25
|
+
* console.log(`Cost: $${result.summary.totalCost}`);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export class SimpleExecutionHost {
|
|
29
|
+
abortController = new AbortController();
|
|
30
|
+
effectiveSignal;
|
|
31
|
+
consumerPromise;
|
|
32
|
+
cachedSession;
|
|
33
|
+
startTime = Date.now();
|
|
34
|
+
cancelRequested = false;
|
|
35
|
+
constructor(createSession, fn, userSignal) {
|
|
36
|
+
// Combine user signal with internal controller for dual cancellation support
|
|
37
|
+
this.effectiveSignal = userSignal
|
|
38
|
+
? combineSignals(userSignal, this.abortController.signal)
|
|
39
|
+
: this.abortController.signal;
|
|
40
|
+
// Start execution immediately (eager evaluation)
|
|
41
|
+
this.consumerPromise = this.execute(createSession, fn);
|
|
42
|
+
}
|
|
43
|
+
async execute(createSession, fn) {
|
|
44
|
+
const session = createSession(this.effectiveSignal);
|
|
45
|
+
this.cachedSession = session;
|
|
46
|
+
const hookRunner = createHookRunner(() => session.runOnDoneHooks());
|
|
47
|
+
// Notify execution start
|
|
48
|
+
session.notifyExecutionStart();
|
|
49
|
+
try {
|
|
50
|
+
const result = await fn(session);
|
|
51
|
+
// Notify execution done
|
|
52
|
+
await session.notifyExecutionDone(result, this.startTime);
|
|
53
|
+
return {
|
|
54
|
+
success: true,
|
|
55
|
+
result,
|
|
56
|
+
summary: await session.getSummary(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
const errorObj = normalizeError(error);
|
|
61
|
+
const isCancellation = isAbortError(error, this.abortController.signal);
|
|
62
|
+
// Notify execution error (AbortError excluded - treated as normal cancellation)
|
|
63
|
+
if (!isCancellation) {
|
|
64
|
+
await session.notifyExecutionError(errorObj, this.startTime);
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
success: false,
|
|
68
|
+
error: errorObj,
|
|
69
|
+
aborted: isCancellation,
|
|
70
|
+
summary: await session.getSummary(),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await hookRunner.ensureRun();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Request cancellation of the execution.
|
|
79
|
+
* Aborts the current LLM call if in progress.
|
|
80
|
+
* No-op if execution already completed.
|
|
81
|
+
*/
|
|
82
|
+
cancel() {
|
|
83
|
+
this.cancelRequested = true;
|
|
84
|
+
this.abortController.abort();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Get the execution result with status and summary.
|
|
88
|
+
* Never throws - returns a discriminated union with status.
|
|
89
|
+
*/
|
|
90
|
+
async result() {
|
|
91
|
+
const internal = await this.consumerPromise;
|
|
92
|
+
// Success state
|
|
93
|
+
if (internal.success) {
|
|
94
|
+
return {
|
|
95
|
+
status: 'succeeded',
|
|
96
|
+
value: internal.result,
|
|
97
|
+
summary: internal.summary,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
// Canceled state (user called cancel() or external signal aborted)
|
|
101
|
+
if (this.cancelRequested || internal.aborted) {
|
|
102
|
+
return {
|
|
103
|
+
status: 'canceled',
|
|
104
|
+
summary: internal.summary,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
// Failed state
|
|
108
|
+
return {
|
|
109
|
+
status: 'failed',
|
|
110
|
+
error: internal.error,
|
|
111
|
+
summary: internal.summary,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Cleanup resources.
|
|
116
|
+
* For SimpleExecution, hooks are already run during execution,
|
|
117
|
+
* so this is intentionally a no-op.
|
|
118
|
+
*/
|
|
119
|
+
async cleanup() {
|
|
120
|
+
// SimpleExecution runs hooks in execute(), nothing to clean up
|
|
121
|
+
}
|
|
122
|
+
async [Symbol.asyncDispose]() {
|
|
123
|
+
await this.cleanup();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=simple-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simple-host.js","sourceRoot":"","sources":["../../src/execution/simple-host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { StreamingSession } from '../session/streaming-session.js';
|
|
2
|
+
import type { ErrorEvent, ExtractResult, SessionEvent, SessionStreamGeneratorFn, StreamingExecution, StreamingResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Streaming execution host that uses StreamingSession.
|
|
5
|
+
* Starts execution eagerly on construction - events are buffered automatically.
|
|
6
|
+
*
|
|
7
|
+
* @typeParam TEvent - User's pure domain event type with required `type` field (metrics added automatically)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const execution = new StreamingExecutionHost(
|
|
12
|
+
* () => new StreamingSession({
|
|
13
|
+
* defaultLanguageModel: provider.model,
|
|
14
|
+
* fileManager: new GoogleFileManager(apiKey),
|
|
15
|
+
* }),
|
|
16
|
+
* async function* (session) {
|
|
17
|
+
* session.onDone(() => session.fileManager.clear());
|
|
18
|
+
* const result = await session.generateText({ prompt: 'Hello' });
|
|
19
|
+
* yield session.emit({ type: 'progress', message: 'Working...' });
|
|
20
|
+
* return session.done(result.text);
|
|
21
|
+
* }
|
|
22
|
+
* );
|
|
23
|
+
* // ↑ Execution already started, events being buffered
|
|
24
|
+
*
|
|
25
|
+
* // Option 1: Stream events (buffered + real-time)
|
|
26
|
+
* for await (const event of execution.stream()) {
|
|
27
|
+
* console.log(event.type, event.metrics.elapsedMs);
|
|
28
|
+
* }
|
|
29
|
+
* const result = await execution.result();
|
|
30
|
+
*
|
|
31
|
+
* // Option 2: Skip streaming, events available in result
|
|
32
|
+
* const result = await execution.result();
|
|
33
|
+
* console.log(`Received ${result.events.length} events`);
|
|
34
|
+
*
|
|
35
|
+
* if (result.status === 'succeeded') {
|
|
36
|
+
* console.log(result.value);
|
|
37
|
+
* }
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class StreamingExecutionHost<TEvent extends {
|
|
41
|
+
type: string;
|
|
42
|
+
}> implements StreamingExecution<TEvent> {
|
|
43
|
+
private readonly createSession;
|
|
44
|
+
private readonly generator;
|
|
45
|
+
private readonly abortController;
|
|
46
|
+
private readonly effectiveSignal;
|
|
47
|
+
private readonly consumerPromise;
|
|
48
|
+
private readonly eventBuffer;
|
|
49
|
+
private readonly subscribers;
|
|
50
|
+
private completed;
|
|
51
|
+
private cleaned;
|
|
52
|
+
private hookRunner;
|
|
53
|
+
private cancelRequested;
|
|
54
|
+
private extractedOutcome;
|
|
55
|
+
private extractedSummary;
|
|
56
|
+
constructor(createSession: (signal?: AbortSignal) => StreamingSession<TEvent>, generator: SessionStreamGeneratorFn<TEvent>, userSignal?: AbortSignal);
|
|
57
|
+
private hasDataField;
|
|
58
|
+
private hasSummaryField;
|
|
59
|
+
private hasErrorField;
|
|
60
|
+
private extractResultAndMetadata;
|
|
61
|
+
private notifySubscribers;
|
|
62
|
+
private startConsuming;
|
|
63
|
+
private buildResult;
|
|
64
|
+
/**
|
|
65
|
+
* Get the event stream.
|
|
66
|
+
* Returns buffered events first, then real-time events.
|
|
67
|
+
* Can be called multiple times - replays buffer each time.
|
|
68
|
+
*/
|
|
69
|
+
stream(): AsyncIterable<SessionEvent<TEvent | ErrorEvent>>;
|
|
70
|
+
cancel(): void;
|
|
71
|
+
cleanup(): Promise<void>;
|
|
72
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Get the execution result with status, summary, and all events.
|
|
75
|
+
* Never throws - returns a discriminated union with status.
|
|
76
|
+
*/
|
|
77
|
+
result(): Promise<StreamingResult<SessionEvent<TEvent | ErrorEvent>, ExtractResult<TEvent>>>;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=streaming-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streaming-host.d.ts","sourceRoot":"","sources":["../../src/execution/streaming-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAYzI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,qBAAa,sBAAsB,CAC/B,MAAM,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CACjC,YAAW,kBAAkB,CAAC,MAAM,CAAC;IAkB/B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAlB9B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA0D;IAC1F,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoD;IAChF,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,eAAe,CAAS;IAEhC,OAAO,CAAC,gBAAgB,CAGN;IAClB,OAAO,CAAC,gBAAgB,CAA+B;IAEvD,YACqB,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,gBAAgB,CAAC,MAAM,CAAC,EACjE,SAAS,EAAE,wBAAwB,CAAC,MAAM,CAAC,EAC5D,UAAU,CAAC,EAAE,WAAW,EAS3B;IAED,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,wBAAwB;IAmBhC,OAAO,CAAC,iBAAiB;YAIX,cAAc;YA8Ed,WAAW;IA8BzB;;;;OAIG;IACI,MAAM,IAAI,aAAa,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAkChE;IAED,MAAM,IAAI,IAAI,CAGb;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAgB7B;IAEK,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3C;IAED;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,MAAM,GAAG,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CA8BjG;CACJ"}
|
|
@@ -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":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAmB,MAAM,aAAa,CAAC;AAS9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,OAAO,sBAAsB;IAoBV,aAAa;IACb,SAAS;IAlBb,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IACxC,eAAe,CAAc;IAC7B,eAAe,CAA0D;IACzE,WAAW,GAA2B,EAAE,CAAC;IACzC,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAC;IACxE,SAAS,GAAG,KAAK,CAAC;IAClB,OAAO,GAAG,KAAK,CAAC;IAChB,UAAU,GAAsB,IAAI,CAAC;IACrC,eAAe,GAAG,KAAK,CAAC;IAExB,gBAAgB,GAGX,IAAI,CAAC;IACV,gBAAgB,GAA0B,IAAI,CAAC;IAEvD,YACqB,aAAiE,EACjE,SAA2C,EAC5D,UAAwB,EAC1B;6BAHmB,aAAa;yBACb,SAAS;QAG1B,6EAA6E;QAC7E,IAAI,CAAC,eAAe,GAAG,UAAU;YAC7B,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;YACzD,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAElC,2CAA2C;QAC3C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IAAA,CAChD;IAEO,YAAY,CAAC,KAA2B,EAAmE;QAC/G,OAAO,MAAM,IAAI,KAAK,IAAK,KAA4B,CAAC,IAAI,KAAK,SAAS,CAAC;IAAA,CAC9E;IAEO,eAAe,CAAC,KAA2B,EAA+D;QAC9G,OAAO,SAAS,IAAI,KAAK,IAAK,KAA+B,CAAC,OAAO,KAAK,SAAS,CAAC;IAAA,CACvF;IAEO,aAAa,CAAC,KAA2B,EAAoD;QACjG,OAAO,OAAO,IAAI,KAAK,IAAK,KAA6B,CAAC,KAAK,YAAY,KAAK,CAAC;IAAA,CACpF;IAEO,wBAAwB,CAAC,KAA2B,EAAQ;QAChE,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;QAE9E,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACrB,OAAO;QACX,CAAC;QAED,2DAA2D;QAC3D,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAClE,CAAC;aAAM,IAAI,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,gBAAgB,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC;QAC1C,CAAC;IAAA,CACJ;IAEO,iBAAiB,CAAC,KAA2B,EAAQ;QACzD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAAA,CAC7C;IAEO,KAAK,CAAC,cAAc,GAA4D;QACpF,+DAA+D;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEpC,IAAI,CAAC;YACD,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAE5B,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChB,oBAAoB;gBACpB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAClC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEnC,+DAA+D;gBAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;gBACjF,IAAI,UAAU,EAAE,CAAC;oBACb,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC1C,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;oBAC7B,MAAM;gBACV,CAAC;gBAED,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACtC,MAAM;gBACV,CAAC;gBAED,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC5B,CAAC;YAED,qCAAqC;YACrC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBACnC,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC;gBAE1C,wDAAwD;gBACxD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,KAAK,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC;gBACjF,IAAI,UAAU,EAAE,CAAC;oBACb,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBACjC,CAAC;YACL,CAAC;YAED,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YAEvC,+CAA+C;YAC/C,IAAI,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;gBACnD,OAAO;oBACH,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI;oBACb,KAAK,EAAE,QAAQ;oBACf,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE;iBACtC,CAAC;YACN,CAAC;YAED,0CAA0C;YAC1C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAClC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACnC,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC;YAE1C,+BAA+B;YAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAE7B,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,8DAA8D;YAC9D,uEAAuE;YAEvE,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;YAEnC,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;IAAA,CACJ;IAEO,KAAK,CAAC,WAAW,CAAC,OAAiC,EAA2D;QAClH,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,IAAI,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAEpE,qDAAqD;QACrD,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1C,OAAO;gBACH,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;gBAClC,OAAO;aACV,CAAC;QACN,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO;gBACH,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK;gBACnC,OAAO;aACV,CAAC;QACN,CAAC;QAED,gEAAgE;QAChE,OAAO;YACH,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;YAClC,OAAO;SACV,CAAC;IAAA,CACL;IAED;;;;OAIG;IACH,KAAK,CAAC,CAAC,MAAM,GAAqD;QAC9D,iCAAiC;QACjC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO;QACX,CAAC;QAED,gFAAgF;QAChF,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,IAAI,OAAO,GAAG,IAAI,QAAQ,EAAQ,CAAC;QAEnC,MAAM,UAAU,GAAG,CAAC,KAA2B,EAAE,EAAE,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,CAAC,OAAO,EAAE,CAAC;QAAA,CACrB,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEjC,IAAI,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnB,MAAM,KAAK,CAAC,KAAK,EAAG,CAAC;gBACzB,CAAC;qBAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;oBACzB,MAAM,OAAO,CAAC,OAAO,CAAC;oBACtB,OAAO,GAAG,IAAI,QAAQ,EAAQ,CAAC,CAAC,sBAAsB;gBAC1D,CAAC;YACL,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACxC,CAAC;IAAA,CACJ;IAED,MAAM,GAAS;QACX,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAAA,CAChC;IAED,KAAK,CAAC,OAAO,GAAkB;QAC3B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO;QACX,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QAEpB,0BAA0B;QAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,qBAAqB;QACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,MAAM,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,CAAC;IAAA,CACtC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAkB;QACzC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAAA,CACxB;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,GAAuF;QAC/F,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAoC,CAAC;QAEvF,gBAAgB;QAChB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO;gBACH,MAAM,EAAE,WAAW;gBACnB,KAAK,EAAE,QAAQ,CAAC,MAAM;gBACtB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM;aACT,CAAC;QACN,CAAC;QAED,iBAAiB;QACjB,IAAI,IAAI,CAAC,eAAe,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YAC3C,OAAO;gBACH,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,MAAM;aACT,CAAC;QACN,CAAC;QAED,eAAe;QACf,OAAO;YACH,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,MAAM;SACT,CAAC;IAAA,CACL;CACJ"}
|