@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,152 @@
1
+ /**
2
+ * MockProvider - Test provider for @agtlantis/core.
3
+ *
4
+ * Extends BaseProvider to provide mock LLM responses with call tracking.
5
+ * Use `mock.provider()` factory for convenient creation.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { mock } from '@agtlantis/core/testing';
10
+ *
11
+ * const provider = mock.provider(mock.text('Hello!'));
12
+ * const execution = provider.simpleExecution(async (session) => {
13
+ * const { text } = await session.generateText({ prompt: 'Say hi' });
14
+ * return text;
15
+ * });
16
+ *
17
+ * expect(await execution.toResult()).toBe('Hello!');
18
+ * expect(provider.getCalls()).toHaveLength(1);
19
+ * ```
20
+ */
21
+ import { MockLanguageModelV3 } from 'ai/test';
22
+ import { noopLogger } from '../observability/logger.js';
23
+ import { BaseProvider } from '../provider/base-provider.js';
24
+ import { SimpleSession } from '../session/simple-session.js';
25
+ import { StreamingSession } from '../session/streaming-session.js';
26
+ import { NoOpFileManager } from '../provider/noop-file-manager.js';
27
+ export class MockProvider extends BaseProvider {
28
+ calls = [];
29
+ modelSource;
30
+ fileManagerInstance;
31
+ loggerInstance;
32
+ defaultModelId;
33
+ pricingConfig;
34
+ providerTypeId;
35
+ constructor(config) {
36
+ super();
37
+ if (!config.model && !config.modelFactory) {
38
+ throw new Error('MockProvider requires either model or modelFactory');
39
+ }
40
+ this.modelSource = config.modelFactory ?? config.model;
41
+ this.fileManagerInstance = config.fileManager ?? new NoOpFileManager();
42
+ this.loggerInstance = config.logger ?? noopLogger;
43
+ this.defaultModelId = null;
44
+ this.providerTypeId = config.providerType ?? 'mock';
45
+ }
46
+ /**
47
+ * Creates instance for fluent API without calling constructor.
48
+ * Shares calls array between fluent instances for tracking.
49
+ */
50
+ static createWithConfig(modelSource, fileManager, logger, defaultModelId, pricingConfig, providerType, existingCalls) {
51
+ const provider = Object.create(MockProvider.prototype);
52
+ Object.assign(provider, {
53
+ modelSource,
54
+ fileManagerInstance: fileManager,
55
+ loggerInstance: logger,
56
+ defaultModelId,
57
+ pricingConfig,
58
+ providerTypeId: providerType,
59
+ calls: existingCalls,
60
+ });
61
+ return provider;
62
+ }
63
+ getCalls() {
64
+ return [...this.calls];
65
+ }
66
+ clearCalls() {
67
+ this.calls.length = 0;
68
+ }
69
+ withDefaultModel(modelId) {
70
+ return MockProvider.createWithConfig(this.modelSource, this.fileManagerInstance, this.loggerInstance, modelId, this.pricingConfig, this.providerTypeId, this.calls);
71
+ }
72
+ withLogger(logger) {
73
+ return MockProvider.createWithConfig(this.modelSource, this.fileManagerInstance, logger, this.defaultModelId, this.pricingConfig, this.providerTypeId, this.calls);
74
+ }
75
+ withPricing(pricing) {
76
+ return MockProvider.createWithConfig(this.modelSource, this.fileManagerInstance, this.loggerInstance, this.defaultModelId, pricing, this.providerTypeId, this.calls);
77
+ }
78
+ /**
79
+ * Mock implementation - returns same provider since mocks don't use provider options.
80
+ */
81
+ withDefaultOptions(_options) {
82
+ return this;
83
+ }
84
+ /**
85
+ * Mock implementation - returns same provider since mocks don't use generation options.
86
+ */
87
+ withDefaultGenerationOptions(_options) {
88
+ return this;
89
+ }
90
+ createSimpleSession(signal) {
91
+ return new SimpleSession({ ...this.buildSessionConfig(), signal });
92
+ }
93
+ createStreamingSession(signal) {
94
+ return new StreamingSession({ ...this.buildSessionConfig(), signal });
95
+ }
96
+ buildSessionConfig() {
97
+ const effectiveModelId = this.defaultModelId ?? 'default';
98
+ return {
99
+ defaultLanguageModel: this.createTrackingModel(effectiveModelId),
100
+ modelFactory: (modelId) => this.createTrackingModel(modelId),
101
+ providerType: this.providerTypeId,
102
+ providerPricing: this.pricingConfig,
103
+ fileManager: this.fileManagerInstance,
104
+ logger: this.loggerInstance,
105
+ };
106
+ }
107
+ getBaseModel(modelId) {
108
+ if (typeof this.modelSource === 'function') {
109
+ return this.modelSource(modelId);
110
+ }
111
+ return this.modelSource;
112
+ }
113
+ createTrackingModel(modelId) {
114
+ const baseModel = this.getBaseModel(modelId);
115
+ const calls = this.calls;
116
+ return {
117
+ ...baseModel,
118
+ specificationVersion: baseModel.specificationVersion,
119
+ provider: baseModel.provider,
120
+ modelId: baseModel.modelId,
121
+ supportedUrls: baseModel.supportedUrls,
122
+ doGenerate: async (params) => {
123
+ calls.push({
124
+ modelId,
125
+ type: 'generate',
126
+ timestamp: Date.now(),
127
+ params,
128
+ });
129
+ return baseModel.doGenerate(params);
130
+ },
131
+ doStream: async (params) => {
132
+ calls.push({
133
+ modelId,
134
+ type: 'stream',
135
+ timestamp: Date.now(),
136
+ params,
137
+ });
138
+ return baseModel.doStream(params);
139
+ },
140
+ };
141
+ }
142
+ }
143
+ export function createMockProvider(configOrModel) {
144
+ if (typeof configOrModel === 'function') {
145
+ return new MockProvider({ modelFactory: configOrModel });
146
+ }
147
+ if (configOrModel instanceof MockLanguageModelV3) {
148
+ return new MockProvider({ model: configOrModel });
149
+ }
150
+ return new MockProvider(configOrModel);
151
+ }
152
+ //# sourceMappingURL=mock-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-provider.js","sourceRoot":"","sources":["../../src/testing/mock-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Mock factory functions for AI SDK testing.
3
+ *
4
+ * Provides convenient helpers to create MockLanguageModelV3 instances
5
+ * with predefined responses for unit testing.
6
+ *
7
+ * @example
8
+ * import { generateText } from 'ai';
9
+ * import { mock } from '@agtlantis/core/testing';
10
+ *
11
+ * const result = await generateText({
12
+ * model: mock.text('Hello, world!'),
13
+ * prompt: 'Say hello',
14
+ * });
15
+ */
16
+ import { MockLanguageModelV3 } from 'ai/test';
17
+ import { MockProvider, type MockProviderConfig, type ModelFactory } from './mock-provider.js';
18
+ type DoGenerateResult = Awaited<ReturnType<MockLanguageModelV3['doGenerate']>>;
19
+ export type ResponseOptions = Partial<Omit<DoGenerateResult, 'content'>>;
20
+ interface MockHelpers {
21
+ text(text: string, options?: ResponseOptions): MockLanguageModelV3;
22
+ json<T>(data: T, options?: ResponseOptions): MockLanguageModelV3;
23
+ stream(chunks: string[], options?: ResponseOptions): MockLanguageModelV3;
24
+ error(error: Error): MockLanguageModelV3;
25
+ provider(configOrModel: MockProviderConfig | MockLanguageModelV3 | ModelFactory): MockProvider;
26
+ }
27
+ export declare const mock: MockHelpers;
28
+ export {};
29
+ //# sourceMappingURL=mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,mBAAmB,EAA0B,MAAM,SAAS,CAAC;AACtE,OAAO,EACH,YAAY,EAEZ,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACpB,MAAM,oBAAoB,CAAC;AAE5B,KAAK,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAE/E,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;AAYzE,UAAU,WAAW;IACjB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAAC;IACnE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAAC;IACjE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAAC;IACzE,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,mBAAmB,CAAC;IACzC,QAAQ,CAAC,aAAa,EAAE,kBAAkB,GAAG,mBAAmB,GAAG,YAAY,GAAG,YAAY,CAAC;CAClG;AAED,eAAO,MAAM,IAAI,EAAE,WAmIlB,CAAC"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Mock factory functions for AI SDK testing.
3
+ *
4
+ * Provides convenient helpers to create MockLanguageModelV3 instances
5
+ * with predefined responses for unit testing.
6
+ *
7
+ * @example
8
+ * import { generateText } from 'ai';
9
+ * import { mock } from '@agtlantis/core/testing';
10
+ *
11
+ * const result = await generateText({
12
+ * model: mock.text('Hello, world!'),
13
+ * prompt: 'Say hello',
14
+ * });
15
+ */
16
+ import { MockLanguageModelV3, simulateReadableStream } from 'ai/test';
17
+ import { createMockProvider, } from './mock-provider.js';
18
+ const DEFAULT_USAGE = {
19
+ inputTokens: { total: 0, noCache: 0, cacheRead: undefined, cacheWrite: undefined },
20
+ outputTokens: { total: 0, text: 0, reasoning: undefined },
21
+ };
22
+ const DEFAULT_FINISH = {
23
+ unified: 'stop',
24
+ raw: undefined,
25
+ };
26
+ export const mock = {
27
+ /**
28
+ * Creates a MockLanguageModelV3 that returns text content.
29
+ *
30
+ * @param text - The text to return from generateText
31
+ * @param options - Optional overrides for usage, finishReason, etc.
32
+ *
33
+ * @example
34
+ * const model = mock.text('Hello, world!');
35
+ *
36
+ * @example
37
+ * // With custom usage for cost calculation tests
38
+ * const model = mock.text('Hello', {
39
+ * usage: {
40
+ * inputTokens: { total: 100 },
41
+ * outputTokens: { total: 50 },
42
+ * },
43
+ * });
44
+ */
45
+ text(text, options) {
46
+ return new MockLanguageModelV3({
47
+ doGenerate: async () => ({
48
+ content: [{ type: 'text', text }],
49
+ finishReason: options?.finishReason ?? DEFAULT_FINISH,
50
+ usage: options?.usage ?? DEFAULT_USAGE,
51
+ warnings: options?.warnings ?? [],
52
+ providerMetadata: options?.providerMetadata,
53
+ }),
54
+ });
55
+ },
56
+ /**
57
+ * Creates a MockLanguageModelV3 that returns JSON content.
58
+ *
59
+ * Automatically stringifies the data. Use with generateObject or
60
+ * generateText + Output.object.
61
+ *
62
+ * @param data - The object to return as JSON
63
+ * @param options - Optional overrides for usage, finishReason, etc.
64
+ *
65
+ * @example
66
+ * const model = mock.json({ name: 'Alice', age: 30 });
67
+ */
68
+ json(data, options) {
69
+ return mock.text(JSON.stringify(data), options);
70
+ },
71
+ /**
72
+ * Creates a MockLanguageModelV3 that streams text chunks.
73
+ *
74
+ * @param chunks - Array of text strings to stream
75
+ * @param options - Optional overrides for finishReason, usage, etc.
76
+ *
77
+ * @example
78
+ * const model = mock.stream(['Hello', ', ', 'world!']);
79
+ */
80
+ stream(chunks, options) {
81
+ return new MockLanguageModelV3({
82
+ doStream: async () => ({
83
+ stream: simulateReadableStream({
84
+ chunks: [
85
+ { type: 'text-start', id: 'text-1' },
86
+ ...chunks.map((chunk) => ({
87
+ type: 'text-delta',
88
+ id: 'text-1',
89
+ delta: chunk,
90
+ })),
91
+ { type: 'text-end', id: 'text-1' },
92
+ {
93
+ type: 'finish',
94
+ finishReason: options?.finishReason ?? DEFAULT_FINISH,
95
+ usage: options?.usage ?? DEFAULT_USAGE,
96
+ logprobs: undefined,
97
+ },
98
+ ],
99
+ }),
100
+ }),
101
+ });
102
+ },
103
+ /**
104
+ * Creates a MockLanguageModelV3 that throws an error.
105
+ *
106
+ * @param error - The error to throw
107
+ *
108
+ * @example
109
+ * const model = mock.error(new Error('Rate limit exceeded'));
110
+ *
111
+ * await expect(generateText({ model, prompt: 'Hi' }))
112
+ * .rejects.toThrow('Rate limit exceeded');
113
+ */
114
+ error(error) {
115
+ return new MockLanguageModelV3({
116
+ doGenerate: async () => {
117
+ throw error;
118
+ },
119
+ doStream: async () => {
120
+ throw error;
121
+ },
122
+ });
123
+ },
124
+ /**
125
+ * Creates a MockProvider with call tracking.
126
+ *
127
+ * Supports three input styles:
128
+ * - Single model: `mock.provider(mock.text('Hello'))`
129
+ * - Model factory: `mock.provider((modelId) => mock.text(modelId))`
130
+ * - Full config: `mock.provider({ model, fileManager, logger })`
131
+ *
132
+ * @example
133
+ * ```typescript
134
+ * // Basic usage
135
+ * const provider = mock.provider(mock.text('Hello!'));
136
+ * const execution = provider.simpleExecution(async (session) => {
137
+ * const { text } = await session.generateText({ prompt: 'Say hi' });
138
+ * return text;
139
+ * });
140
+ * expect(await execution.toResult()).toBe('Hello!');
141
+ * expect(provider.getCalls()).toHaveLength(1);
142
+ *
143
+ * // With model factory for different responses per model
144
+ * const provider = mock.provider((modelId) => {
145
+ * if (modelId === 'gpt-4') return mock.text('GPT-4 response');
146
+ * return mock.text('Default response');
147
+ * });
148
+ * ```
149
+ */
150
+ provider(configOrModel) {
151
+ return createMockProvider(configOrModel);
152
+ },
153
+ };
154
+ //# sourceMappingURL=mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/testing/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAEH,kBAAkB,GAGrB,MAAM,oBAAoB,CAAC;AAM5B,MAAM,aAAa,GAA8B;IAC7C,WAAW,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE;IAClF,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE;CAC5D,CAAC;AAEF,MAAM,cAAc,GAAqC;IACrD,OAAO,EAAE,MAAM;IACf,GAAG,EAAE,SAAS;CACjB,CAAC;AAUF,MAAM,CAAC,MAAM,IAAI,GAAgB;IAC7B;;;;;;;;;;;;;;;;;OAiBG;IACH,IAAI,CAAC,IAAY,EAAE,OAAyB;QACxC,OAAO,IAAI,mBAAmB,CAAC;YAC3B,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACrB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACjC,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,cAAc;gBACrD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,aAAa;gBACtC,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE;gBACjC,gBAAgB,EAAE,OAAO,EAAE,gBAAgB;aAC9C,CAAC;SACL,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;;;;OAWG;IACH,IAAI,CAAI,IAAO,EAAE,OAAyB;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAgB,EAAE,OAAyB;QAC9C,OAAO,IAAI,mBAAmB,CAAC;YAC3B,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;gBACnB,MAAM,EAAE,sBAAsB,CAAC;oBAC3B,MAAM,EAAE;wBACJ,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE;wBACpC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BACtB,IAAI,EAAE,YAAqB;4BAC3B,EAAE,EAAE,QAAQ;4BACZ,KAAK,EAAE,KAAK;yBACf,CAAC,CAAC;wBACH,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE;wBAClC;4BACI,IAAI,EAAE,QAAQ;4BACd,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,cAAc;4BACrD,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,aAAa;4BACtC,QAAQ,EAAE,SAAS;yBACtB;qBACJ;iBACJ,CAAC;aACL,CAAC;SACL,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAY;QACd,OAAO,IAAI,mBAAmB,CAAC;YAC3B,UAAU,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,KAAK,CAAC;YAChB,CAAC;YACD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACjB,MAAM,KAAK,CAAC;YAChB,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,QAAQ,CAAC,aAAsE;QAC3E,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC7C,CAAC;CACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { StreamingExecution, ExtractResult, EmittableEventInput } from '../execution/types.js';
2
+ export declare function createTestExecution<TEvent extends {
3
+ type: string;
4
+ }>(result: ExtractResult<TEvent>, events?: EmittableEventInput<TEvent>[]): StreamingExecution<TEvent>;
5
+ export declare function createTestErrorExecution<TEvent extends {
6
+ type: string;
7
+ }>(error: Error, options?: {
8
+ events?: EmittableEventInput<TEvent>[];
9
+ data?: ExtractResult<TEvent>;
10
+ }): StreamingExecution<TEvent>;
11
+ export declare function createTestCanceledExecution<TEvent extends {
12
+ type: string;
13
+ }>(events?: EmittableEventInput<TEvent>[]): StreamingExecution<TEvent>;
14
+ //# sourceMappingURL=test-execution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-execution.d.ts","sourceRoot":"","sources":["../../src/testing/test-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAGlB,aAAa,EACb,mBAAmB,EAEtB,MAAM,uBAAuB,CAAC;AAQ/B,wBAAgB,mBAAmB,CAAC,MAAM,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAC/D,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,GAAE,mBAAmB,CAAC,MAAM,CAAC,EAAO,GAC3C,kBAAkB,CAAC,MAAM,CAAC,CA4C5B;AAED,wBAAgB,wBAAwB,CAAC,MAAM,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACpE,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAO,GACvF,kBAAkB,CAAC,MAAM,CAAC,CAkD5B;AAED,wBAAgB,2BAA2B,CAAC,MAAM,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EACvE,MAAM,GAAE,mBAAmB,CAAC,MAAM,CAAC,EAAO,GAC3C,kBAAkB,CAAC,MAAM,CAAC,CAkC5B"}
@@ -0,0 +1,108 @@
1
+ import { SessionSummary } from '../session/types.js';
2
+ function createTestMetrics() {
3
+ return { timestamp: Date.now(), elapsedMs: 0, deltaMs: 0 };
4
+ }
5
+ export function createTestExecution(result, events = []) {
6
+ const summary = SessionSummary.forTest({});
7
+ const completionEvent = {
8
+ type: 'complete',
9
+ data: result,
10
+ summary,
11
+ metrics: createTestMetrics(),
12
+ };
13
+ const allEvents = [
14
+ ...events.map((e) => ({ ...e, metrics: createTestMetrics() })),
15
+ completionEvent,
16
+ ];
17
+ return {
18
+ stream() {
19
+ return {
20
+ [Symbol.asyncIterator]() {
21
+ let index = 0;
22
+ return {
23
+ async next() {
24
+ if (index < allEvents.length) {
25
+ return { value: allEvents[index++], done: false };
26
+ }
27
+ return { value: undefined, done: true };
28
+ },
29
+ };
30
+ },
31
+ };
32
+ },
33
+ async result() {
34
+ return { status: 'succeeded', value: result, events: allEvents, summary };
35
+ },
36
+ cancel() { },
37
+ async cleanup() { },
38
+ async [Symbol.asyncDispose]() { },
39
+ };
40
+ }
41
+ export function createTestErrorExecution(error, options = {}) {
42
+ const summary = SessionSummary.forTest({});
43
+ const errorEvent = {
44
+ type: 'error',
45
+ error,
46
+ summary,
47
+ metrics: createTestMetrics(),
48
+ };
49
+ if (options.data !== undefined) {
50
+ errorEvent.data = options.data;
51
+ }
52
+ const typedErrorEvent = errorEvent;
53
+ const allEvents = [
54
+ ...(options.events ?? []).map((e) => ({ ...e, metrics: createTestMetrics() })),
55
+ typedErrorEvent,
56
+ ];
57
+ return {
58
+ stream() {
59
+ return {
60
+ [Symbol.asyncIterator]() {
61
+ let index = 0;
62
+ return {
63
+ async next() {
64
+ if (index < allEvents.length) {
65
+ return { value: allEvents[index++], done: false };
66
+ }
67
+ return { value: undefined, done: true };
68
+ },
69
+ };
70
+ },
71
+ };
72
+ },
73
+ async result() {
74
+ return { status: 'failed', error, events: allEvents, summary };
75
+ },
76
+ cancel() { },
77
+ async cleanup() { },
78
+ async [Symbol.asyncDispose]() { },
79
+ };
80
+ }
81
+ export function createTestCanceledExecution(events = []) {
82
+ const summary = SessionSummary.forTest({});
83
+ const allEvents = events.map((e) => ({ ...e, metrics: createTestMetrics() }));
84
+ return {
85
+ stream() {
86
+ return {
87
+ [Symbol.asyncIterator]() {
88
+ let index = 0;
89
+ return {
90
+ async next() {
91
+ if (index < allEvents.length) {
92
+ return { value: allEvents[index++], done: false };
93
+ }
94
+ return { value: undefined, done: true };
95
+ },
96
+ };
97
+ },
98
+ };
99
+ },
100
+ async result() {
101
+ return { status: 'canceled', events: allEvents, summary };
102
+ },
103
+ cancel() { },
104
+ async cleanup() { },
105
+ async [Symbol.asyncDispose]() { },
106
+ };
107
+ }
108
+ //# sourceMappingURL=test-execution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-execution.js","sourceRoot":"","sources":["../../src/testing/test-execution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ⚠️ WARNING: Designed for shallow-nested plain objects (e.g., ProviderOptions).
3
+ * Not a full lodash/merge replacement — does not handle circular refs, class instances, or Symbols.
4
+ */
5
+ export declare function deepMerge(...sources: (Record<string, unknown> | undefined | null)[]): Record<string, unknown>;
6
+ //# sourceMappingURL=deep-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.d.ts","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,SAAS,CACvB,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,GACzD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
@@ -0,0 +1,24 @@
1
+ function isPlainObject(value) {
2
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ }
4
+ /**
5
+ * ⚠️ WARNING: Designed for shallow-nested plain objects (e.g., ProviderOptions).
6
+ * Not a full lodash/merge replacement — does not handle circular refs, class instances, or Symbols.
7
+ */
8
+ export function deepMerge(...sources) {
9
+ const result = {};
10
+ for (const source of sources) {
11
+ if (!source)
12
+ continue;
13
+ for (const key of Object.keys(source)) {
14
+ const existing = result[key];
15
+ const incoming = source[key];
16
+ result[key] =
17
+ isPlainObject(existing) && isPlainObject(incoming)
18
+ ? deepMerge(existing, incoming)
19
+ : incoming;
20
+ }
21
+ }
22
+ return result;
23
+ }
24
+ //# sourceMappingURL=deep-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deep-merge.js","sourceRoot":"","sources":["../../src/utils/deep-merge.ts"],"names":[],"mappings":"AAAA,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,GAAG,OAAuD;IAE1D,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAE7B,MAAM,CAAC,GAAG,CAAC;gBACT,aAAa,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC;oBAChD,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;oBAC/B,CAAC,CAAC,QAAQ,CAAC;QACjB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { AgtlantisError, type AgtlantisErrorCode } from '../errors/index.js';
2
+ import type { ReadonlyValidationHistory } from './types.js';
3
+ export declare enum ValidationErrorCode {
4
+ VALIDATION_EXHAUSTED = "VALIDATION_EXHAUSTED"
5
+ }
6
+ /**
7
+ * Error thrown when validation fails after all attempts are exhausted.
8
+ * Contains the full validation history for debugging and partial result recovery.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * try {
13
+ * const result = await withValidation(execute, options);
14
+ * } catch (e) {
15
+ * if (e instanceof ValidationExhaustedError) {
16
+ * console.log(`Failed after ${e.history.all.length} attempts`);
17
+ * console.log('Last result:', e.history.last?.result);
18
+ * console.log('All failures:', e.history.failureReasons);
19
+ * console.log('Error code:', e.code); // 'VALIDATION_EXHAUSTED'
20
+ * }
21
+ * }
22
+ * ```
23
+ */
24
+ export declare class ValidationExhaustedError<TResult> extends AgtlantisError<ValidationErrorCode & AgtlantisErrorCode> {
25
+ readonly history: ReadonlyValidationHistory<TResult>;
26
+ constructor(message: string, history: ReadonlyValidationHistory<TResult>);
27
+ }
28
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/validation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,oBAAY,mBAAmB;IAC7B,oBAAoB,yBAAyB;CAC9C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,wBAAwB,CAAC,OAAO,CAAE,SAAQ,cAAc,CACnE,mBAAmB,GAAG,kBAAkB,CACzC;aAGmB,OAAO,EAAE,yBAAyB,CAAC,OAAO,CAAC;IAF7D,YACE,OAAO,EAAE,MAAM,EACC,OAAO,EAAE,yBAAyB,CAAC,OAAO,CAAC,EAU5D;CACF"}
@@ -0,0 +1,38 @@
1
+ import { AgtlantisError } from '../errors/index.js';
2
+ export var ValidationErrorCode;
3
+ (function (ValidationErrorCode) {
4
+ ValidationErrorCode["VALIDATION_EXHAUSTED"] = "VALIDATION_EXHAUSTED";
5
+ })(ValidationErrorCode || (ValidationErrorCode = {}));
6
+ /**
7
+ * Error thrown when validation fails after all attempts are exhausted.
8
+ * Contains the full validation history for debugging and partial result recovery.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * try {
13
+ * const result = await withValidation(execute, options);
14
+ * } catch (e) {
15
+ * if (e instanceof ValidationExhaustedError) {
16
+ * console.log(`Failed after ${e.history.all.length} attempts`);
17
+ * console.log('Last result:', e.history.last?.result);
18
+ * console.log('All failures:', e.history.failureReasons);
19
+ * console.log('Error code:', e.code); // 'VALIDATION_EXHAUSTED'
20
+ * }
21
+ * }
22
+ * ```
23
+ */
24
+ export class ValidationExhaustedError extends AgtlantisError {
25
+ history;
26
+ constructor(message, history) {
27
+ super(message, {
28
+ code: ValidationErrorCode.VALIDATION_EXHAUSTED,
29
+ context: {
30
+ attempts: history.all.length,
31
+ failureReasons: history.failureReasons,
32
+ },
33
+ });
34
+ this.history = history;
35
+ this.name = 'ValidationExhaustedError';
36
+ }
37
+ }
38
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/validation/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA2B,MAAM,oBAAoB,CAAC;AAG7E,MAAM,CAAN,IAAY,mBAEX;AAFD,WAAY,mBAAmB;IAC7B,oEAA6C,CAAA;AAC/C,CAAC,EAFW,mBAAmB,KAAnB,mBAAmB,QAE9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,wBAAkC,SAAQ,cAEtD;IAGmB,OAAO;IAFzB,YACE,OAAe,EACC,OAA2C;QAE3D,KAAK,CAAC,OAAO,EAAE;YACb,IAAI,EAAE,mBAAmB,CAAC,oBAAgE;YAC1F,OAAO,EAAE;gBACP,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;gBAC5B,cAAc,EAAE,OAAO,CAAC,cAAc;aACvC;SACF,CAAC,CAAC;uBARa,OAAO;QASvB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export type { ValidationResult, ValidationAttempt, ValidationOptions, ReadonlyValidationHistory, } from './types.js';
2
+ export { ValidationHistory } from './validation-history.js';
3
+ export { ValidationErrorCode, ValidationExhaustedError } from './errors.js';
4
+ export { withValidation } from './with-validation.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ValidationHistory } from './validation-history.js';
2
+ export { ValidationErrorCode, ValidationExhaustedError } from './errors.js';
3
+ export { withValidation } from './with-validation.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/validation/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}