@chanl/eval-cli 0.4.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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/dist/agent-loader.d.ts +39 -0
  3. package/dist/agent-loader.d.ts.map +1 -0
  4. package/dist/agent-loader.js +166 -0
  5. package/dist/agent-loader.js.map +1 -0
  6. package/dist/analytics.d.ts +15 -0
  7. package/dist/analytics.d.ts.map +1 -0
  8. package/dist/analytics.js +94 -0
  9. package/dist/analytics.js.map +1 -0
  10. package/dist/assertions.d.ts +73 -0
  11. package/dist/assertions.d.ts.map +1 -0
  12. package/dist/assertions.js +282 -0
  13. package/dist/assertions.js.map +1 -0
  14. package/dist/baseline.d.ts +100 -0
  15. package/dist/baseline.d.ts.map +1 -0
  16. package/dist/baseline.js +327 -0
  17. package/dist/baseline.js.map +1 -0
  18. package/dist/bin/chanl.d.ts +3 -0
  19. package/dist/bin/chanl.d.ts.map +1 -0
  20. package/dist/bin/chanl.js +11 -0
  21. package/dist/bin/chanl.js.map +1 -0
  22. package/dist/client.d.ts +40 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +99 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/commands/analytics.d.ts +3 -0
  27. package/dist/commands/analytics.d.ts.map +1 -0
  28. package/dist/commands/analytics.js +44 -0
  29. package/dist/commands/analytics.js.map +1 -0
  30. package/dist/commands/compare.d.ts +51 -0
  31. package/dist/commands/compare.d.ts.map +1 -0
  32. package/dist/commands/compare.js +429 -0
  33. package/dist/commands/compare.js.map +1 -0
  34. package/dist/commands/config.d.ts +3 -0
  35. package/dist/commands/config.d.ts.map +1 -0
  36. package/dist/commands/config.js +94 -0
  37. package/dist/commands/config.js.map +1 -0
  38. package/dist/commands/dataset.d.ts +6 -0
  39. package/dist/commands/dataset.d.ts.map +1 -0
  40. package/dist/commands/dataset.js +225 -0
  41. package/dist/commands/dataset.js.map +1 -0
  42. package/dist/commands/executions.d.ts +3 -0
  43. package/dist/commands/executions.d.ts.map +1 -0
  44. package/dist/commands/executions.js +249 -0
  45. package/dist/commands/executions.js.map +1 -0
  46. package/dist/commands/generate.d.ts +3 -0
  47. package/dist/commands/generate.d.ts.map +1 -0
  48. package/dist/commands/generate.js +159 -0
  49. package/dist/commands/generate.js.map +1 -0
  50. package/dist/commands/init.d.ts +29 -0
  51. package/dist/commands/init.d.ts.map +1 -0
  52. package/dist/commands/init.js +545 -0
  53. package/dist/commands/init.js.map +1 -0
  54. package/dist/commands/login.d.ts +3 -0
  55. package/dist/commands/login.d.ts.map +1 -0
  56. package/dist/commands/login.js +65 -0
  57. package/dist/commands/login.js.map +1 -0
  58. package/dist/commands/personas.d.ts +3 -0
  59. package/dist/commands/personas.d.ts.map +1 -0
  60. package/dist/commands/personas.js +269 -0
  61. package/dist/commands/personas.js.map +1 -0
  62. package/dist/commands/scenarios.d.ts +16 -0
  63. package/dist/commands/scenarios.d.ts.map +1 -0
  64. package/dist/commands/scenarios.js +755 -0
  65. package/dist/commands/scenarios.js.map +1 -0
  66. package/dist/commands/scorecards.d.ts +3 -0
  67. package/dist/commands/scorecards.d.ts.map +1 -0
  68. package/dist/commands/scorecards.js +220 -0
  69. package/dist/commands/scorecards.js.map +1 -0
  70. package/dist/commands/server.d.ts +8 -0
  71. package/dist/commands/server.d.ts.map +1 -0
  72. package/dist/commands/server.js +357 -0
  73. package/dist/commands/server.js.map +1 -0
  74. package/dist/commands/test.d.ts +3 -0
  75. package/dist/commands/test.d.ts.map +1 -0
  76. package/dist/commands/test.js +410 -0
  77. package/dist/commands/test.js.map +1 -0
  78. package/dist/commands/tool-fixtures.d.ts +3 -0
  79. package/dist/commands/tool-fixtures.d.ts.map +1 -0
  80. package/dist/commands/tool-fixtures.js +324 -0
  81. package/dist/commands/tool-fixtures.js.map +1 -0
  82. package/dist/config.d.ts +32 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +132 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/index.d.ts +8 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +146 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/output.d.ts +30 -0
  91. package/dist/output.d.ts.map +1 -0
  92. package/dist/output.js +77 -0
  93. package/dist/output.js.map +1 -0
  94. package/dist/update-check.d.ts +6 -0
  95. package/dist/update-check.d.ts.map +1 -0
  96. package/dist/update-check.js +50 -0
  97. package/dist/update-check.js.map +1 -0
  98. package/package.json +42 -0
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ /**
3
+ * Baseline management for `chanl test --save-baseline` / `--baseline`.
4
+ *
5
+ * Saves test results as a JSON snapshot and compares future runs
6
+ * against the snapshot to detect regressions.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.assertionKey = assertionKey;
46
+ exports.buildBaseline = buildBaseline;
47
+ exports.saveBaseline = saveBaseline;
48
+ exports.loadBaseline = loadBaseline;
49
+ exports.compareWithBaseline = compareWithBaseline;
50
+ exports.printBaselineComparison = printBaselineComparison;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const chalk_1 = __importDefault(require("chalk"));
54
+ /* ------------------------------------------------------------------ */
55
+ /* Assertion key generation */
56
+ /* ------------------------------------------------------------------ */
57
+ /**
58
+ * Build a stable key for an assertion result.
59
+ * Uses the description if available, otherwise falls back to type + index.
60
+ */
61
+ function assertionKey(result, index) {
62
+ if (result.description && result.description.trim()) {
63
+ return result.description.trim();
64
+ }
65
+ return `${result.type}-${index}`;
66
+ }
67
+ /* ------------------------------------------------------------------ */
68
+ /* Save / Load */
69
+ /* ------------------------------------------------------------------ */
70
+ const DEFAULT_BASELINE_FILE = '.chanl-baseline.json';
71
+ /**
72
+ * Build a BaselineFile from test results (same shape as test.ts TestFileResult[]).
73
+ */
74
+ function buildBaseline(results) {
75
+ const baselineResults = {};
76
+ for (const r of results) {
77
+ if (r.error)
78
+ continue; // Skip errored tests
79
+ const assertions = {};
80
+ r.assertions.forEach((a, i) => {
81
+ assertions[assertionKey(a, i)] = a.passed;
82
+ });
83
+ // Compute a score: % of passing assertions (0-100)
84
+ const totalAssertions = r.assertions.length;
85
+ const passedAssertions = r.assertions.filter((a) => a.passed).length;
86
+ const score = totalAssertions > 0
87
+ ? Math.round((passedAssertions / totalAssertions) * 100)
88
+ : null;
89
+ baselineResults[r.file] = { score, assertions };
90
+ }
91
+ return {
92
+ version: 1,
93
+ savedAt: new Date().toISOString(),
94
+ results: baselineResults,
95
+ };
96
+ }
97
+ /**
98
+ * Save baseline results to a JSON file.
99
+ */
100
+ function saveBaseline(results, filePath) {
101
+ const targetPath = filePath || path.resolve(process.cwd(), DEFAULT_BASELINE_FILE);
102
+ const baseline = buildBaseline(results);
103
+ fs.writeFileSync(targetPath, JSON.stringify(baseline, null, 2) + '\n', 'utf-8');
104
+ return targetPath;
105
+ }
106
+ /**
107
+ * Load a baseline file. Returns null if the file does not exist.
108
+ */
109
+ function loadBaseline(filePath) {
110
+ const targetPath = filePath || path.resolve(process.cwd(), DEFAULT_BASELINE_FILE);
111
+ if (!fs.existsSync(targetPath)) {
112
+ return null;
113
+ }
114
+ const content = fs.readFileSync(targetPath, 'utf-8');
115
+ const parsed = JSON.parse(content);
116
+ if (parsed.version !== 1) {
117
+ throw new Error(`Unsupported baseline version: ${parsed.version}. Expected version 1.`);
118
+ }
119
+ return parsed;
120
+ }
121
+ /* ------------------------------------------------------------------ */
122
+ /* Comparison */
123
+ /* ------------------------------------------------------------------ */
124
+ /**
125
+ * Compare current test results against a saved baseline.
126
+ */
127
+ function compareWithBaseline(currentResults, baseline) {
128
+ const currentBaseline = buildBaseline(currentResults);
129
+ const allFiles = new Set([
130
+ ...Object.keys(baseline.results),
131
+ ...Object.keys(currentBaseline.results),
132
+ ]);
133
+ const tests = [];
134
+ let improved = 0;
135
+ let regressed = 0;
136
+ let unchanged = 0;
137
+ let added = 0;
138
+ let removed = 0;
139
+ for (const file of allFiles) {
140
+ const before = baseline.results[file];
141
+ const after = currentBaseline.results[file];
142
+ if (!before && after) {
143
+ // New test added
144
+ const assertions = Object.entries(after.assertions).map(([name, passed]) => ({
145
+ name,
146
+ status: 'added',
147
+ before: null,
148
+ after: passed,
149
+ }));
150
+ tests.push({
151
+ file,
152
+ status: 'added',
153
+ scoreBefore: null,
154
+ scoreAfter: after.score,
155
+ scoreDelta: null,
156
+ assertions,
157
+ });
158
+ added++;
159
+ continue;
160
+ }
161
+ if (before && !after) {
162
+ // Test removed (or errored this run)
163
+ const assertions = Object.entries(before.assertions).map(([name, passed]) => ({
164
+ name,
165
+ status: 'removed',
166
+ before: passed,
167
+ after: null,
168
+ }));
169
+ tests.push({
170
+ file,
171
+ status: 'removed',
172
+ scoreBefore: before.score,
173
+ scoreAfter: null,
174
+ scoreDelta: null,
175
+ assertions,
176
+ });
177
+ removed++;
178
+ continue;
179
+ }
180
+ // Both exist — compare assertions
181
+ const allAssertionKeys = new Set([
182
+ ...Object.keys(before.assertions),
183
+ ...Object.keys(after.assertions),
184
+ ]);
185
+ const assertions = [];
186
+ let hasImprovement = false;
187
+ let hasRegression = false;
188
+ for (const key of allAssertionKeys) {
189
+ const beforeVal = key in before.assertions ? before.assertions[key] : null;
190
+ const afterVal = key in after.assertions ? after.assertions[key] : null;
191
+ let status;
192
+ if (beforeVal === null) {
193
+ status = 'added';
194
+ }
195
+ else if (afterVal === null) {
196
+ status = 'removed';
197
+ }
198
+ else if (beforeVal === afterVal) {
199
+ status = 'unchanged';
200
+ }
201
+ else if (!beforeVal && afterVal) {
202
+ status = 'improved';
203
+ hasImprovement = true;
204
+ }
205
+ else {
206
+ // Was passing, now failing
207
+ status = 'regressed';
208
+ hasRegression = true;
209
+ }
210
+ assertions.push({ name: key, status, before: beforeVal, after: afterVal });
211
+ }
212
+ const scoreBefore = before.score;
213
+ const scoreAfter = after.score;
214
+ const scoreDelta = scoreBefore !== null && scoreAfter !== null
215
+ ? scoreAfter - scoreBefore
216
+ : null;
217
+ let testStatus;
218
+ if (hasRegression) {
219
+ testStatus = 'regressed';
220
+ regressed++;
221
+ }
222
+ else if (hasImprovement) {
223
+ testStatus = 'improved';
224
+ improved++;
225
+ }
226
+ else {
227
+ testStatus = 'unchanged';
228
+ unchanged++;
229
+ }
230
+ tests.push({
231
+ file,
232
+ status: testStatus,
233
+ scoreBefore,
234
+ scoreAfter,
235
+ scoreDelta,
236
+ assertions,
237
+ });
238
+ }
239
+ return {
240
+ tests,
241
+ summary: { improved, regressed, unchanged, added, removed },
242
+ hasRegressions: regressed > 0,
243
+ };
244
+ }
245
+ /* ------------------------------------------------------------------ */
246
+ /* Output formatting */
247
+ /* ------------------------------------------------------------------ */
248
+ const ICONS = {
249
+ improved: '\u2191', // up arrow
250
+ regressed: '\u2193', // down arrow
251
+ unchanged: '\u2550', // double horizontal
252
+ added: '+',
253
+ removed: '-',
254
+ };
255
+ function statusIcon(status) {
256
+ switch (status) {
257
+ case 'improved':
258
+ return chalk_1.default.green(`${ICONS.improved} FIXED`);
259
+ case 'regressed':
260
+ return chalk_1.default.red(`${ICONS.regressed} REGRESSED`);
261
+ case 'unchanged':
262
+ return chalk_1.default.dim(ICONS.unchanged);
263
+ case 'added':
264
+ return chalk_1.default.cyan(ICONS.added + ' NEW');
265
+ case 'removed':
266
+ return chalk_1.default.yellow(ICONS.removed + ' REMOVED');
267
+ }
268
+ }
269
+ function assertionIcon(before, after) {
270
+ if (before === null)
271
+ return chalk_1.default.cyan('\u2713');
272
+ if (after === null)
273
+ return chalk_1.default.yellow('?');
274
+ return after ? chalk_1.default.green('\u2713') : chalk_1.default.red('\u2717');
275
+ }
276
+ /**
277
+ * Print a human-readable baseline comparison to stdout.
278
+ */
279
+ function printBaselineComparison(comparison) {
280
+ console.log('');
281
+ console.log(chalk_1.default.bold('Baseline comparison:'));
282
+ for (const test of comparison.tests) {
283
+ // Score line
284
+ const scorePart = test.scoreBefore !== null && test.scoreAfter !== null
285
+ ? `${test.scoreBefore} \u2192 ${test.scoreAfter}` +
286
+ (test.scoreDelta !== null && test.scoreDelta !== 0
287
+ ? ` (${test.scoreDelta > 0 ? '+' : ''}${test.scoreDelta})`
288
+ : '') +
289
+ (test.status === 'improved'
290
+ ? chalk_1.default.green(' \u2191')
291
+ : test.status === 'regressed'
292
+ ? chalk_1.default.red(' \u2193')
293
+ : '')
294
+ : test.status === 'added'
295
+ ? chalk_1.default.cyan('new')
296
+ : test.status === 'removed'
297
+ ? chalk_1.default.yellow('removed')
298
+ : '';
299
+ console.log(` ${test.file}: ${scorePart}`);
300
+ // Assertion lines
301
+ for (const a of test.assertions) {
302
+ const beforeStr = a.before === null ? '?' : a.before ? '\u2713' : '\u2717';
303
+ const afterStr = a.after === null ? '?' : a.after ? '\u2713' : '\u2717';
304
+ console.log(` ${a.name}: ${beforeStr} \u2192 ${afterStr} ${statusIcon(a.status)}`);
305
+ }
306
+ }
307
+ // Summary line
308
+ console.log('');
309
+ const parts = [];
310
+ if (comparison.summary.improved > 0) {
311
+ parts.push(chalk_1.default.green(`${comparison.summary.improved} improved`));
312
+ }
313
+ if (comparison.summary.regressed > 0) {
314
+ parts.push(chalk_1.default.red(`${comparison.summary.regressed} regressed`));
315
+ }
316
+ if (comparison.summary.unchanged > 0) {
317
+ parts.push(`${comparison.summary.unchanged} unchanged`);
318
+ }
319
+ if (comparison.summary.added > 0) {
320
+ parts.push(chalk_1.default.cyan(`${comparison.summary.added} added`));
321
+ }
322
+ if (comparison.summary.removed > 0) {
323
+ parts.push(chalk_1.default.yellow(`${comparison.summary.removed} removed`));
324
+ }
325
+ console.log(`Summary: ${parts.join(', ')}`);
326
+ }
327
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ //# sourceMappingURL=chanl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chanl.d.ts","sourceRoot":"","sources":["../../src/bin/chanl.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ require("dotenv/config");
5
+ const index_1 = require("../index");
6
+ const program = (0, index_1.createProgram)();
7
+ program.parseAsync(process.argv).catch((err) => {
8
+ console.error(err);
9
+ process.exit(1);
10
+ });
11
+ //# sourceMappingURL=chanl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chanl.js","sourceRoot":"","sources":["../../src/bin/chanl.ts"],"names":[],"mappings":";;;AAEA,yBAAuB;AACvB,oCAAyC;AAEzC,MAAM,OAAO,GAAG,IAAA,qBAAa,GAAE,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { AxiosInstance } from 'axios';
2
+ export interface ApiResponse<T = any> {
3
+ data: T;
4
+ status: number;
5
+ }
6
+ export interface ApiError {
7
+ message: string;
8
+ status: number;
9
+ details?: any;
10
+ }
11
+ /**
12
+ * Create an axios client configured from CLI config.
13
+ * Reads server URL and API key from ~/.chanl/config.json.
14
+ */
15
+ export declare function createClient(): AxiosInstance;
16
+ /**
17
+ * GET request to the server.
18
+ */
19
+ export declare function get<T = any>(path: string, params?: Record<string, any>): Promise<T>;
20
+ /**
21
+ * POST request to the server.
22
+ */
23
+ export declare function post<T = any>(path: string, data?: any): Promise<T>;
24
+ /**
25
+ * PUT request to the server.
26
+ */
27
+ export declare function put<T = any>(path: string, data?: any): Promise<T>;
28
+ /**
29
+ * PATCH request to the server.
30
+ */
31
+ export declare function patch<T = any>(path: string, data?: any): Promise<T>;
32
+ /**
33
+ * DELETE request to the server.
34
+ */
35
+ export declare function del<T = any>(path: string): Promise<T>;
36
+ /**
37
+ * Format an axios error into a user-friendly message.
38
+ */
39
+ export declare function formatError(err: unknown): string;
40
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAAc,MAAM,OAAO,CAAC;AAGzD,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,GAAG;IAClC,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,GAAG,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,YAAY,IAAI,aAAa,CAmB5C;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAIzF;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAIxE;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAIvE;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAIzE;AAED;;GAEG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAI3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAqBhD"}
package/dist/client.js ADDED
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createClient = createClient;
7
+ exports.get = get;
8
+ exports.post = post;
9
+ exports.put = put;
10
+ exports.patch = patch;
11
+ exports.del = del;
12
+ exports.formatError = formatError;
13
+ const axios_1 = __importDefault(require("axios"));
14
+ const config_1 = require("./config");
15
+ /**
16
+ * Create an axios client configured from CLI config.
17
+ * Reads server URL and API key from ~/.chanl/config.json.
18
+ */
19
+ function createClient() {
20
+ const config = (0, config_1.loadConfig)();
21
+ if (!config.server) {
22
+ throw new Error('Server URL not configured. Run: chanl config set server <url>');
23
+ }
24
+ const client = axios_1.default.create({
25
+ baseURL: `${config.server}/api/v1`,
26
+ timeout: 30000,
27
+ headers: {
28
+ 'Content-Type': 'application/json',
29
+ ...(config.apiKey ? { 'X-API-Key': config.apiKey } : {}),
30
+ },
31
+ });
32
+ return client;
33
+ }
34
+ /**
35
+ * GET request to the server.
36
+ */
37
+ async function get(path, params) {
38
+ const client = createClient();
39
+ const response = await client.get(path, { params });
40
+ return response.data;
41
+ }
42
+ /**
43
+ * POST request to the server.
44
+ */
45
+ async function post(path, data) {
46
+ const client = createClient();
47
+ const response = await client.post(path, data);
48
+ return response.data;
49
+ }
50
+ /**
51
+ * PUT request to the server.
52
+ */
53
+ async function put(path, data) {
54
+ const client = createClient();
55
+ const response = await client.put(path, data);
56
+ return response.data;
57
+ }
58
+ /**
59
+ * PATCH request to the server.
60
+ */
61
+ async function patch(path, data) {
62
+ const client = createClient();
63
+ const response = await client.patch(path, data);
64
+ return response.data;
65
+ }
66
+ /**
67
+ * DELETE request to the server.
68
+ */
69
+ async function del(path) {
70
+ const client = createClient();
71
+ const response = await client.delete(path);
72
+ return response.data;
73
+ }
74
+ /**
75
+ * Format an axios error into a user-friendly message.
76
+ */
77
+ function formatError(err) {
78
+ if (axios_1.default.isAxiosError(err)) {
79
+ const axErr = err;
80
+ if (axErr.response) {
81
+ const status = axErr.response.status;
82
+ const body = axErr.response.data;
83
+ const msg = body?.message || body?.error || axErr.message;
84
+ return `HTTP ${status}: ${msg}`;
85
+ }
86
+ if (axErr.code === 'ECONNREFUSED') {
87
+ return 'Connection refused. Is the server running? Check: chanl config get server';
88
+ }
89
+ if (axErr.code === 'ENOTFOUND') {
90
+ return `Server not found: ${axErr.config?.baseURL}. Check: chanl config get server`;
91
+ }
92
+ return axErr.message;
93
+ }
94
+ if (err instanceof Error) {
95
+ return err.message;
96
+ }
97
+ return String(err);
98
+ }
99
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAnalyticsCommand(program: Command): void;
3
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/commands/analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4C/D"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerAnalyticsCommand = registerAnalyticsCommand;
4
+ const config_1 = require("../config");
5
+ const output_1 = require("../output");
6
+ function registerAnalyticsCommand(program) {
7
+ const analytics = program
8
+ .command('analytics')
9
+ .description('Manage anonymous usage analytics');
10
+ analytics
11
+ .command('status')
12
+ .description('Show analytics status')
13
+ .action(() => {
14
+ const config = (0, config_1.loadConfig)();
15
+ const enabled = config.analytics !== false;
16
+ console.log(`Analytics: ${enabled ? 'enabled' : 'disabled'}`);
17
+ if (config.analyticsId) {
18
+ console.log(`Anonymous ID: ${config.analyticsId}`);
19
+ }
20
+ console.log('');
21
+ console.log('chanl collects anonymous usage data to improve the tool.');
22
+ console.log('No API keys, transcripts, or personal data is ever collected.');
23
+ console.log('Learn more: https://chanl.ai/telemetry');
24
+ });
25
+ analytics
26
+ .command('enable')
27
+ .description('Enable anonymous analytics')
28
+ .action(() => {
29
+ const config = (0, config_1.loadConfig)();
30
+ config.analytics = true;
31
+ (0, config_1.saveConfig)(config);
32
+ (0, output_1.printSuccess)('Analytics enabled');
33
+ });
34
+ analytics
35
+ .command('disable')
36
+ .description('Disable anonymous analytics')
37
+ .action(() => {
38
+ const config = (0, config_1.loadConfig)();
39
+ config.analytics = false;
40
+ (0, config_1.saveConfig)(config);
41
+ (0, output_1.printSuccess)('Analytics disabled');
42
+ });
43
+ }
44
+ //# sourceMappingURL=analytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/commands/analytics.ts"],"names":[],"mappings":";;AAIA,4DA4CC;AA/CD,sCAAmD;AACnD,sCAAyC;AAEzC,SAAgB,wBAAwB,CAAC,OAAgB;IACvD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,kCAAkC,CAAC,CAAC;IAEnD,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uBAAuB,CAAC;SACpC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9D,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,0DAA0D,CAC3D,CAAC;QACF,OAAO,CAAC,GAAG,CACT,+DAA+D,CAChE,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC;QACnB,IAAA,qBAAY,EAAC,mBAAmB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEL,SAAS;SACN,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAC5B,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC;QACnB,IAAA,qBAAY,EAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { Command } from 'commander';
2
+ /** Metrics extracted from a single execution for comparison. */
3
+ export interface ComparisonMetrics {
4
+ overallScore: number | null;
5
+ avgLatency: number | null;
6
+ turns: number | null;
7
+ duration: number | null;
8
+ }
9
+ /** One side of the comparison (A or B). */
10
+ export interface ComparisonSide {
11
+ label: string;
12
+ model: string;
13
+ execution: any | null;
14
+ metrics: ComparisonMetrics;
15
+ error: string | null;
16
+ }
17
+ /** Full comparison result. */
18
+ export interface ComparisonResult {
19
+ scenario: string;
20
+ sideA: ComparisonSide;
21
+ sideB: ComparisonSide;
22
+ winner: 'A' | 'B' | 'tie' | null;
23
+ winnerReason: string;
24
+ }
25
+ /**
26
+ * Extract comparison-relevant metrics from an execution object.
27
+ */
28
+ export declare function extractMetrics(execution: any): ComparisonMetrics;
29
+ /**
30
+ * Determine the winner based on metrics.
31
+ * Score is weighted highest, then latency, then turns, then duration.
32
+ */
33
+ export declare function determineWinner(a: ComparisonMetrics, b: ComparisonMetrics): {
34
+ winner: 'A' | 'B' | 'tie' | null;
35
+ reason: string;
36
+ };
37
+ /**
38
+ * Build the human-readable comparison table output.
39
+ */
40
+ export declare function formatComparisonTable(result: ComparisonResult): string;
41
+ export declare function registerCompareCommand(program: Command): void;
42
+ /**
43
+ * Validate CLI options for compare command.
44
+ * Returns a descriptive error string if invalid, or null if valid.
45
+ */
46
+ export declare function validateCompareOptions(options: {
47
+ promptA?: string;
48
+ promptB?: string;
49
+ scenario?: string;
50
+ }): string | null;
51
+ //# sourceMappingURL=compare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.d.ts","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,gEAAgE;AAChE,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,2CAA2C;AAC3C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;CACtB;AAID;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,iBAAiB,CAwChE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,iBAAiB,EACpB,CAAC,EAAE,iBAAiB,GACnB;IAAE,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA+DtD;AAaD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAsKtE;AAuGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoB7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,GAAG,IAAI,CAUhB"}