@outputai/core 0.14.0 → 0.14.1-next.51e8690.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 (100) hide show
  1. package/dist/credentials/credentials.d.ts +6 -0
  2. package/dist/credentials/credentials.js +87 -0
  3. package/dist/credentials/encrypted_yaml_provider.d.ts +2 -0
  4. package/dist/credentials/encrypted_yaml_provider.js +77 -0
  5. package/dist/credentials/encryption.d.ts +3 -0
  6. package/dist/credentials/encryption.js +6 -0
  7. package/dist/credentials/errors.d.ts +13 -0
  8. package/dist/credentials/errors.js +39 -0
  9. package/dist/credentials/index.d.ts +6 -0
  10. package/dist/credentials/index.js +5 -0
  11. package/dist/credentials/init.d.ts +1 -0
  12. package/dist/credentials/init.js +7 -0
  13. package/dist/credentials/paths.d.ts +7 -0
  14. package/dist/credentials/paths.js +14 -0
  15. package/dist/credentials/provider_registry.d.ts +3 -0
  16. package/dist/credentials/provider_registry.js +6 -0
  17. package/dist/credentials/types.d.ts +12 -0
  18. package/dist/credentials/types.js +1 -0
  19. package/package.json +14 -3
  20. package/src/async_storage.d.ts +4 -0
  21. package/src/consts.js +0 -2
  22. package/src/helpers/object.d.ts +2 -0
  23. package/src/hooks/index.d.ts +0 -8
  24. package/src/hooks/index.js +0 -3
  25. package/src/logger/index.d.ts +4 -0
  26. package/src/worker/index.js +3 -1
  27. package/bin/healthcheck.spec.js +0 -90
  28. package/src/bus.spec.js +0 -196
  29. package/src/errors.spec.js +0 -19
  30. package/src/helpers/activity_options.spec.js +0 -55
  31. package/src/helpers/component.spec.js +0 -54
  32. package/src/helpers/error_serializer.spec.js +0 -479
  33. package/src/helpers/errors.spec.js +0 -189
  34. package/src/helpers/fetch.spec.js +0 -292
  35. package/src/helpers/function.spec.js +0 -24
  36. package/src/helpers/object.spec.js +0 -425
  37. package/src/helpers/promise.spec.js +0 -62
  38. package/src/helpers/redact.spec.js +0 -66
  39. package/src/helpers/string.spec.js +0 -99
  40. package/src/helpers/temporal_context.spec.ts +0 -83
  41. package/src/helpers/trace_info.spec.js +0 -45
  42. package/src/helpers/workflow_context.spec.js +0 -46
  43. package/src/hooks/index.spec.js +0 -265
  44. package/src/hooks/pending_hooks.spec.js +0 -62
  45. package/src/interface/evaluator.spec.js +0 -685
  46. package/src/interface/logger.spec.js +0 -172
  47. package/src/interface/step.spec.js +0 -128
  48. package/src/interface/validations/index.spec.js +0 -197
  49. package/src/interface/validations/schemas.spec.js +0 -229
  50. package/src/interface/webhook.spec.js +0 -170
  51. package/src/interface/workflow.spec.js +0 -710
  52. package/src/interface/workflow_utils.spec.js +0 -271
  53. package/src/interface/zod_integration.spec.js +0 -646
  54. package/src/internal_activities/index.spec.js +0 -186
  55. package/src/logger/development.spec.js +0 -87
  56. package/src/logger/index.spec.js +0 -27
  57. package/src/logger/production.spec.js +0 -71
  58. package/src/sdk/helpers/component_metadata.spec.js +0 -30
  59. package/src/sdk/helpers/objects.spec.js +0 -16
  60. package/src/sdk/helpers/path.spec.js +0 -102
  61. package/src/sdk/runtime/context.spec.js +0 -37
  62. package/src/sdk/runtime/events.spec.js +0 -40
  63. package/src/temporal/client.spec.js +0 -124
  64. package/src/tracing/processors/local/index.spec.js +0 -204
  65. package/src/tracing/processors/s3/configs.spec.js +0 -64
  66. package/src/tracing/processors/s3/index.spec.js +0 -185
  67. package/src/tracing/processors/s3/redis_client.spec.js +0 -179
  68. package/src/tracing/processors/s3/s3_client.spec.js +0 -68
  69. package/src/tracing/tools/build_trace_tree.spec.js +0 -216
  70. package/src/tracing/trace_engine.spec.js +0 -299
  71. package/src/worker/bundle.spec.js +0 -53
  72. package/src/worker/bundler_options.spec.js +0 -62
  73. package/src/worker/catalog_workflow/catalog_publisher.spec.js +0 -317
  74. package/src/worker/catalog_workflow/index.spec.js +0 -222
  75. package/src/worker/configs.spec.js +0 -213
  76. package/src/worker/configs_tuner_schema.spec.js +0 -127
  77. package/src/worker/connection_monitor.spec.js +0 -328
  78. package/src/worker/global_functions.spec.js +0 -55
  79. package/src/worker/index.spec.js +0 -526
  80. package/src/worker/interceptors/activity.spec.js +0 -369
  81. package/src/worker/interceptors/headers.spec.js +0 -73
  82. package/src/worker/interceptors/workflow.spec.js +0 -357
  83. package/src/worker/interruption.spec.js +0 -177
  84. package/src/worker/loader/activities.spec.js +0 -212
  85. package/src/worker/loader/hooks.spec.js +0 -64
  86. package/src/worker/loader/matchers.spec.js +0 -140
  87. package/src/worker/loader/tools.spec.js +0 -595
  88. package/src/worker/loader/workflows.spec.js +0 -287
  89. package/src/worker/log_hooks.spec.js +0 -303
  90. package/src/worker/shutdown.spec.js +0 -197
  91. package/src/worker/sinks.spec.js +0 -220
  92. package/src/worker/telemetry.spec.js +0 -80
  93. package/src/worker/temporal_logger.spec.js +0 -90
  94. package/src/worker/webpack_loaders/tools.spec.js +0 -314
  95. package/src/worker/webpack_loaders/workflow_rewriter/collect_target_imports.spec.js +0 -134
  96. package/src/worker/webpack_loaders/workflow_rewriter/index.spec.js +0 -154
  97. package/src/worker/webpack_loaders/workflow_rewriter/rewrite_activity_calls.spec.js +0 -165
  98. package/src/worker/webpack_loaders/workflow_validator/index.spec.js +0 -202
  99. package/src/worker/webpack_loaders/workflow_validator/npm_workflow_export_resolve.spec.js +0 -374
  100. package/src/worker/worker_runner.spec.js +0 -220
