@outputai/core 0.14.1-next.bd031f8.0 → 0.14.1-next.e9dfa49.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 (103) 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 +25 -14
  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/helpers/search_attributes.js +25 -0
  24. package/src/helpers/temporal_context.js +4 -1
  25. package/src/hooks/index.d.ts +6 -8
  26. package/src/hooks/index.js +0 -3
  27. package/src/interface/workflow.js +10 -2
  28. package/src/logger/index.d.ts +4 -0
  29. package/src/worker/index.js +3 -1
  30. package/bin/healthcheck.spec.js +0 -90
  31. package/src/bus.spec.js +0 -196
  32. package/src/errors.spec.js +0 -19
  33. package/src/helpers/activity_options.spec.js +0 -55
  34. package/src/helpers/component.spec.js +0 -54
  35. package/src/helpers/error_serializer.spec.js +0 -479
  36. package/src/helpers/errors.spec.js +0 -189
  37. package/src/helpers/fetch.spec.js +0 -292
  38. package/src/helpers/function.spec.js +0 -24
  39. package/src/helpers/object.spec.js +0 -425
  40. package/src/helpers/promise.spec.js +0 -62
  41. package/src/helpers/redact.spec.js +0 -66
  42. package/src/helpers/string.spec.js +0 -99
  43. package/src/helpers/temporal_context.spec.ts +0 -83
  44. package/src/helpers/trace_info.spec.js +0 -45
  45. package/src/helpers/workflow_context.spec.js +0 -46
  46. package/src/hooks/index.spec.js +0 -265
  47. package/src/hooks/pending_hooks.spec.js +0 -62
  48. package/src/interface/evaluator.spec.js +0 -685
  49. package/src/interface/logger.spec.js +0 -172
  50. package/src/interface/step.spec.js +0 -128
  51. package/src/interface/validations/index.spec.js +0 -197
  52. package/src/interface/validations/schemas.spec.js +0 -229
  53. package/src/interface/webhook.spec.js +0 -170
  54. package/src/interface/workflow.spec.js +0 -710
  55. package/src/interface/workflow_utils.spec.js +0 -271
  56. package/src/interface/zod_integration.spec.js +0 -646
  57. package/src/internal_activities/index.spec.js +0 -186
  58. package/src/logger/development.spec.js +0 -87
  59. package/src/logger/index.spec.js +0 -27
  60. package/src/logger/production.spec.js +0 -71
  61. package/src/sdk/helpers/component_metadata.spec.js +0 -30
  62. package/src/sdk/helpers/objects.spec.js +0 -16
  63. package/src/sdk/helpers/path.spec.js +0 -102
  64. package/src/sdk/runtime/context.spec.js +0 -37
  65. package/src/sdk/runtime/events.spec.js +0 -40
  66. package/src/temporal/client.spec.js +0 -124
  67. package/src/tracing/processors/local/index.spec.js +0 -204
  68. package/src/tracing/processors/s3/configs.spec.js +0 -64
  69. package/src/tracing/processors/s3/index.spec.js +0 -185
  70. package/src/tracing/processors/s3/redis_client.spec.js +0 -179
  71. package/src/tracing/processors/s3/s3_client.spec.js +0 -68
  72. package/src/tracing/tools/build_trace_tree.spec.js +0 -216
  73. package/src/tracing/trace_engine.spec.js +0 -299
  74. package/src/worker/bundle.spec.js +0 -53
  75. package/src/worker/bundler_options.spec.js +0 -62
  76. package/src/worker/catalog_workflow/catalog_publisher.spec.js +0 -317
  77. package/src/worker/catalog_workflow/index.spec.js +0 -222
  78. package/src/worker/configs.spec.js +0 -213
  79. package/src/worker/configs_tuner_schema.spec.js +0 -127
  80. package/src/worker/connection_monitor.spec.js +0 -328
  81. package/src/worker/global_functions.spec.js +0 -55
  82. package/src/worker/index.spec.js +0 -526
  83. package/src/worker/interceptors/activity.spec.js +0 -369
  84. package/src/worker/interceptors/headers.spec.js +0 -73
  85. package/src/worker/interceptors/workflow.spec.js +0 -357
  86. package/src/worker/interruption.spec.js +0 -177
  87. package/src/worker/loader/activities.spec.js +0 -212
  88. package/src/worker/loader/hooks.spec.js +0 -64
  89. package/src/worker/loader/matchers.spec.js +0 -140
  90. package/src/worker/loader/tools.spec.js +0 -595
  91. package/src/worker/loader/workflows.spec.js +0 -287
  92. package/src/worker/log_hooks.spec.js +0 -303
  93. package/src/worker/shutdown.spec.js +0 -197
  94. package/src/worker/sinks.spec.js +0 -220
  95. package/src/worker/telemetry.spec.js +0 -80
  96. package/src/worker/temporal_logger.spec.js +0 -90
  97. package/src/worker/webpack_loaders/tools.spec.js +0 -314
  98. package/src/worker/webpack_loaders/workflow_rewriter/collect_target_imports.spec.js +0 -134
  99. package/src/worker/webpack_loaders/workflow_rewriter/index.spec.js +0 -154
  100. package/src/worker/webpack_loaders/workflow_rewriter/rewrite_activity_calls.spec.js +0 -165
  101. package/src/worker/webpack_loaders/workflow_validator/index.spec.js +0 -202
  102. package/src/worker/webpack_loaders/workflow_validator/npm_workflow_export_resolve.spec.js +0 -374
  103. 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
-