@operor/testing 0.1.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.
@@ -0,0 +1,414 @@
1
+ import { LLMProvider } from "@operor/llm";
2
+ import { Operor, Skill, Tool } from "@operor/core";
3
+
4
+ //#region src/types.d.ts
5
+ interface TestCase {
6
+ id: string;
7
+ question: string;
8
+ expectedAnswer?: string;
9
+ expectedTools?: string[];
10
+ persona?: string;
11
+ tags?: string[];
12
+ metadata?: Record<string, any>;
13
+ }
14
+ interface TestCaseResult {
15
+ testCase: TestCase;
16
+ agentResponse: string;
17
+ toolsCalled: Array<{
18
+ name: string;
19
+ params: any;
20
+ result: any;
21
+ }>;
22
+ evaluation: {
23
+ passed: boolean;
24
+ score: number;
25
+ method: 'exact' | 'contains' | 'similarity' | 'llm_judge';
26
+ reasoning: string;
27
+ toolsCorrect: boolean;
28
+ };
29
+ duration: number;
30
+ cost: number;
31
+ }
32
+ interface TestSuiteResult {
33
+ total: number;
34
+ passed: number;
35
+ failed: number;
36
+ averageScore: number;
37
+ byTag: Record<string, {
38
+ total: number;
39
+ passed: number;
40
+ avgScore: number;
41
+ }>;
42
+ results: TestCaseResult[];
43
+ totalDuration: number;
44
+ totalCost: number;
45
+ }
46
+ interface CustomerPersona {
47
+ name: string;
48
+ style: 'polite' | 'frustrated' | 'confused' | 'terse' | 'verbose';
49
+ context?: string;
50
+ }
51
+ interface ConversationSuccessCriteria {
52
+ type: 'tool_called' | 'response_contains' | 'intent_matched' | 'turns_under' | 'custom';
53
+ value: string | number | ((history: ConversationTurn[]) => boolean);
54
+ }
55
+ interface ConversationScenario {
56
+ id: string;
57
+ name: string;
58
+ description: string;
59
+ persona: string;
60
+ maxTurns: number;
61
+ expectedTools?: string[];
62
+ expectedOutcome?: string;
63
+ successCriteria?: ConversationSuccessCriteria[];
64
+ scriptedResponses?: string[];
65
+ }
66
+ interface ConversationTurn {
67
+ role: 'customer' | 'agent';
68
+ message: string;
69
+ toolCalls?: Array<{
70
+ name: string;
71
+ params: any;
72
+ result: any;
73
+ }>;
74
+ }
75
+ interface CustomerSimulatorResponse {
76
+ message: string;
77
+ shouldContinue: boolean;
78
+ }
79
+ interface CriteriaResult {
80
+ criteria: ConversationSuccessCriteria;
81
+ passed: boolean;
82
+ details: string;
83
+ }
84
+ interface ConversationEvaluation {
85
+ overall: 'pass' | 'fail' | 'partial';
86
+ scores: {
87
+ accuracy: number;
88
+ toolUsage: number;
89
+ tone: number;
90
+ resolution: number;
91
+ };
92
+ feedback: string;
93
+ criteriaResults?: CriteriaResult[];
94
+ }
95
+ interface ConversationTestResult {
96
+ scenario: ConversationScenario;
97
+ passed: boolean;
98
+ turns: ConversationTurn[];
99
+ evaluation: ConversationEvaluation;
100
+ duration: number;
101
+ cost: number;
102
+ }
103
+ interface SimulationConfig {
104
+ testSuiteFiles?: string[];
105
+ conversationScenarios?: ConversationScenario[] | 'builtin';
106
+ totalConversations?: number;
107
+ pauseBetweenMs?: number;
108
+ evaluationStrategy?: 'exact' | 'similarity' | 'llm_judge';
109
+ integrationMode?: 'mock' | 'real' | 'dry-run';
110
+ allowWrites?: boolean;
111
+ timeout?: number;
112
+ parallel?: boolean;
113
+ }
114
+ interface SimulationReport {
115
+ timestamp: Date;
116
+ duration: number;
117
+ totalConversations: number;
118
+ passed: number;
119
+ failed: number;
120
+ averageScores: {
121
+ accuracy: number;
122
+ toolUsage: number;
123
+ tone: number;
124
+ resolution: number;
125
+ };
126
+ scenarioBreakdown: Array<{
127
+ scenario: string;
128
+ runs: number;
129
+ passRate: number;
130
+ avgScore: number;
131
+ }>;
132
+ toolUsageStats: Record<string, number>;
133
+ commonFailurePatterns: string[];
134
+ recommendations: string[];
135
+ testSuiteResults: TestSuiteResult[];
136
+ conversationResults: ConversationTestResult[];
137
+ overallPassed: boolean;
138
+ totalCost: number;
139
+ summary: {
140
+ totalTests: number;
141
+ passedTests: number;
142
+ failedTests: number;
143
+ totalConversations: number;
144
+ passedConversations: number;
145
+ failedConversations: number;
146
+ overallPassRate: number;
147
+ };
148
+ }
149
+ //#endregion
150
+ //#region src/CSVLoader.d.ts
151
+ declare class CSVLoader {
152
+ static fromFile(path: string): Promise<TestCase[]>;
153
+ static fromCSVString(csv: string): TestCase[];
154
+ static fromJSON(json: string): TestCase[];
155
+ }
156
+ //#endregion
157
+ //#region src/TestCaseEvaluator.d.ts
158
+ interface EvaluationResult {
159
+ passed: boolean;
160
+ score: number;
161
+ method: 'exact' | 'contains' | 'similarity' | 'llm_judge';
162
+ reasoning: string;
163
+ toolsCorrect: boolean;
164
+ }
165
+ declare class TestCaseEvaluator {
166
+ private llm?;
167
+ constructor(llm?: LLMProvider);
168
+ evaluate(testCase: TestCase, agentResponse: string, toolsCalled: Array<{
169
+ name: string;
170
+ params: any;
171
+ result: any;
172
+ }>, strategy?: 'exact' | 'contains' | 'similarity' | 'semantic'): Promise<EvaluationResult>;
173
+ private validateTools;
174
+ private evaluateByExact;
175
+ private evaluateByContains;
176
+ private evaluateBySimilarity;
177
+ private evaluateByLLMComparison;
178
+ private evaluateByLLMJudge;
179
+ private normalizedLevenshtein;
180
+ }
181
+ //#endregion
182
+ //#region src/TestSuiteRunner.d.ts
183
+ interface TestSuiteRunnerConfig {
184
+ agentOS: Operor;
185
+ llm?: LLMProvider;
186
+ timeout?: number;
187
+ strategy?: 'exact' | 'contains' | 'similarity' | 'semantic';
188
+ }
189
+ declare class TestSuiteRunner {
190
+ private evaluator;
191
+ private agentOS;
192
+ private timeout;
193
+ private strategy?;
194
+ constructor(config: TestSuiteRunnerConfig);
195
+ runSuite(testCases: TestCase[]): Promise<TestSuiteResult>;
196
+ private runTestCase;
197
+ }
198
+ //#endregion
199
+ //#region src/SkillTestHarness.d.ts
200
+ interface SkillTestHarnessConfig {
201
+ allowWrites?: boolean;
202
+ allowDestructive?: boolean;
203
+ maxOperations?: number;
204
+ timeoutMs?: number;
205
+ dryRun?: boolean;
206
+ }
207
+ interface AuditLogEntry {
208
+ name: string;
209
+ params: any;
210
+ result: any;
211
+ timestamp: number;
212
+ duration: number;
213
+ classification: 'read' | 'write' | 'destructive';
214
+ }
215
+ /**
216
+ * Safety wrapper for Integration instances during testing.
217
+ * Provides operation limits, dry-run mode, and audit logging.
218
+ */
219
+ declare class SkillTestHarness implements Skill {
220
+ readonly name: string;
221
+ private inner;
222
+ private config;
223
+ private auditLog;
224
+ private operationCount;
225
+ private static readonly READ_TOOLS;
226
+ private static readonly WRITE_TOOLS;
227
+ private static readonly DESTRUCTIVE_TOOLS;
228
+ constructor(inner: Skill, config?: SkillTestHarnessConfig);
229
+ initialize(): Promise<void>;
230
+ /** @deprecated Use initialize() instead. */
231
+ authenticate(): Promise<void>;
232
+ isReady(): boolean;
233
+ /** @deprecated Use isReady() instead. */
234
+ isAuthenticated(): boolean;
235
+ tools: Record<string, Tool>;
236
+ private wrapTools;
237
+ private classifyTool;
238
+ /**
239
+ * Get the audit log of all operations performed
240
+ */
241
+ getAuditLog(): AuditLogEntry[];
242
+ /**
243
+ * Reset the audit log and operation counter
244
+ */
245
+ resetAuditLog(): void;
246
+ /**
247
+ * Get the current operation count
248
+ */
249
+ getOperationCount(): number;
250
+ }
251
+ //#endregion
252
+ //#region src/CustomerSimulator.d.ts
253
+ declare class CustomerSimulator {
254
+ private llm?;
255
+ constructor(options?: {
256
+ llmProvider?: LLMProvider;
257
+ });
258
+ generateMessage(persona: string, history: ConversationTurn[], context?: {
259
+ scenario?: string;
260
+ maxTurns?: number;
261
+ currentTurn?: number;
262
+ scriptedResponses?: string[];
263
+ }): Promise<CustomerSimulatorResponse>;
264
+ }
265
+ //#endregion
266
+ //#region src/ConversationEvaluator.d.ts
267
+ declare class ConversationEvaluator {
268
+ private llm?;
269
+ constructor(options?: {
270
+ llmProvider?: LLMProvider;
271
+ });
272
+ evaluate(config: {
273
+ scenario: string;
274
+ persona: string;
275
+ turns: ConversationTurn[];
276
+ toolsCalled: Array<{
277
+ name: string;
278
+ params: any;
279
+ result: any;
280
+ }>;
281
+ expectedTools?: string[];
282
+ expectedOutcome?: string;
283
+ successCriteria?: ConversationSuccessCriteria[];
284
+ }): Promise<ConversationEvaluation>;
285
+ }
286
+ //#endregion
287
+ //#region src/ConversationRunner.d.ts
288
+ interface ConversationRunnerConfig {
289
+ agentOS: Operor;
290
+ customerSimulator: CustomerSimulator;
291
+ conversationEvaluator: ConversationEvaluator;
292
+ timeout?: number;
293
+ verbose?: boolean;
294
+ }
295
+ declare class ConversationRunner {
296
+ private agentOS;
297
+ private customerSimulator;
298
+ private conversationEvaluator;
299
+ private timeout;
300
+ private verbose;
301
+ constructor(config: ConversationRunnerConfig);
302
+ runScenario(scenario: ConversationScenario): Promise<ConversationTestResult>;
303
+ runScenarios(scenarios: ConversationScenario[]): Promise<ConversationTestResult[]>;
304
+ private getMockProvider;
305
+ private waitForAgentResponse;
306
+ }
307
+ //#endregion
308
+ //#region src/SimulationRunner.d.ts
309
+ interface SimulationRunnerOptions {
310
+ agentOS: Operor;
311
+ config: SimulationConfig;
312
+ llm?: LLMProvider;
313
+ }
314
+ declare class SimulationRunner {
315
+ private agentOS;
316
+ private config;
317
+ private llm?;
318
+ constructor(options: SimulationRunnerOptions);
319
+ run(onProgress?: (completed: number, total: number, result: ConversationTestResult) => void): Promise<SimulationReport>;
320
+ static formatReport(report: SimulationReport): string;
321
+ private resolveScenarios;
322
+ private buildSchedule;
323
+ private computeAverageScores;
324
+ private computeScenarioBreakdown;
325
+ private computeToolUsageStats;
326
+ private analyzeFailuresWithLLM;
327
+ private heuristicFailurePatterns;
328
+ private heuristicRecommendations;
329
+ }
330
+ //#endregion
331
+ //#region src/scenarios.d.ts
332
+ declare const ECOMMERCE_SCENARIOS: ConversationScenario[];
333
+ //#endregion
334
+ //#region src/MockShopifySkill.d.ts
335
+ interface MockOrder {
336
+ id: string;
337
+ name: string;
338
+ status: string;
339
+ financialStatus: string;
340
+ createdAt: string;
341
+ expectedDelivery: Date;
342
+ actualDelivery?: Date;
343
+ tracking?: string;
344
+ trackingUrl?: string;
345
+ items: Array<{
346
+ name: string;
347
+ quantity: number;
348
+ price: string;
349
+ }>;
350
+ total: string;
351
+ }
352
+ interface MockProduct {
353
+ id: number;
354
+ title: string;
355
+ vendor: string;
356
+ type: string;
357
+ price: string;
358
+ available: boolean;
359
+ }
360
+ interface MockDiscount {
361
+ code: string;
362
+ percent: number;
363
+ validDays: number;
364
+ startsAt: string;
365
+ expiresAt: string;
366
+ priceRuleId: number;
367
+ createdAt: Date;
368
+ }
369
+ declare class MockShopifySkill implements Skill {
370
+ readonly name = "shopify";
371
+ private ready;
372
+ private mockOrders;
373
+ private mockProducts;
374
+ private mockDiscounts;
375
+ private nextPriceRuleId;
376
+ constructor();
377
+ initialize(): Promise<void>;
378
+ /** @deprecated Use initialize() instead. */
379
+ authenticate(): Promise<void>;
380
+ isReady(): boolean;
381
+ /** @deprecated Use isReady() instead. */
382
+ isAuthenticated(): boolean;
383
+ /**
384
+ * Reset all mock data to initial state (for testing)
385
+ */
386
+ reset(): void;
387
+ /**
388
+ * Seed custom test data (for testing)
389
+ */
390
+ seedData(config: {
391
+ orders?: Array<Partial<MockOrder>>;
392
+ products?: Array<Partial<MockProduct>>;
393
+ discounts?: Array<Partial<MockDiscount>>;
394
+ }): void;
395
+ private seedMockData;
396
+ tools: Record<string, Tool>;
397
+ /**
398
+ * Get all created discounts (for testing)
399
+ */
400
+ getDiscounts(): MockDiscount[];
401
+ /**
402
+ * Get all orders (for testing)
403
+ */
404
+ getOrders(): MockOrder[];
405
+ }
406
+ //#endregion
407
+ //#region src/utils.d.ts
408
+ /**
409
+ * Format current time as HH:MM:SS timestamp
410
+ */
411
+ declare function formatTimestamp(): string;
412
+ //#endregion
413
+ export { type AuditLogEntry, CSVLoader, type ConversationEvaluation, ConversationEvaluator, ConversationRunner, type ConversationRunnerConfig, type ConversationScenario, type ConversationSuccessCriteria, type ConversationTestResult, type ConversationTurn, type CriteriaResult, type CustomerPersona, CustomerSimulator, type CustomerSimulatorResponse, ECOMMERCE_SCENARIOS, type EvaluationResult, type MockDiscount, type MockOrder, type MockProduct, MockShopifySkill, type SimulationConfig, type SimulationReport, SimulationRunner, type SimulationRunnerOptions, SkillTestHarness, type SkillTestHarnessConfig, type TestCase, TestCaseEvaluator, type TestCaseResult, type TestSuiteResult, TestSuiteRunner, type TestSuiteRunnerConfig, formatTimestamp };
414
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/CSVLoader.ts","../src/TestCaseEvaluator.ts","../src/TestSuiteRunner.ts","../src/SkillTestHarness.ts","../src/CustomerSimulator.ts","../src/ConversationEvaluator.ts","../src/ConversationRunner.ts","../src/SimulationRunner.ts","../src/scenarios.ts","../src/MockShopifySkill.ts","../src/utils.ts"],"mappings":"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"}