@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.
Files changed (265) hide show
  1. package/dist/errors/index.d.ts +4 -0
  2. package/dist/errors/index.d.ts.map +1 -0
  3. package/dist/errors/index.js +3 -0
  4. package/dist/errors/index.js.map +1 -0
  5. package/dist/errors/types.d.ts +69 -0
  6. package/dist/errors/types.d.ts.map +1 -0
  7. package/dist/errors/types.js +119 -0
  8. package/dist/errors/types.js.map +1 -0
  9. package/dist/errors/utils.d.ts +17 -0
  10. package/dist/errors/utils.d.ts.map +1 -0
  11. package/dist/errors/utils.js +16 -0
  12. package/dist/errors/utils.js.map +1 -0
  13. package/dist/execution/constants.d.ts +7 -0
  14. package/dist/execution/constants.d.ts.map +1 -0
  15. package/dist/execution/constants.js +7 -0
  16. package/dist/execution/constants.js.map +1 -0
  17. package/dist/execution/index.d.ts +8 -0
  18. package/dist/execution/index.d.ts.map +1 -0
  19. package/dist/execution/index.js +7 -0
  20. package/dist/execution/index.js.map +1 -0
  21. package/dist/execution/mapping.d.ts +17 -0
  22. package/dist/execution/mapping.d.ts.map +1 -0
  23. package/dist/execution/mapping.js +197 -0
  24. package/dist/execution/mapping.js.map +1 -0
  25. package/dist/execution/shared.d.ts +86 -0
  26. package/dist/execution/shared.d.ts.map +1 -0
  27. package/dist/execution/shared.js +100 -0
  28. package/dist/execution/shared.js.map +1 -0
  29. package/dist/execution/simple-host.d.ts +56 -0
  30. package/dist/execution/simple-host.d.ts.map +1 -0
  31. package/dist/execution/simple-host.js +126 -0
  32. package/dist/execution/simple-host.js.map +1 -0
  33. package/dist/execution/streaming-host.d.ts +79 -0
  34. package/dist/execution/streaming-host.d.ts.map +1 -0
  35. package/dist/execution/streaming-host.js +276 -0
  36. package/dist/execution/streaming-host.js.map +1 -0
  37. package/dist/execution/testing/fixtures.d.ts +67 -0
  38. package/dist/execution/testing/fixtures.d.ts.map +1 -0
  39. package/dist/execution/testing/fixtures.js +145 -0
  40. package/dist/execution/testing/fixtures.js.map +1 -0
  41. package/dist/execution/testing/helpers.d.ts +218 -0
  42. package/dist/execution/testing/helpers.d.ts.map +1 -0
  43. package/dist/execution/testing/helpers.js +327 -0
  44. package/dist/execution/testing/helpers.js.map +1 -0
  45. package/dist/execution/testing/host-configs.d.ts +56 -0
  46. package/dist/execution/testing/host-configs.d.ts.map +1 -0
  47. package/dist/execution/testing/host-configs.js +154 -0
  48. package/dist/execution/testing/host-configs.js.map +1 -0
  49. package/dist/execution/testing/vitest-assertions.d.ts +102 -0
  50. package/dist/execution/testing/vitest-assertions.d.ts.map +1 -0
  51. package/dist/execution/testing/vitest-assertions.js +142 -0
  52. package/dist/execution/testing/vitest-assertions.js.map +1 -0
  53. package/dist/execution/types.d.ts +432 -0
  54. package/dist/execution/types.d.ts.map +1 -0
  55. package/dist/execution/types.js +2 -0
  56. package/dist/execution/types.js.map +1 -0
  57. package/dist/execution/utils.d.ts +68 -0
  58. package/dist/execution/utils.d.ts.map +1 -0
  59. package/dist/execution/utils.js +93 -0
  60. package/dist/execution/utils.js.map +1 -0
  61. package/dist/index.d.ts +10 -1502
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +9 -3081
  64. package/dist/index.js.map +1 -1
  65. package/dist/observability/index.d.ts +4 -0
  66. package/dist/observability/index.d.ts.map +1 -0
  67. package/dist/observability/index.js +2 -0
  68. package/dist/observability/index.js.map +1 -0
  69. package/dist/observability/logger.d.ts +161 -0
  70. package/dist/observability/logger.d.ts.map +1 -0
  71. package/dist/observability/logger.js +31 -0
  72. package/dist/observability/logger.js.map +1 -0
  73. package/dist/observability/types.d.ts +46 -0
  74. package/dist/observability/types.d.ts.map +1 -0
  75. package/dist/observability/types.js +2 -0
  76. package/dist/observability/types.js.map +1 -0
  77. package/dist/patterns/index.d.ts +2 -0
  78. package/dist/patterns/index.d.ts.map +1 -0
  79. package/dist/patterns/index.js +2 -0
  80. package/dist/patterns/index.js.map +1 -0
  81. package/dist/patterns/progressive/index.d.ts +2 -0
  82. package/dist/patterns/progressive/index.d.ts.map +1 -0
  83. package/dist/patterns/progressive/index.js +2 -0
  84. package/dist/patterns/progressive/index.js.map +1 -0
  85. package/dist/patterns/progressive/progressive-pattern.d.ts +174 -0
  86. package/dist/patterns/progressive/progressive-pattern.d.ts.map +1 -0
  87. package/dist/patterns/progressive/progressive-pattern.js +260 -0
  88. package/dist/patterns/progressive/progressive-pattern.js.map +1 -0
  89. package/dist/pricing/calculator.d.ts +71 -0
  90. package/dist/pricing/calculator.d.ts.map +1 -0
  91. package/dist/pricing/calculator.js +127 -0
  92. package/dist/pricing/calculator.js.map +1 -0
  93. package/dist/pricing/config.d.ts +61 -0
  94. package/dist/pricing/config.d.ts.map +1 -0
  95. package/dist/pricing/config.js +87 -0
  96. package/dist/pricing/config.js.map +1 -0
  97. package/dist/pricing/defaults.d.ts +29 -0
  98. package/dist/pricing/defaults.d.ts.map +1 -0
  99. package/dist/pricing/defaults.js +139 -0
  100. package/dist/pricing/defaults.js.map +1 -0
  101. package/dist/pricing/index.d.ts +40 -0
  102. package/dist/pricing/index.d.ts.map +1 -0
  103. package/dist/pricing/index.js +43 -0
  104. package/dist/pricing/index.js.map +1 -0
  105. package/dist/pricing/types.d.ts +96 -0
  106. package/dist/pricing/types.d.ts.map +1 -0
  107. package/dist/pricing/types.js +7 -0
  108. package/dist/pricing/types.js.map +1 -0
  109. package/dist/pricing/validator.d.ts +55 -0
  110. package/dist/pricing/validator.d.ts.map +1 -0
  111. package/dist/pricing/validator.js +84 -0
  112. package/dist/pricing/validator.js.map +1 -0
  113. package/dist/prompt/errors.d.ts +112 -0
  114. package/dist/prompt/errors.d.ts.map +1 -0
  115. package/dist/prompt/errors.js +175 -0
  116. package/dist/prompt/errors.js.map +1 -0
  117. package/dist/prompt/file-prompt-repository.d.ts +80 -0
  118. package/dist/prompt/file-prompt-repository.d.ts.map +1 -0
  119. package/dist/prompt/file-prompt-repository.js +287 -0
  120. package/dist/prompt/file-prompt-repository.js.map +1 -0
  121. package/dist/prompt/index.d.ts +34 -0
  122. package/dist/prompt/index.d.ts.map +1 -0
  123. package/dist/prompt/index.js +37 -0
  124. package/dist/prompt/index.js.map +1 -0
  125. package/dist/prompt/prompt-template.d.ts +64 -0
  126. package/dist/prompt/prompt-template.d.ts.map +1 -0
  127. package/dist/prompt/prompt-template.js +90 -0
  128. package/dist/prompt/prompt-template.js.map +1 -0
  129. package/dist/prompt/template.d.ts +23 -0
  130. package/dist/prompt/template.d.ts.map +1 -0
  131. package/dist/prompt/template.js +70 -0
  132. package/dist/prompt/template.js.map +1 -0
  133. package/dist/prompt/types.d.ts +148 -0
  134. package/dist/prompt/types.d.ts.map +1 -0
  135. package/dist/prompt/types.js +7 -0
  136. package/dist/prompt/types.js.map +1 -0
  137. package/dist/provider/base-provider.d.ts +41 -0
  138. package/dist/provider/base-provider.d.ts.map +1 -0
  139. package/dist/provider/base-provider.js +21 -0
  140. package/dist/provider/base-provider.js.map +1 -0
  141. package/dist/provider/file-cache.d.ts +14 -0
  142. package/dist/provider/file-cache.d.ts.map +1 -0
  143. package/dist/provider/file-cache.js +29 -0
  144. package/dist/provider/file-cache.js.map +1 -0
  145. package/dist/provider/file-source.d.ts +32 -0
  146. package/dist/provider/file-source.d.ts.map +1 -0
  147. package/dist/provider/file-source.js +180 -0
  148. package/dist/provider/file-source.js.map +1 -0
  149. package/dist/provider/google/factory.d.ts +107 -0
  150. package/dist/provider/google/factory.d.ts.map +1 -0
  151. package/dist/provider/google/factory.js +143 -0
  152. package/dist/provider/google/factory.js.map +1 -0
  153. package/dist/provider/google/file-manager.d.ts +14 -0
  154. package/dist/provider/google/file-manager.d.ts.map +1 -0
  155. package/dist/provider/google/file-manager.js +183 -0
  156. package/dist/provider/google/file-manager.js.map +1 -0
  157. package/dist/provider/google/index.d.ts +8 -0
  158. package/dist/provider/google/index.d.ts.map +1 -0
  159. package/dist/provider/google/index.js +10 -0
  160. package/dist/provider/google/index.js.map +1 -0
  161. package/dist/provider/hash.d.ts +3 -0
  162. package/dist/provider/hash.d.ts.map +1 -0
  163. package/dist/provider/hash.js +34 -0
  164. package/dist/provider/hash.js.map +1 -0
  165. package/dist/provider/index.d.ts +9 -0
  166. package/dist/provider/index.d.ts.map +1 -0
  167. package/dist/provider/index.js +11 -0
  168. package/dist/provider/index.js.map +1 -0
  169. package/dist/provider/noop-file-manager.d.ts +9 -0
  170. package/dist/provider/noop-file-manager.d.ts.map +1 -0
  171. package/dist/provider/noop-file-manager.js +28 -0
  172. package/dist/provider/noop-file-manager.js.map +1 -0
  173. package/dist/provider/openai/factory.d.ts +67 -0
  174. package/dist/provider/openai/factory.d.ts.map +1 -0
  175. package/dist/provider/openai/factory.js +95 -0
  176. package/dist/provider/openai/factory.js.map +1 -0
  177. package/dist/provider/openai/index.d.ts +7 -0
  178. package/dist/provider/openai/index.d.ts.map +1 -0
  179. package/dist/provider/openai/index.js +7 -0
  180. package/dist/provider/openai/index.js.map +1 -0
  181. package/dist/provider/types.d.ts +105 -0
  182. package/dist/provider/types.d.ts.map +1 -0
  183. package/dist/provider/types.js +19 -0
  184. package/dist/provider/types.js.map +1 -0
  185. package/dist/session/index.d.ts +7 -0
  186. package/dist/session/index.d.ts.map +1 -0
  187. package/dist/session/index.js +5 -0
  188. package/dist/session/index.js.map +1 -0
  189. package/dist/session/simple-session.d.ts +98 -0
  190. package/dist/session/simple-session.d.ts.map +1 -0
  191. package/dist/session/simple-session.js +299 -0
  192. package/dist/session/simple-session.js.map +1 -0
  193. package/dist/session/streaming-session.d.ts +90 -0
  194. package/dist/session/streaming-session.d.ts.map +1 -0
  195. package/dist/session/streaming-session.js +151 -0
  196. package/dist/session/streaming-session.js.map +1 -0
  197. package/dist/session/test-utils.d.ts +19 -0
  198. package/dist/session/test-utils.d.ts.map +1 -0
  199. package/dist/session/test-utils.js +65 -0
  200. package/dist/session/test-utils.js.map +1 -0
  201. package/dist/session/types.d.ts +219 -0
  202. package/dist/session/types.d.ts.map +1 -0
  203. package/dist/session/types.js +181 -0
  204. package/dist/session/types.js.map +1 -0
  205. package/dist/session/usage-extractors.d.ts +7 -0
  206. package/dist/session/usage-extractors.d.ts.map +1 -0
  207. package/dist/session/usage-extractors.js +71 -0
  208. package/dist/session/usage-extractors.js.map +1 -0
  209. package/dist/testing/fixtures.d.ts +34 -0
  210. package/dist/testing/fixtures.d.ts.map +1 -0
  211. package/dist/testing/fixtures.js +65 -0
  212. package/dist/testing/fixtures.js.map +1 -0
  213. package/dist/testing/helpers.d.ts +20 -0
  214. package/dist/testing/helpers.d.ts.map +1 -0
  215. package/dist/testing/helpers.js +32 -0
  216. package/dist/testing/helpers.js.map +1 -0
  217. package/dist/testing/index.d.ts +7 -515
  218. package/dist/testing/index.d.ts.map +1 -0
  219. package/dist/testing/index.js +21 -2096
  220. package/dist/testing/index.js.map +1 -1
  221. package/dist/testing/mock-provider.d.ts +79 -0
  222. package/dist/testing/mock-provider.d.ts.map +1 -0
  223. package/dist/testing/mock-provider.js +152 -0
  224. package/dist/testing/mock-provider.js.map +1 -0
  225. package/dist/testing/mock.d.ts +29 -0
  226. package/dist/testing/mock.d.ts.map +1 -0
  227. package/dist/testing/mock.js +154 -0
  228. package/dist/testing/mock.js.map +1 -0
  229. package/dist/testing/test-execution.d.ts +14 -0
  230. package/dist/testing/test-execution.d.ts.map +1 -0
  231. package/dist/testing/test-execution.js +108 -0
  232. package/dist/testing/test-execution.js.map +1 -0
  233. package/dist/utils/deep-merge.d.ts +6 -0
  234. package/dist/utils/deep-merge.d.ts.map +1 -0
  235. package/dist/utils/deep-merge.js +24 -0
  236. package/dist/utils/deep-merge.js.map +1 -0
  237. package/dist/validation/errors.d.ts +28 -0
  238. package/dist/validation/errors.d.ts.map +1 -0
  239. package/dist/validation/errors.js +39 -0
  240. package/dist/validation/errors.js.map +1 -0
  241. package/dist/validation/index.d.ts +5 -0
  242. package/dist/validation/index.d.ts.map +1 -0
  243. package/dist/validation/index.js +4 -0
  244. package/dist/validation/index.js.map +1 -0
  245. package/dist/validation/types.d.ts +49 -0
  246. package/dist/validation/types.d.ts.map +1 -0
  247. package/dist/validation/types.js +2 -0
  248. package/dist/validation/types.js.map +1 -0
  249. package/dist/validation/validation-history.d.ts +12 -0
  250. package/dist/validation/validation-history.d.ts.map +1 -0
  251. package/dist/validation/validation-history.js +29 -0
  252. package/dist/validation/validation-history.js.map +1 -0
  253. package/dist/validation/with-validation.d.ts +38 -0
  254. package/dist/validation/with-validation.d.ts.map +1 -0
  255. package/dist/validation/with-validation.js +58 -0
  256. package/dist/validation/with-validation.js.map +1 -0
  257. package/package.json +72 -78
  258. package/dist/base-provider-C3mFLNiN.d.cts +0 -1236
  259. package/dist/base-provider-C3mFLNiN.d.ts +0 -1236
  260. package/dist/index.cjs +0 -3188
  261. package/dist/index.cjs.map +0 -1
  262. package/dist/index.d.cts +0 -1502
  263. package/dist/testing/index.cjs +0 -2144
  264. package/dist/testing/index.cjs.map +0 -1
  265. 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":"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"}