@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.
Files changed (278) hide show
  1. package/README.md +18 -5
  2. package/dist/errors/index.d.ts +4 -0
  3. package/dist/errors/index.d.ts.map +1 -0
  4. package/dist/errors/index.js +3 -0
  5. package/dist/errors/index.js.map +1 -0
  6. package/dist/errors/types.d.ts +69 -0
  7. package/dist/errors/types.d.ts.map +1 -0
  8. package/dist/errors/types.js +116 -0
  9. package/dist/errors/types.js.map +1 -0
  10. package/dist/errors/utils.d.ts +17 -0
  11. package/dist/errors/utils.d.ts.map +1 -0
  12. package/dist/errors/utils.js +16 -0
  13. package/dist/errors/utils.js.map +1 -0
  14. package/dist/execution/constants.d.ts +7 -0
  15. package/dist/execution/constants.d.ts.map +1 -0
  16. package/dist/execution/constants.js +7 -0
  17. package/dist/execution/constants.js.map +1 -0
  18. package/dist/execution/index.d.ts +8 -0
  19. package/dist/execution/index.d.ts.map +1 -0
  20. package/dist/execution/index.js +7 -0
  21. package/dist/execution/index.js.map +1 -0
  22. package/dist/execution/mapping.d.ts +17 -0
  23. package/dist/execution/mapping.d.ts.map +1 -0
  24. package/dist/execution/mapping.js +197 -0
  25. package/dist/execution/mapping.js.map +1 -0
  26. package/dist/execution/shared.d.ts +86 -0
  27. package/dist/execution/shared.d.ts.map +1 -0
  28. package/dist/execution/shared.js +100 -0
  29. package/dist/execution/shared.js.map +1 -0
  30. package/dist/execution/simple-host.d.ts +56 -0
  31. package/dist/execution/simple-host.d.ts.map +1 -0
  32. package/dist/execution/simple-host.js +126 -0
  33. package/dist/execution/simple-host.js.map +1 -0
  34. package/dist/execution/streaming-host.d.ts +79 -0
  35. package/dist/execution/streaming-host.d.ts.map +1 -0
  36. package/dist/execution/streaming-host.js +276 -0
  37. package/dist/execution/streaming-host.js.map +1 -0
  38. package/dist/execution/testing/fixtures.d.ts +67 -0
  39. package/dist/execution/testing/fixtures.d.ts.map +1 -0
  40. package/dist/execution/testing/fixtures.js +145 -0
  41. package/dist/execution/testing/fixtures.js.map +1 -0
  42. package/dist/execution/testing/helpers.d.ts +218 -0
  43. package/dist/execution/testing/helpers.d.ts.map +1 -0
  44. package/dist/execution/testing/helpers.js +327 -0
  45. package/dist/execution/testing/helpers.js.map +1 -0
  46. package/dist/execution/testing/host-configs.d.ts +56 -0
  47. package/dist/execution/testing/host-configs.d.ts.map +1 -0
  48. package/dist/execution/testing/host-configs.js +154 -0
  49. package/dist/execution/testing/host-configs.js.map +1 -0
  50. package/dist/execution/testing/vitest-assertions.d.ts +102 -0
  51. package/dist/execution/testing/vitest-assertions.d.ts.map +1 -0
  52. package/dist/execution/testing/vitest-assertions.js +142 -0
  53. package/dist/execution/testing/vitest-assertions.js.map +1 -0
  54. package/dist/execution/types.d.ts +432 -0
  55. package/dist/execution/types.d.ts.map +1 -0
  56. package/dist/execution/types.js +2 -0
  57. package/dist/execution/types.js.map +1 -0
  58. package/dist/execution/utils.d.ts +68 -0
  59. package/dist/execution/utils.d.ts.map +1 -0
  60. package/dist/execution/utils.js +93 -0
  61. package/dist/execution/utils.js.map +1 -0
  62. package/dist/index.d.ts +10 -1506
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +9 -2979
  65. package/dist/index.js.map +1 -1
  66. package/dist/observability/index.d.ts +4 -0
  67. package/dist/observability/index.d.ts.map +1 -0
  68. package/dist/observability/index.js +2 -0
  69. package/dist/observability/index.js.map +1 -0
  70. package/dist/observability/logger.d.ts +161 -0
  71. package/dist/observability/logger.d.ts.map +1 -0
  72. package/dist/observability/logger.js +31 -0
  73. package/dist/observability/logger.js.map +1 -0
  74. package/dist/observability/types.d.ts +46 -0
  75. package/dist/observability/types.d.ts.map +1 -0
  76. package/dist/observability/types.js +2 -0
  77. package/dist/observability/types.js.map +1 -0
  78. package/dist/patterns/index.d.ts +2 -0
  79. package/dist/patterns/index.d.ts.map +1 -0
  80. package/dist/patterns/index.js +2 -0
  81. package/dist/patterns/index.js.map +1 -0
  82. package/dist/patterns/progressive/index.d.ts +2 -0
  83. package/dist/patterns/progressive/index.d.ts.map +1 -0
  84. package/dist/patterns/progressive/index.js +2 -0
  85. package/dist/patterns/progressive/index.js.map +1 -0
  86. package/dist/patterns/progressive/progressive-pattern.d.ts +174 -0
  87. package/dist/patterns/progressive/progressive-pattern.d.ts.map +1 -0
  88. package/dist/patterns/progressive/progressive-pattern.js +260 -0
  89. package/dist/patterns/progressive/progressive-pattern.js.map +1 -0
  90. package/dist/pricing/calculator.d.ts +71 -0
  91. package/dist/pricing/calculator.d.ts.map +1 -0
  92. package/dist/pricing/calculator.js +127 -0
  93. package/dist/pricing/calculator.js.map +1 -0
  94. package/dist/pricing/config.d.ts +61 -0
  95. package/dist/pricing/config.d.ts.map +1 -0
  96. package/dist/pricing/config.js +87 -0
  97. package/dist/pricing/config.js.map +1 -0
  98. package/dist/pricing/defaults.d.ts +29 -0
  99. package/dist/pricing/defaults.d.ts.map +1 -0
  100. package/dist/pricing/defaults.js +139 -0
  101. package/dist/pricing/defaults.js.map +1 -0
  102. package/dist/pricing/index.d.ts +40 -0
  103. package/dist/pricing/index.d.ts.map +1 -0
  104. package/dist/pricing/index.js +43 -0
  105. package/dist/pricing/index.js.map +1 -0
  106. package/dist/pricing/types.d.ts +96 -0
  107. package/dist/pricing/types.d.ts.map +1 -0
  108. package/dist/pricing/types.js +7 -0
  109. package/dist/pricing/types.js.map +1 -0
  110. package/dist/pricing/validator.d.ts +55 -0
  111. package/dist/pricing/validator.d.ts.map +1 -0
  112. package/dist/pricing/validator.js +84 -0
  113. package/dist/pricing/validator.js.map +1 -0
  114. package/dist/prompt/errors.d.ts +112 -0
  115. package/dist/prompt/errors.d.ts.map +1 -0
  116. package/dist/prompt/errors.js +174 -0
  117. package/dist/prompt/errors.js.map +1 -0
  118. package/dist/prompt/file-prompt-repository.d.ts +80 -0
  119. package/dist/prompt/file-prompt-repository.d.ts.map +1 -0
  120. package/dist/prompt/file-prompt-repository.js +287 -0
  121. package/dist/prompt/file-prompt-repository.js.map +1 -0
  122. package/dist/prompt/index.d.ts +34 -0
  123. package/dist/prompt/index.d.ts.map +1 -0
  124. package/dist/prompt/index.js +37 -0
  125. package/dist/prompt/index.js.map +1 -0
  126. package/dist/prompt/prompt-template.d.ts +64 -0
  127. package/dist/prompt/prompt-template.d.ts.map +1 -0
  128. package/dist/prompt/prompt-template.js +90 -0
  129. package/dist/prompt/prompt-template.js.map +1 -0
  130. package/dist/prompt/template.d.ts +23 -0
  131. package/dist/prompt/template.d.ts.map +1 -0
  132. package/dist/prompt/template.js +70 -0
  133. package/dist/prompt/template.js.map +1 -0
  134. package/dist/prompt/types.d.ts +148 -0
  135. package/dist/prompt/types.d.ts.map +1 -0
  136. package/dist/prompt/types.js +7 -0
  137. package/dist/prompt/types.js.map +1 -0
  138. package/dist/provider/base-file-manager.d.ts +14 -0
  139. package/dist/provider/base-file-manager.d.ts.map +1 -0
  140. package/dist/provider/base-file-manager.js +91 -0
  141. package/dist/provider/base-file-manager.js.map +1 -0
  142. package/dist/provider/base-provider.d.ts +41 -0
  143. package/dist/provider/base-provider.d.ts.map +1 -0
  144. package/dist/provider/base-provider.js +21 -0
  145. package/dist/provider/base-provider.js.map +1 -0
  146. package/dist/provider/file-cache.d.ts +14 -0
  147. package/dist/provider/file-cache.d.ts.map +1 -0
  148. package/dist/provider/file-cache.js +29 -0
  149. package/dist/provider/file-cache.js.map +1 -0
  150. package/dist/provider/file-source.d.ts +32 -0
  151. package/dist/provider/file-source.d.ts.map +1 -0
  152. package/dist/provider/file-source.js +180 -0
  153. package/dist/provider/file-source.js.map +1 -0
  154. package/dist/provider/file-utils.d.ts +5 -0
  155. package/dist/provider/file-utils.d.ts.map +1 -0
  156. package/dist/provider/file-utils.js +15 -0
  157. package/dist/provider/file-utils.js.map +1 -0
  158. package/dist/provider/google/factory.d.ts +107 -0
  159. package/dist/provider/google/factory.d.ts.map +1 -0
  160. package/dist/provider/google/factory.js +143 -0
  161. package/dist/provider/google/factory.js.map +1 -0
  162. package/dist/provider/google/file-manager.d.ts +10 -0
  163. package/dist/provider/google/file-manager.d.ts.map +1 -0
  164. package/dist/provider/google/file-manager.js +93 -0
  165. package/dist/provider/google/file-manager.js.map +1 -0
  166. package/dist/provider/google/index.d.ts +8 -0
  167. package/dist/provider/google/index.d.ts.map +1 -0
  168. package/dist/provider/google/index.js +10 -0
  169. package/dist/provider/google/index.js.map +1 -0
  170. package/dist/provider/hash.d.ts +3 -0
  171. package/dist/provider/hash.d.ts.map +1 -0
  172. package/dist/provider/hash.js +34 -0
  173. package/dist/provider/hash.js.map +1 -0
  174. package/dist/provider/index.d.ts +10 -0
  175. package/dist/provider/index.d.ts.map +1 -0
  176. package/dist/provider/index.js +12 -0
  177. package/dist/provider/index.js.map +1 -0
  178. package/dist/provider/noop-file-manager.d.ts +9 -0
  179. package/dist/provider/noop-file-manager.d.ts.map +1 -0
  180. package/dist/provider/noop-file-manager.js +28 -0
  181. package/dist/provider/noop-file-manager.js.map +1 -0
  182. package/dist/provider/openai/factory.d.ts +67 -0
  183. package/dist/provider/openai/factory.d.ts.map +1 -0
  184. package/dist/provider/openai/factory.js +100 -0
  185. package/dist/provider/openai/factory.js.map +1 -0
  186. package/dist/provider/openai/file-manager.d.ts +17 -0
  187. package/dist/provider/openai/file-manager.d.ts.map +1 -0
  188. package/dist/provider/openai/file-manager.js +108 -0
  189. package/dist/provider/openai/file-manager.js.map +1 -0
  190. package/dist/provider/openai/index.d.ts +8 -0
  191. package/dist/provider/openai/index.d.ts.map +1 -0
  192. package/dist/provider/openai/index.js +8 -0
  193. package/dist/provider/openai/index.js.map +1 -0
  194. package/dist/provider/types.d.ts +105 -0
  195. package/dist/provider/types.d.ts.map +1 -0
  196. package/dist/provider/types.js +19 -0
  197. package/dist/provider/types.js.map +1 -0
  198. package/dist/session/index.d.ts +7 -0
  199. package/dist/session/index.d.ts.map +1 -0
  200. package/dist/session/index.js +5 -0
  201. package/dist/session/index.js.map +1 -0
  202. package/dist/session/simple-session.d.ts +98 -0
  203. package/dist/session/simple-session.d.ts.map +1 -0
  204. package/dist/session/simple-session.js +299 -0
  205. package/dist/session/simple-session.js.map +1 -0
  206. package/dist/session/streaming-session.d.ts +90 -0
  207. package/dist/session/streaming-session.d.ts.map +1 -0
  208. package/dist/session/streaming-session.js +151 -0
  209. package/dist/session/streaming-session.js.map +1 -0
  210. package/dist/session/test-utils.d.ts +19 -0
  211. package/dist/session/test-utils.d.ts.map +1 -0
  212. package/dist/session/test-utils.js +65 -0
  213. package/dist/session/test-utils.js.map +1 -0
  214. package/dist/session/types.d.ts +219 -0
  215. package/dist/session/types.d.ts.map +1 -0
  216. package/dist/session/types.js +181 -0
  217. package/dist/session/types.js.map +1 -0
  218. package/dist/session/usage-extractors.d.ts +7 -0
  219. package/dist/session/usage-extractors.d.ts.map +1 -0
  220. package/dist/session/usage-extractors.js +71 -0
  221. package/dist/session/usage-extractors.js.map +1 -0
  222. package/dist/testing/fixtures.d.ts +34 -0
  223. package/dist/testing/fixtures.d.ts.map +1 -0
  224. package/dist/testing/fixtures.js +65 -0
  225. package/dist/testing/fixtures.js.map +1 -0
  226. package/dist/testing/helpers.d.ts +20 -0
  227. package/dist/testing/helpers.d.ts.map +1 -0
  228. package/dist/testing/helpers.js +32 -0
  229. package/dist/testing/helpers.js.map +1 -0
  230. package/dist/testing/index.d.ts +7 -519
  231. package/dist/testing/index.d.ts.map +1 -0
  232. package/dist/testing/index.js +21 -2123
  233. package/dist/testing/index.js.map +1 -1
  234. package/dist/testing/mock-provider.d.ts +79 -0
  235. package/dist/testing/mock-provider.d.ts.map +1 -0
  236. package/dist/testing/mock-provider.js +152 -0
  237. package/dist/testing/mock-provider.js.map +1 -0
  238. package/dist/testing/mock.d.ts +29 -0
  239. package/dist/testing/mock.d.ts.map +1 -0
  240. package/dist/testing/mock.js +154 -0
  241. package/dist/testing/mock.js.map +1 -0
  242. package/dist/testing/test-execution.d.ts +14 -0
  243. package/dist/testing/test-execution.d.ts.map +1 -0
  244. package/dist/testing/test-execution.js +108 -0
  245. package/dist/testing/test-execution.js.map +1 -0
  246. package/dist/utils/deep-merge.d.ts +6 -0
  247. package/dist/utils/deep-merge.d.ts.map +1 -0
  248. package/dist/utils/deep-merge.js +24 -0
  249. package/dist/utils/deep-merge.js.map +1 -0
  250. package/dist/validation/errors.d.ts +28 -0
  251. package/dist/validation/errors.d.ts.map +1 -0
  252. package/dist/validation/errors.js +38 -0
  253. package/dist/validation/errors.js.map +1 -0
  254. package/dist/validation/index.d.ts +5 -0
  255. package/dist/validation/index.d.ts.map +1 -0
  256. package/dist/validation/index.js +4 -0
  257. package/dist/validation/index.js.map +1 -0
  258. package/dist/validation/types.d.ts +49 -0
  259. package/dist/validation/types.d.ts.map +1 -0
  260. package/dist/validation/types.js +2 -0
  261. package/dist/validation/types.js.map +1 -0
  262. package/dist/validation/validation-history.d.ts +12 -0
  263. package/dist/validation/validation-history.d.ts.map +1 -0
  264. package/dist/validation/validation-history.js +29 -0
  265. package/dist/validation/validation-history.js.map +1 -0
  266. package/dist/validation/with-validation.d.ts +38 -0
  267. package/dist/validation/with-validation.d.ts.map +1 -0
  268. package/dist/validation/with-validation.js +58 -0
  269. package/dist/validation/with-validation.js.map +1 -0
  270. package/package.json +71 -75
  271. package/dist/base-provider-2TTw5HAa.d.cts +0 -1254
  272. package/dist/base-provider-2TTw5HAa.d.ts +0 -1254
  273. package/dist/index.cjs +0 -3085
  274. package/dist/index.cjs.map +0 -1
  275. package/dist/index.d.cts +0 -1506
  276. package/dist/testing/index.cjs +0 -2167
  277. package/dist/testing/index.cjs.map +0 -1
  278. package/dist/testing/index.d.cts +0 -520