@@ -1,685 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import {
3
- EvaluationResult,
4
- EvaluationStringResult,
5
- EvaluationNumberResult,
6
- EvaluationBooleanResult,
7
- EvaluationFeedback
8
- } from './evaluation_result.js';
9
- import { ValidationError } from '#errors';
10
-
11
- const validateDefinitionMock = vi.hoisted( () => vi.fn() );
12
- const parseInputMock = vi.hoisted( () => vi.fn( input => input ) );
13
- const parseOutputMock = vi.hoisted( () => vi.fn( output => output ) );
14
- const validatorConstructorMock = vi.hoisted( () => vi.fn() );
15
- const createEvaluatorMock = vi.hoisted( () => vi.fn( ( { handler } ) => handler ) );
16
-
17
- vi.mock( './validations/index.js', () => {
18
- class EvaluatorValidator {
19
- static validateDefinition( ...args ) {
20
- return validateDefinitionMock( ...args );
21
- }
22
-
23
- constructor( ...args ) {
24
- validatorConstructorMock( ...args );
25
- this.parseInput = parseInputMock;
26
- this.parseOutput = parseOutputMock;
27
- }
28
- }
29
-
30
- return { EvaluatorValidator };
31
- } );
32
-
33
- vi.mock( '#helpers/component', () => ( {
34
- createEvaluator: createEvaluatorMock
35
- } ) );
36
-
37
- describe( 'evaluator()', () => {
38
- beforeEach( () => {
39
- vi.clearAllMocks();
40
- } );
41
-
42
- it( 'validates the definition, creates a runtime validator, and creates an evaluator component', async () => {
43
- const { evaluator } = await import( './evaluator.js' );
44
- const inputSchema = { safeParse: vi.fn() };
45
- const fn = vi.fn().mockResolvedValue( new EvaluationResult( { value: 'ok', confidence: 1 } ) );
46
- const options = { activityOptions: { startToCloseTimeout: '1m' } };
47
-
48
- const wrapper = evaluator( {
49
- name: 'test_evaluator',
50
- description: 'Test evaluator',
51
- inputSchema,
52
- fn,
53
- options
54
- } );
55
-
56
- expect( validateDefinitionMock ).toHaveBeenCalledWith( {
57
- name: 'test_evaluator',
58
- description: 'Test evaluator',
59
- inputSchema,
60
- fn,
61
- options
62
- } );
63
- expect( validatorConstructorMock ).toHaveBeenCalledWith( {
64
- name: 'test_evaluator',
65
- inputSchema
66
- } );
67
-
68
- expect( createEvaluatorMock ).toHaveBeenCalledWith( {
69
- name: 'test_evaluator',
70
- description: 'Test evaluator',
71
- inputSchema,
72
- options,
73
- handler: expect.any( Function )
74
- } );
75
- expect( wrapper ).toBe( createEvaluatorMock.mock.calls[0][0].handler );
76
- } );
77
-
78
- it( 'validates input and output around the evaluator function', async () => {
79
- const { evaluator } = await import( './evaluator.js' );
80
- const output = new EvaluationResult( { value: 'ok', confidence: 1 } );
81
- const fn = vi.fn().mockResolvedValue( output );
82
- const wrapper = evaluator( {
83
- name: 'runtime_evaluator',
84
- inputSchema: undefined,
85
- fn
86
- } );
87
-
88
- await expect( wrapper( { value: 'input' } ) ).resolves.toBe( output );
89
-
90
- expect( parseInputMock ).toHaveBeenCalledWith( { value: 'input' } );
91
- expect( fn ).toHaveBeenCalledWith( { value: 'input' } );
92
- expect( parseOutputMock ).toHaveBeenCalledWith( output );
93
- } );
94
-
95
- it( 'does not call the evaluator function when input validation throws', async () => {
96
- const { evaluator } = await import( './evaluator.js' );
97
- const error = new ValidationError( 'invalid input' );
98
- parseInputMock.mockImplementationOnce( () => {
99
- throw error;
100
- } );
101
- const fn = vi.fn();
102
- const wrapper = evaluator( {
103
- name: 'invalid_input_evaluator',
104
- fn
105
- } );
106
-
107
- await expect( wrapper( { value: 'bad' } ) ).rejects.toBe( error );
108
- expect( fn ).not.toHaveBeenCalled();
109
- expect( parseOutputMock ).not.toHaveBeenCalled();
110
- } );
111
-
112
- it( 'propagates output validation errors after the evaluator function runs', async () => {
113
- const { evaluator } = await import( './evaluator.js' );
114
- const error = new ValidationError( 'invalid output' );
115
- parseOutputMock.mockImplementationOnce( () => {
116
- throw error;
117
- } );
118
- const output = { value: 'not-an-evaluation-result' };
119
- const fn = vi.fn().mockResolvedValue( output );
120
- const wrapper = evaluator( {
121
- name: 'invalid_output_evaluator',
122
- fn
123
- } );
124
-
125
- await expect( wrapper( { value: 'input' } ) ).rejects.toBe( error );
126
- expect( fn ).toHaveBeenCalledOnce();
127
- expect( parseOutputMock ).toHaveBeenCalledWith( output );
128
- } );
129
- } );
130
-
131
- describe( 'interface/evaluator - EvaluationResult classes', () => {
132
- describe( 'class inheritance', () => {
133
- it( 'subclasses extend EvaluationResult', () => {
134
- const s = new EvaluationStringResult( { value: 'ok', confidence: 0.8 } );
135
- const n = new EvaluationNumberResult( { value: 42, confidence: 1 } );
136
- const b = new EvaluationBooleanResult( { value: true, confidence: 0.5 } );
137
-
138
- expect( s ).toBeInstanceOf( EvaluationResult );
139
- expect( n ).toBeInstanceOf( EvaluationResult );
140
- expect( b ).toBeInstanceOf( EvaluationResult );
141
- } );
142
- } );
143
-
144
- describe( 'constructor payload validation', () => {
145
- it( 'base class validates presence and types of common fields', () => {
146
- // valid
147
- const base = new EvaluationResult( { value: { any: 'thing' }, confidence: 0.1 } );
148
- expect( base.value ).toEqual( { any: 'thing' } );
149
- expect( base.confidence ).toBe( 0.1 );
150
- expect( base.reasoning ).toBeUndefined();
151
-
152
- // invalid: missing confidence
153
- expect( () => new EvaluationResult( { value: 1 } ) ).toThrow( ValidationError );
154
-
155
- // invalid: confidence wrong type
156
- expect( () => new EvaluationResult( { value: 'x', confidence: 'nope' } ) ).toThrow( ValidationError );
157
-
158
- // invalid: reasoning wrong type
159
- expect( () => new EvaluationResult( { value: 'x', confidence: 1, reasoning: 123 } ) ).toThrow( ValidationError );
160
- } );
161
-
162
- it( 'string subclass enforces string value', () => {
163
- // valid
164
- const r = new EvaluationStringResult( { value: 'hello', confidence: 0.9 } );
165
- expect( r.value ).toBe( 'hello' );
166
-
167
- // invalid
168
- expect( () => new EvaluationStringResult( { value: 123, confidence: 0.2 } ) ).toThrow( ValidationError );
169
- } );
170
-
171
- it( 'number subclass enforces number value', () => {
172
- // valid
173
- const r = new EvaluationNumberResult( { value: 123, confidence: 0.2 } );
174
- expect( r.value ).toBe( 123 );
175
-
176
- // invalid
177
- expect( () => new EvaluationNumberResult( { value: 'nope', confidence: 0.2 } ) ).toThrow( ValidationError );
178
- } );
179
-
180
- it( 'boolean subclass enforces boolean value', () => {
181
- // valid
182
- const r = new EvaluationBooleanResult( { value: true, confidence: 1 } );
183
- expect( r.value ).toBe( true );
184
-
185
- // invalid
186
- expect( () => new EvaluationBooleanResult( { value: 'nope', confidence: 0.2 } ) ).toThrow( ValidationError );
187
- } );
188
- } );
189
-
190
- describe( 'static schema getter', () => {
191
- it( 'base schema accepts any value and optional reasoning', () => {
192
- const ok = EvaluationResult.schema.safeParse( { value: 'x', confidence: 0.5, reasoning: 'why' } );
193
- expect( ok.success ).toBe( true );
194
-
195
- const ok2 = EvaluationResult.schema.safeParse( { value: 123, confidence: 0.5 } );
196
- expect( ok2.success ).toBe( true );
197
- } );
198
-
199
- it( 'string schema requires value to be string', () => {
200
- const ok = EvaluationStringResult.schema.safeParse( { value: 'x', confidence: 1 } );
201
- expect( ok.success ).toBe( true );
202
-
203
- const bad = EvaluationStringResult.schema.safeParse( { value: 123, confidence: 1 } );
204
- expect( bad.success ).toBe( false );
205
- } );
206
-
207
- it( 'number schema requires value to be number', () => {
208
- const ok = EvaluationNumberResult.schema.safeParse( { value: 10, confidence: 1 } );
209
- expect( ok.success ).toBe( true );
210
-
211
- const bad = EvaluationNumberResult.schema.safeParse( { value: '10', confidence: 1 } );
212
- expect( bad.success ).toBe( false );
213
- } );
214
-
215
- it( 'boolean schema requires value to be boolean', () => {
216
- const ok = EvaluationBooleanResult.schema.safeParse( { value: false, confidence: 1 } );
217
- expect( ok.success ).toBe( true );
218
-
219
- const bad = EvaluationBooleanResult.schema.safeParse( { value: 'false', confidence: 1 } );
220
- expect( bad.success ).toBe( false );
221
- } );
222
-
223
- it( 'schema getter does not cause infinite recursion', () => {
224
- // Access schema multiple times to ensure no stack overflow
225
- const schema1 = EvaluationResult.schema;
226
- const schema2 = EvaluationResult.schema;
227
- const schema3 = EvaluationStringResult.schema;
228
- const schema4 = EvaluationNumberResult.schema;
229
- const schema5 = EvaluationBooleanResult.schema;
230
-
231
- expect( schema1 ).toBeDefined();
232
- expect( schema2 ).toBeDefined();
233
- expect( schema3 ).toBeDefined();
234
- expect( schema4 ).toBeDefined();
235
- expect( schema5 ).toBeDefined();
236
-
237
- // Verify schemas can be used for validation
238
- const result = schema1.safeParse( {
239
- value: 'test',
240
- confidence: 0.8,
241
- dimensions: [
242
- { value: 'dim1', confidence: 0.9 },
243
- { value: 42, confidence: 0.8 }
244
- ]
245
- } );
246
- expect( result.success ).toBe( true );
247
- } );
248
-
249
- it( 'schema includes dimensions field', () => {
250
- const schema = EvaluationResult.schema;
251
- const result = schema.safeParse( {
252
- value: 'test',
253
- confidence: 0.8,
254
- dimensions: [
255
- { value: 'string-dim', confidence: 0.9 },
256
- { value: 42, confidence: 0.8 },
257
- { value: true, confidence: 0.7 }
258
- ]
259
- } );
260
- expect( result.success ).toBe( true );
261
- if ( result.success ) {
262
- expect( result.data.dimensions ).toHaveLength( 3 );
263
- }
264
- } );
265
-
266
- it( 'schema validates dimensions value types', () => {
267
- const schema = EvaluationResult.schema;
268
-
269
- // Valid: primitive value types
270
- const valid = schema.safeParse( {
271
- value: 'test',
272
- confidence: 0.8,
273
- dimensions: [
274
- { value: 'string', confidence: 0.9 },
275
- { value: 42, confidence: 0.8 },
276
- { value: true, confidence: 0.7 }
277
- ]
278
- } );
279
- expect( valid.success ).toBe( true );
280
-
281
- // Invalid: non-primitive value type in dimensions
282
- const invalid = schema.safeParse( {
283
- value: 'test',
284
- confidence: 0.8,
285
- dimensions: [
286
- { value: { object: 'not allowed' }, confidence: 0.9 }
287
- ]
288
- } );
289
- expect( invalid.success ).toBe( false );
290
- } );
291
- } );
292
-
293
- describe( 'new fields: name, dimensions, feedback', () => {
294
- it( 'accepts optional name field', () => {
295
- const result = new EvaluationResult( {
296
- value: 'test',
297
- confidence: 0.8,
298
- name: 'test-evaluation'
299
- } );
300
- expect( result.name ).toBe( 'test-evaluation' );
301
- } );
302
-
303
- it( 'name defaults to undefined when not provided', () => {
304
- const result = new EvaluationResult( {
305
- value: 'test',
306
- confidence: 0.8
307
- } );
308
- expect( result.name ).toBeUndefined();
309
- } );
310
-
311
- it( 'validates name must be string if provided', () => {
312
- expect( () => new EvaluationResult( {
313
- value: 'test',
314
- confidence: 0.8,
315
- name: 123
316
- } ) ).toThrow( ValidationError );
317
- } );
318
-
319
- it( 'accepts dimensions array with EvaluationResult instances', () => {
320
- const dim1 = new EvaluationStringResult( { value: 'dim1', confidence: 0.9 } );
321
- const dim2 = new EvaluationNumberResult( { value: 42, confidence: 0.8 } );
322
- const result = new EvaluationResult( {
323
- value: 'main',
324
- confidence: 0.7,
325
- dimensions: [ dim1, dim2 ]
326
- } );
327
- expect( result.dimensions ).toHaveLength( 2 );
328
- expect( result.dimensions[0] ).toBe( dim1 );
329
- expect( result.dimensions[1] ).toBe( dim2 );
330
- } );
331
-
332
- it( 'dimensions defaults to empty array when not provided', () => {
333
- const result = new EvaluationResult( {
334
- value: 'test',
335
- confidence: 0.8
336
- } );
337
- expect( result.dimensions ).toEqual( [] );
338
- } );
339
-
340
- it( 'validates dimensions must match subclass schema', () => {
341
- expect( () => new EvaluationResult( {
342
- value: 'test',
343
- confidence: 0.8,
344
- dimensions: [ { invalid: 'object' } ]
345
- } ) ).toThrow( ValidationError );
346
- } );
347
-
348
- it( 'validates dimensions array structure', () => {
349
- expect( () => new EvaluationResult( {
350
- value: 'test',
351
- confidence: 0.8,
352
- dimensions: [
353
- { value: 'valid', confidence: 0.9 },
354
- { invalid: 'missing confidence' }
355
- ]
356
- } ) ).toThrow( ValidationError );
357
- } );
358
-
359
- it( 'accepts dimensions with all three subclass types', () => {
360
- const result = new EvaluationResult( {
361
- value: 'main',
362
- confidence: 0.7,
363
- dimensions: [
364
- new EvaluationStringResult( { value: 'string-dim', confidence: 0.9 } ),
365
- new EvaluationNumberResult( { value: 42, confidence: 0.8 } ),
366
- new EvaluationBooleanResult( { value: true, confidence: 0.7 } )
367
- ]
368
- } );
369
- expect( result.dimensions ).toHaveLength( 3 );
370
- expect( result.dimensions[0] ).toBeInstanceOf( EvaluationStringResult );
371
- expect( result.dimensions[1] ).toBeInstanceOf( EvaluationNumberResult );
372
- expect( result.dimensions[2] ).toBeInstanceOf( EvaluationBooleanResult );
373
- } );
374
-
375
- it( 'accepts plain objects matching subclass schemas in dimensions', () => {
376
- const result = new EvaluationResult( {
377
- value: 'main',
378
- confidence: 0.7,
379
- dimensions: [
380
- { value: 'string-dim', confidence: 0.9 },
381
- { value: 42, confidence: 0.8 },
382
- { value: true, confidence: 0.7 }
383
- ]
384
- } );
385
- expect( result.dimensions ).toHaveLength( 3 );
386
- expect( result.dimensions[0].value ).toBe( 'string-dim' );
387
- expect( result.dimensions[1].value ).toBe( 42 );
388
- expect( result.dimensions[2].value ).toBe( true );
389
- } );
390
-
391
- it( 'accepts string dimension value type', () => {
392
- const result = new EvaluationResult( {
393
- value: 'test',
394
- confidence: 0.8,
395
- dimensions: [
396
- { value: 'string-value', confidence: 0.9 }
397
- ]
398
- } );
399
- expect( result.dimensions[0].value ).toBe( 'string-value' );
400
- } );
401
-
402
- it( 'accepts number dimension value type', () => {
403
- const result = new EvaluationResult( {
404
- value: 'test',
405
- confidence: 0.8,
406
- dimensions: [
407
- { value: 123, confidence: 0.9 }
408
- ]
409
- } );
410
- expect( result.dimensions[0].value ).toBe( 123 );
411
- } );
412
-
413
- it( 'accepts boolean dimension value type', () => {
414
- const result = new EvaluationResult( {
415
- value: 'test',
416
- confidence: 0.8,
417
- dimensions: [
418
- { value: true, confidence: 0.9 }
419
- ]
420
- } );
421
- expect( result.dimensions[0].value ).toBe( true );
422
- } );
423
-
424
- it( 'rejects dimensions with non-primitive value types', () => {
425
- expect( () => new EvaluationResult( {
426
- value: 'test',
427
- confidence: 0.8,
428
- dimensions: [
429
- { value: { object: 'not allowed' }, confidence: 0.9 }
430
- ]
431
- } ) ).toThrow( ValidationError );
432
- } );
433
-
434
- it( 'rejects dimensions with array value types', () => {
435
- expect( () => new EvaluationResult( {
436
- value: 'test',
437
- confidence: 0.8,
438
- dimensions: [
439
- { value: [ 1, 2, 3 ], confidence: 0.9 }
440
- ]
441
- } ) ).toThrow( ValidationError );
442
- } );
443
-
444
- it( 'accepts nested dimensions (recursive)', () => {
445
- const nestedDim = new EvaluationStringResult( {
446
- value: 'nested',
447
- confidence: 0.9,
448
- dimensions: [
449
- new EvaluationNumberResult( { value: 10, confidence: 0.8 } )
450
- ]
451
- } );
452
- const result = new EvaluationResult( {
453
- value: 'main',
454
- confidence: 0.7,
455
- dimensions: [ nestedDim ]
456
- } );
457
- expect( result.dimensions ).toHaveLength( 1 );
458
- expect( result.dimensions[0].dimensions ).toHaveLength( 1 );
459
- expect( result.dimensions[0].dimensions[0].value ).toBe( 10 );
460
- } );
461
-
462
- it( 'accepts nested dimensions with plain objects', () => {
463
- const result = new EvaluationResult( {
464
- value: 'main',
465
- confidence: 0.7,
466
- dimensions: [
467
- {
468
- value: 'nested',
469
- confidence: 0.9,
470
- dimensions: [
471
- { value: 10, confidence: 0.8 }
472
- ]
473
- }
474
- ]
475
- } );
476
- expect( result.dimensions ).toHaveLength( 1 );
477
- expect( result.dimensions[0].dimensions ).toHaveLength( 1 );
478
- expect( result.dimensions[0].dimensions[0].value ).toBe( 10 );
479
- } );
480
-
481
- it( 'accepts feedback array with EvaluationFeedback instances', () => {
482
- const feedback1 = new EvaluationFeedback( {
483
- issue: 'Issue 1',
484
- suggestion: 'Fix this',
485
- priority: 'high'
486
- } );
487
- const feedback2 = new EvaluationFeedback( {
488
- issue: 'Issue 2',
489
- reference: 'ref-123'
490
- } );
491
- const result = new EvaluationResult( {
492
- value: 'test',
493
- confidence: 0.8,
494
- feedback: [ feedback1, feedback2 ]
495
- } );
496
- expect( result.feedback ).toHaveLength( 2 );
497
- expect( result.feedback[0] ).toBe( feedback1 );
498
- expect( result.feedback[1] ).toBe( feedback2 );
499
- } );
500
-
501
- it( 'accepts feedback array with plain objects matching schema', () => {
502
- const result = new EvaluationResult( {
503
- value: 'test',
504
- confidence: 0.8,
505
- feedback: [
506
- { issue: 'Issue 1', suggestion: 'Fix', priority: 'high' },
507
- { issue: 'Issue 2', reference: 'ref-123' }
508
- ]
509
- } );
510
- expect( result.feedback ).toHaveLength( 2 );
511
- expect( result.feedback[0].issue ).toBe( 'Issue 1' );
512
- expect( result.feedback[1].issue ).toBe( 'Issue 2' );
513
- } );
514
-
515
- it( 'feedback defaults to empty array when not provided', () => {
516
- const result = new EvaluationResult( {
517
- value: 'test',
518
- confidence: 0.8
519
- } );
520
- expect( result.feedback ).toEqual( [] );
521
- } );
522
-
523
- it( 'validates feedback must match EvaluationFeedback schema', () => {
524
- expect( () => new EvaluationResult( {
525
- value: 'test',
526
- confidence: 0.8,
527
- feedback: [ { invalid: 'object' } ]
528
- } ) ).toThrow( ValidationError );
529
- } );
530
-
531
- it( 'validates feedback issue is required', () => {
532
- expect( () => new EvaluationResult( {
533
- value: 'test',
534
- confidence: 0.8,
535
- feedback: [ { suggestion: 'missing issue' } ]
536
- } ) ).toThrow( ValidationError );
537
- } );
538
-
539
- it( 'validates feedback priority enum values', () => {
540
- expect( () => new EvaluationResult( {
541
- value: 'test',
542
- confidence: 0.8,
543
- feedback: [ { issue: 'test', priority: 'invalid' } ]
544
- } ) ).toThrow( ValidationError );
545
- } );
546
-
547
- it( 'accepts all new fields together', () => {
548
- const dim = new EvaluationStringResult( { value: 'dim', confidence: 0.9 } );
549
- const feedback = new EvaluationFeedback( { issue: 'test issue', priority: 'medium' } );
550
- const result = new EvaluationResult( {
551
- value: 'main',
552
- confidence: 0.8,
553
- name: 'comprehensive-test',
554
- dimensions: [ dim ],
555
- feedback: [ feedback ],
556
- reasoning: 'test reasoning'
557
- } );
558
- expect( result.name ).toBe( 'comprehensive-test' );
559
- expect( result.dimensions ).toHaveLength( 1 );
560
- expect( result.feedback ).toHaveLength( 1 );
561
- expect( result.reasoning ).toBe( 'test reasoning' );
562
- } );
563
- } );
564
- } );
565
-
566
- describe( 'interface/evaluator - EvaluationFeedback class', () => {
567
- describe( 'constructor', () => {
568
- it( 'creates feedback with required issue', () => {
569
- const feedback = new EvaluationFeedback( { issue: 'Test issue' } );
570
- expect( feedback.issue ).toBe( 'Test issue' );
571
- expect( feedback.suggestion ).toBeUndefined();
572
- expect( feedback.reference ).toBeUndefined();
573
- expect( feedback.priority ).toBeUndefined();
574
- } );
575
-
576
- it( 'creates feedback with all fields', () => {
577
- const feedback = new EvaluationFeedback( {
578
- issue: 'Critical bug',
579
- suggestion: 'Fix immediately',
580
- reference: 'BUG-123',
581
- priority: 'critical'
582
- } );
583
- expect( feedback.issue ).toBe( 'Critical bug' );
584
- expect( feedback.suggestion ).toBe( 'Fix immediately' );
585
- expect( feedback.reference ).toBe( 'BUG-123' );
586
- expect( feedback.priority ).toBe( 'critical' );
587
- } );
588
-
589
- it( 'accepts optional fields', () => {
590
- const feedback = new EvaluationFeedback( {
591
- issue: 'Minor issue',
592
- suggestion: 'Consider fixing'
593
- } );
594
- expect( feedback.issue ).toBe( 'Minor issue' );
595
- expect( feedback.suggestion ).toBe( 'Consider fixing' );
596
- expect( feedback.reference ).toBeUndefined();
597
- expect( feedback.priority ).toBeUndefined();
598
- } );
599
- } );
600
-
601
- describe( 'static schema getter', () => {
602
- it( 'validates required issue field', () => {
603
- const ok = EvaluationFeedback.schema.safeParse( { issue: 'Test issue' } );
604
- expect( ok.success ).toBe( true );
605
-
606
- const bad = EvaluationFeedback.schema.safeParse( {} );
607
- expect( bad.success ).toBe( false );
608
- } );
609
-
610
- it( 'validates issue must be string', () => {
611
- const bad = EvaluationFeedback.schema.safeParse( { issue: 123 } );
612
- expect( bad.success ).toBe( false );
613
- } );
614
-
615
- it( 'accepts optional suggestion field', () => {
616
- const ok = EvaluationFeedback.schema.safeParse( {
617
- issue: 'Test',
618
- suggestion: 'Fix it'
619
- } );
620
- expect( ok.success ).toBe( true );
621
- } );
622
-
623
- it( 'validates suggestion must be string if provided', () => {
624
- const bad = EvaluationFeedback.schema.safeParse( {
625
- issue: 'Test',
626
- suggestion: 123
627
- } );
628
- expect( bad.success ).toBe( false );
629
- } );
630
-
631
- it( 'accepts optional reference field', () => {
632
- const ok = EvaluationFeedback.schema.safeParse( {
633
- issue: 'Test',
634
- reference: 'REF-123'
635
- } );
636
- expect( ok.success ).toBe( true );
637
- } );
638
-
639
- it( 'validates reference must be string if provided', () => {
640
- const bad = EvaluationFeedback.schema.safeParse( {
641
- issue: 'Test',
642
- reference: 123
643
- } );
644
- expect( bad.success ).toBe( false );
645
- } );
646
-
647
- it( 'accepts valid priority enum values', () => {
648
- const priorities = [ 'low', 'medium', 'high', 'critical' ];
649
- for ( const priority of priorities ) {
650
- const ok = EvaluationFeedback.schema.safeParse( {
651
- issue: 'Test',
652
- priority
653
- } );
654
- expect( ok.success ).toBe( true );
655
- }
656
- } );
657
-
658
- it( 'rejects invalid priority values', () => {
659
- const bad = EvaluationFeedback.schema.safeParse( {
660
- issue: 'Test',
661
- priority: 'invalid'
662
- } );
663
- expect( bad.success ).toBe( false );
664
- } );
665
-
666
- it( 'validates priority must be string if provided', () => {
667
- const bad = EvaluationFeedback.schema.safeParse( {
668
- issue: 'Test',
669
- priority: 123
670
- } );
671
- expect( bad.success ).toBe( false );
672
- } );
673
-
674
- it( 'accepts all fields together', () => {
675
- const ok = EvaluationFeedback.schema.safeParse( {
676
- issue: 'Critical bug',
677
- suggestion: 'Fix immediately',
678
- reference: 'BUG-123',
679
- priority: 'critical'
680
- } );
681
- expect( ok.success ).toBe( true );
682
- } );
683
- } );
684
- } );
685
-