@@ -0,0 +1,86 @@
1
+ import type { ExecutionStatus } from './types.js';
2
+ /**
3
+ * Shared utilities for execution hosts.
4
+ *
5
+ * These functions extract common patterns from SimpleExecutionHost and
6
+ * StreamingExecutionHost to reduce code duplication and ensure consistent
7
+ * behavior across both implementations.
8
+ */
9
+ /**
10
+ * Checks if an error is an abort-related error.
11
+ *
12
+ * An error is considered abort-related if either:
13
+ * - The error has the name 'AbortError' (standard for AbortController)
14
+ * - The signal has been aborted (covers edge cases where error name differs)
15
+ *
16
+ * @param error - The error to check
17
+ * @param signal - The AbortSignal associated with the execution
18
+ * @returns true if this is an abort-related error
19
+ */
20
+ export declare function isAbortError(error: unknown, signal: AbortSignal): boolean;
21
+ /**
22
+ * Normalizes an unknown error to an Error instance.
23
+ *
24
+ * If the error is already an Error instance, it's returned as-is.
25
+ * Otherwise, it's converted to a string and wrapped in a new Error.
26
+ *
27
+ * @param error - The unknown error to normalize
28
+ * @returns A proper Error instance
29
+ */
30
+ export declare function normalizeError(error: unknown): Error;
31
+ /**
32
+ * Determines the execution status based on the execution state.
33
+ *
34
+ * Status determination priority:
35
+ * 1. If user called cancel() OR the operation was aborted → 'canceled'
36
+ * 2. If there's an error → 'failed'
37
+ * 3. Otherwise → 'succeeded'
38
+ *
39
+ * Note: The 'aborted' flag takes precedence over 'hasError' because
40
+ * AbortError is treated as a normal cancellation, not a failure.
41
+ *
42
+ * @param cancelRequested - Whether cancel() was explicitly called
43
+ * @param aborted - Whether the signal was aborted (includes external abort)
44
+ * @param hasError - Whether the execution ended with an error
45
+ * @returns The appropriate execution status
46
+ */
47
+ export declare function determineResultStatus(cancelRequested: boolean, aborted: boolean, hasError: boolean): ExecutionStatus;
48
+ /**
49
+ * Return type for createHookRunner utility.
50
+ */
51
+ export type HookRunner = {
52
+ /**
53
+ * Ensures hooks run exactly once.
54
+ * Safe to call multiple times - only executes on first call.
55
+ */
56
+ ensureRun: () => Promise<void>;
57
+ /**
58
+ * Check if hooks have already been run.
59
+ */
60
+ hasRun: () => boolean;
61
+ };
62
+ /**
63
+ * Creates a hook runner that ensures hooks run exactly once.
64
+ *
65
+ * This utility encapsulates the common pattern of running cleanup hooks
66
+ * with a guard flag to prevent double execution. Both SimpleExecutionHost
67
+ * and StreamingExecutionHost use this pattern for onDone hooks.
68
+ *
69
+ * @param runHooks - The async function to run hooks
70
+ * @returns Object with ensureRun() and hasRun() methods
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const hookRunner = createHookRunner(async () => {
75
+ * await session.runOnDoneHooks();
76
+ * });
77
+ *
78
+ * // In finally block or cleanup:
79
+ * await hookRunner.ensureRun();
80
+ *
81
+ * // Safe to call multiple times - only executes once
82
+ * await hookRunner.ensureRun(); // no-op
83
+ * ```
84
+ */
85
+ export declare function createHookRunner(runHooks: () => Promise<void>): HookRunner;
86
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/execution/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;GAMG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAKzE;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAEpD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,eAAe,EAAE,OAAO,EACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,GAChB,eAAe,CAajB;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;;OAGG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B;;OAEG;IACH,MAAM,EAAE,MAAM,OAAO,CAAC;CACvB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAY1E"}
@@ -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;IAC9D,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CACnC,eAAwB,EACxB,OAAgB,EAChB,QAAiB;IAEjB,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;AACrB,CAAC;AAiBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA6B;IAC5D,IAAI,GAAG,GAAG,KAAK,CAAC;IAEhB,OAAO;QACL,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,GAAG,GAAG,IAAI,CAAC;gBACX,MAAM,QAAQ,EAAE,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG;KAClB,CAAC;AACJ,CAAC"}
@@ -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"}