@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,429 @@
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.extractMetrics = extractMetrics;
7
+ exports.determineWinner = determineWinner;
8
+ exports.formatComparisonTable = formatComparisonTable;
9
+ exports.registerCompareCommand = registerCompareCommand;
10
+ exports.validateCompareOptions = validateCompareOptions;
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const ora_1 = __importDefault(require("ora"));
13
+ const client_1 = require("../client");
14
+ const output_1 = require("../output");
15
+ // ── Metric extraction ──────────────────────────────────────────────────────────
16
+ /**
17
+ * Extract comparison-relevant metrics from an execution object.
18
+ */
19
+ function extractMetrics(execution) {
20
+ const metrics = {
21
+ overallScore: null,
22
+ avgLatency: null,
23
+ turns: null,
24
+ duration: null,
25
+ };
26
+ if (!execution)
27
+ return metrics;
28
+ // Overall score
29
+ if (execution.overallScore !== undefined && execution.overallScore !== null) {
30
+ metrics.overallScore = Math.round(execution.overallScore);
31
+ }
32
+ // Duration
33
+ if (execution.duration) {
34
+ metrics.duration = execution.duration;
35
+ }
36
+ // Latency and turns from stepResults
37
+ if (execution.stepResults && execution.stepResults.length > 0) {
38
+ const agentSteps = execution.stepResults.filter((s) => typeof s.stepId === 'string' &&
39
+ s.stepId.includes('agent') &&
40
+ s.duration > 0);
41
+ if (agentSteps.length > 0) {
42
+ const totalLatency = agentSteps.reduce((sum, s) => sum + s.duration, 0);
43
+ metrics.avgLatency = Math.round(totalLatency / agentSteps.length);
44
+ metrics.turns = agentSteps.length;
45
+ }
46
+ }
47
+ return metrics;
48
+ }
49
+ /**
50
+ * Determine the winner based on metrics.
51
+ * Score is weighted highest, then latency, then turns, then duration.
52
+ */
53
+ function determineWinner(a, b) {
54
+ // If both failed, no winner
55
+ if (a.overallScore === null && b.overallScore === null) {
56
+ return { winner: null, reason: 'Both executions produced no score' };
57
+ }
58
+ // If only one has a score, that one wins
59
+ if (a.overallScore !== null && b.overallScore === null) {
60
+ return { winner: 'A', reason: 'Only Model A produced a score' };
61
+ }
62
+ if (a.overallScore === null && b.overallScore !== null) {
63
+ return { winner: 'B', reason: 'Only Model B produced a score' };
64
+ }
65
+ // Both have scores — compare
66
+ const scoreDiff = (a.overallScore ?? 0) - (b.overallScore ?? 0);
67
+ if (scoreDiff > 0) {
68
+ return {
69
+ winner: 'A',
70
+ reason: `higher score (${a.overallScore} vs ${b.overallScore})`,
71
+ };
72
+ }
73
+ if (scoreDiff < 0) {
74
+ return {
75
+ winner: 'B',
76
+ reason: `higher score (${b.overallScore} vs ${a.overallScore})`,
77
+ };
78
+ }
79
+ // Scores tied — compare latency (lower is better)
80
+ if (a.avgLatency !== null && b.avgLatency !== null) {
81
+ if (a.avgLatency < b.avgLatency) {
82
+ return {
83
+ winner: 'A',
84
+ reason: `same score, faster responses (${a.avgLatency}ms vs ${b.avgLatency}ms)`,
85
+ };
86
+ }
87
+ if (a.avgLatency > b.avgLatency) {
88
+ return {
89
+ winner: 'B',
90
+ reason: `same score, faster responses (${b.avgLatency}ms vs ${a.avgLatency}ms)`,
91
+ };
92
+ }
93
+ }
94
+ // Scores and latency tied — compare turns (fewer is better)
95
+ if (a.turns !== null && b.turns !== null) {
96
+ if (a.turns < b.turns) {
97
+ return {
98
+ winner: 'A',
99
+ reason: `same score, fewer turns (${a.turns} vs ${b.turns})`,
100
+ };
101
+ }
102
+ if (a.turns > b.turns) {
103
+ return {
104
+ winner: 'B',
105
+ reason: `same score, fewer turns (${b.turns} vs ${a.turns})`,
106
+ };
107
+ }
108
+ }
109
+ return { winner: 'tie', reason: 'identical metrics' };
110
+ }
111
+ // ── Formatting helpers ─────────────────────────────────────────────────────────
112
+ /** Format a metric cell with star marker for the winner. */
113
+ function fmtCell(value, isWinner) {
114
+ if (value === null)
115
+ return chalk_1.default.dim('n/a');
116
+ return isWinner ? `${value} ${chalk_1.default.yellow('\u2605')}` : value;
117
+ }
118
+ /**
119
+ * Build the human-readable comparison table output.
120
+ */
121
+ function formatComparisonTable(result) {
122
+ const { sideA, sideB } = result;
123
+ const lines = [];
124
+ lines.push('');
125
+ lines.push(chalk_1.default.bold(`chanl compare`) +
126
+ chalk_1.default.dim(` \u2014 ${result.scenario}`));
127
+ lines.push('');
128
+ lines.push(` Model A: ${chalk_1.default.cyan(sideA.label)} (${sideA.model})`);
129
+ lines.push(` Model B: ${chalk_1.default.cyan(sideB.label)} (${sideB.model})`);
130
+ lines.push('');
131
+ // If either side errored, show the error
132
+ if (sideA.error) {
133
+ lines.push(` ${chalk_1.default.red('Model A failed:')} ${sideA.error}`);
134
+ }
135
+ if (sideB.error) {
136
+ lines.push(` ${chalk_1.default.red('Model B failed:')} ${sideB.error}`);
137
+ }
138
+ if (sideA.error || sideB.error) {
139
+ lines.push('');
140
+ }
141
+ // Metrics table
142
+ const ma = sideA.metrics;
143
+ const mb = sideB.metrics;
144
+ const rows = [
145
+ {
146
+ label: 'Overall Score',
147
+ a: ma.overallScore !== null ? `${ma.overallScore}/100` : null,
148
+ b: mb.overallScore !== null ? `${mb.overallScore}/100` : null,
149
+ lowerIsBetter: false,
150
+ },
151
+ {
152
+ label: 'Avg Latency',
153
+ a: ma.avgLatency !== null
154
+ ? `${(ma.avgLatency / 1000).toFixed(1)}s`
155
+ : null,
156
+ b: mb.avgLatency !== null
157
+ ? `${(mb.avgLatency / 1000).toFixed(1)}s`
158
+ : null,
159
+ lowerIsBetter: true,
160
+ },
161
+ {
162
+ label: 'Turns',
163
+ a: ma.turns !== null ? String(ma.turns) : null,
164
+ b: mb.turns !== null ? String(mb.turns) : null,
165
+ lowerIsBetter: true,
166
+ },
167
+ {
168
+ label: 'Duration',
169
+ a: ma.duration !== null
170
+ ? `${(ma.duration / 1000).toFixed(0)}s`
171
+ : null,
172
+ b: mb.duration !== null
173
+ ? `${(mb.duration / 1000).toFixed(0)}s`
174
+ : null,
175
+ lowerIsBetter: true,
176
+ },
177
+ ];
178
+ // Only show rows where at least one side has data
179
+ const visibleRows = rows.filter((r) => r.a !== null || r.b !== null);
180
+ if (visibleRows.length > 0) {
181
+ // Column widths
182
+ const labelW = 17;
183
+ const colW = 12;
184
+ const sep = '\u2502';
185
+ const hline = '\u2500';
186
+ const topLeft = '\u250c';
187
+ const topMid = '\u252c';
188
+ const topRight = '\u2510';
189
+ const midLeft = '\u251c';
190
+ const midMid = '\u253c';
191
+ const midRight = '\u2524';
192
+ const botLeft = '\u2514';
193
+ const botMid = '\u2534';
194
+ const botRight = '\u2518';
195
+ const pad = (s, w) => {
196
+ // Strip ANSI for length calculation
197
+ const stripped = s.replace(/\x1b\[[0-9;]*m/g, '');
198
+ const padding = Math.max(0, w - stripped.length);
199
+ return s + ' '.repeat(padding);
200
+ };
201
+ lines.push(` ${topLeft}${hline.repeat(labelW + 2)}${topMid}${hline.repeat(colW + 2)}${topMid}${hline.repeat(colW + 2)}${topRight}`);
202
+ lines.push(` ${sep} ${pad(chalk_1.default.bold('Metric'), labelW)} ${sep} ${pad(chalk_1.default.bold(' Model A'), colW)} ${sep} ${pad(chalk_1.default.bold(' Model B'), colW)} ${sep}`);
203
+ lines.push(` ${midLeft}${hline.repeat(labelW + 2)}${midMid}${hline.repeat(colW + 2)}${midMid}${hline.repeat(colW + 2)}${midRight}`);
204
+ for (const row of visibleRows) {
205
+ // Determine which side wins this row
206
+ let aWins = false;
207
+ let bWins = false;
208
+ if (row.a !== null && row.b !== null) {
209
+ const aNum = parseFloat(row.a);
210
+ const bNum = parseFloat(row.b);
211
+ if (!isNaN(aNum) && !isNaN(bNum)) {
212
+ if (row.lowerIsBetter) {
213
+ aWins = aNum < bNum;
214
+ bWins = bNum < aNum;
215
+ }
216
+ else {
217
+ aWins = aNum > bNum;
218
+ bWins = bNum > aNum;
219
+ }
220
+ }
221
+ }
222
+ const aCell = fmtCell(row.a, aWins);
223
+ const bCell = fmtCell(row.b, bWins);
224
+ lines.push(` ${sep} ${pad(row.label, labelW)} ${sep} ${pad(aCell, colW)}${sep} ${pad(bCell, colW)}${sep}`);
225
+ }
226
+ lines.push(` ${botLeft}${hline.repeat(labelW + 2)}${botMid}${hline.repeat(colW + 2)}${botMid}${hline.repeat(colW + 2)}${botRight}`);
227
+ }
228
+ lines.push('');
229
+ // Winner line
230
+ if (result.winner === 'A') {
231
+ lines.push(` ${chalk_1.default.green('Winner:')} Model A (${sideA.model}) \u2014 ${result.winnerReason}`);
232
+ }
233
+ else if (result.winner === 'B') {
234
+ lines.push(` ${chalk_1.default.green('Winner:')} Model B (${sideB.model}) \u2014 ${result.winnerReason}`);
235
+ }
236
+ else if (result.winner === 'tie') {
237
+ lines.push(` ${chalk_1.default.yellow('Tie:')} ${result.winnerReason}`);
238
+ }
239
+ else {
240
+ lines.push(` ${chalk_1.default.dim('No winner could be determined:')} ${result.winnerReason}`);
241
+ }
242
+ lines.push('');
243
+ lines.push(chalk_1.default.dim(' Run with --json for full transcripts'));
244
+ return lines.join('\n');
245
+ }
246
+ // ── Execution helpers ──────────────────────────────────────────────────────────
247
+ const TERMINAL_STATES = ['completed', 'failed', 'timeout', 'cancelled'];
248
+ const POLL_INTERVAL = 2000;
249
+ const MAX_POLLS = 150;
250
+ /**
251
+ * Execute a scenario with a given promptId and poll until completion.
252
+ * The server resolves adapter config from the Prompt entity + Settings DB.
253
+ */
254
+ async function executeAndWait(scenarioId, promptId, label) {
255
+ const executeDto = {
256
+ promptId,
257
+ };
258
+ const spinner = (0, ora_1.default)(`Running ${label}...`).start();
259
+ const execResult = await (0, client_1.post)(`/scenarios/${scenarioId}/execute`, executeDto);
260
+ const execution = execResult.execution;
261
+ const executionId = execution.executionId || execution.id || execution._id;
262
+ spinner.text = `${label}: execution started (${executionId})`;
263
+ // Poll until terminal state
264
+ for (let i = 0; i < MAX_POLLS; i++) {
265
+ await sleep(POLL_INTERVAL);
266
+ try {
267
+ const result = await (0, client_1.get)(`/scenarios/executions/${executionId}`);
268
+ const exec = result.execution;
269
+ if (exec.metrics) {
270
+ const pct = Math.round(((exec.metrics.completedSteps || 0) /
271
+ (exec.metrics.totalSteps || 1)) *
272
+ 100);
273
+ spinner.text = `${label}: ${exec.status} (${pct}% done)`;
274
+ }
275
+ else {
276
+ spinner.text = `${label}: ${exec.status}`;
277
+ }
278
+ if (TERMINAL_STATES.includes(exec.status)) {
279
+ if (exec.status === 'completed') {
280
+ spinner.succeed(`${label}: completed`);
281
+ }
282
+ else if (exec.status === 'failed') {
283
+ spinner.fail(`${label}: failed`);
284
+ }
285
+ else {
286
+ spinner.warn(`${label}: ${exec.status}`);
287
+ }
288
+ return exec;
289
+ }
290
+ }
291
+ catch (err) {
292
+ spinner.text = `${label}: polling... (${(0, client_1.formatError)(err)})`;
293
+ }
294
+ }
295
+ spinner.warn(`${label}: polling timeout`);
296
+ return execution;
297
+ }
298
+ /**
299
+ * Resolve a scenario slug or name to its ID.
300
+ */
301
+ async function resolveScenarioId(nameOrId) {
302
+ if (/^[a-f0-9]{24}$/.test(nameOrId)) {
303
+ return nameOrId;
304
+ }
305
+ const result = await (0, client_1.get)('/scenarios', { limit: '200' });
306
+ const items = result.scenarios || [];
307
+ const slugify = (s) => s
308
+ .toLowerCase()
309
+ .replace(/[^a-z0-9]+/g, '-')
310
+ .replace(/^-+|-+$/g, '');
311
+ const match = items.find((s) => slugify(s.name) === slugify(nameOrId) ||
312
+ s.name.toLowerCase() === nameOrId.toLowerCase());
313
+ if (!match) {
314
+ throw new Error(`Scenario "${nameOrId}" not found. Run "chanl scenarios list" to see available scenarios.`);
315
+ }
316
+ return match.id || match._id;
317
+ }
318
+ // ── Main command ───────────────────────────────────────────────────────────────
319
+ function registerCompareCommand(program) {
320
+ program
321
+ .command('compare')
322
+ .description('Run the same scenario against two prompts and compare results')
323
+ .requiredOption('--scenario <scenario>', 'Scenario name, slug, or ID to run')
324
+ .requiredOption('--prompt-a <promptId>', 'Prompt A entity ID')
325
+ .requiredOption('--prompt-b <promptId>', 'Prompt B entity ID')
326
+ .action(async (options) => {
327
+ try {
328
+ await runCompareAction(options, program.opts().format);
329
+ }
330
+ catch (err) {
331
+ (0, output_1.printError)((0, client_1.formatError)(err));
332
+ process.exitCode = 1;
333
+ }
334
+ });
335
+ }
336
+ /**
337
+ * Validate CLI options for compare command.
338
+ * Returns a descriptive error string if invalid, or null if valid.
339
+ */
340
+ function validateCompareOptions(options) {
341
+ if (!options.scenario) {
342
+ return 'Missing --scenario. Specify a scenario name, slug, or ID.';
343
+ }
344
+ if (!options.promptA || !options.promptB) {
345
+ return 'Both --prompt-a and --prompt-b are required. Each is a Prompt entity ID.';
346
+ }
347
+ return null;
348
+ }
349
+ async function runCompareAction(options, format) {
350
+ // Validate options
351
+ const validationError = validateCompareOptions(options);
352
+ if (validationError) {
353
+ (0, output_1.printError)(validationError);
354
+ process.exitCode = 1;
355
+ return;
356
+ }
357
+ // Resolve scenario
358
+ let scenarioId;
359
+ try {
360
+ scenarioId = await resolveScenarioId(options.scenario);
361
+ }
362
+ catch (err) {
363
+ (0, output_1.printError)((0, client_1.formatError)(err));
364
+ process.exitCode = 1;
365
+ return;
366
+ }
367
+ const labelA = `Prompt A`;
368
+ const labelB = `Prompt B`;
369
+ const modelA = options.promptA;
370
+ const modelB = options.promptB;
371
+ console.log('');
372
+ console.log(chalk_1.default.bold('chanl compare') +
373
+ chalk_1.default.dim(` \u2014 running ${options.scenario} against two prompts`));
374
+ console.log('');
375
+ // Run A
376
+ let executionA = null;
377
+ let errorA = null;
378
+ try {
379
+ executionA = await executeAndWait(scenarioId, options.promptA, `Prompt A (${options.promptA})`);
380
+ }
381
+ catch (err) {
382
+ errorA = (0, client_1.formatError)(err);
383
+ console.log(chalk_1.default.red(` Prompt A failed: ${errorA}`));
384
+ }
385
+ // Run B
386
+ let executionB = null;
387
+ let errorB = null;
388
+ try {
389
+ executionB = await executeAndWait(scenarioId, options.promptB, `Prompt B (${options.promptB})`);
390
+ }
391
+ catch (err) {
392
+ errorB = (0, client_1.formatError)(err);
393
+ console.log(chalk_1.default.red(` Prompt B failed: ${errorB}`));
394
+ }
395
+ // Extract metrics
396
+ const metricsA = extractMetrics(executionA);
397
+ const metricsB = extractMetrics(executionB);
398
+ // Determine winner
399
+ const { winner, reason } = determineWinner(metricsA, metricsB);
400
+ const result = {
401
+ scenario: options.scenario,
402
+ sideA: {
403
+ label: labelA,
404
+ model: modelA,
405
+ execution: executionA,
406
+ metrics: metricsA,
407
+ error: errorA,
408
+ },
409
+ sideB: {
410
+ label: labelB,
411
+ model: modelB,
412
+ execution: executionB,
413
+ metrics: metricsB,
414
+ error: errorB,
415
+ },
416
+ winner,
417
+ winnerReason: reason,
418
+ };
419
+ if (format === 'json') {
420
+ console.log(JSON.stringify(result, null, 2));
421
+ }
422
+ else {
423
+ console.log(formatComparisonTable(result));
424
+ }
425
+ }
426
+ function sleep(ms) {
427
+ return new Promise((resolve) => setTimeout(resolve, ms));
428
+ }
429
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../../src/commands/compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerConfigCommand(program: Command): void;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2BpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwE5D"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerConfigCommand = registerConfigCommand;
4
+ const config_1 = require("../config");
5
+ const output_1 = require("../output");
6
+ const VALID_KEYS = [
7
+ 'server',
8
+ 'apiKey',
9
+ 'provider',
10
+ 'openaiApiKey',
11
+ 'anthropicApiKey',
12
+ 'httpEndpoint',
13
+ 'httpApiKey',
14
+ 'twilioAccountSid',
15
+ 'twilioAuthToken',
16
+ 'twilioPhoneNumber',
17
+ 'analytics',
18
+ 'analyticsId',
19
+ ];
20
+ const SECRET_KEYS = [
21
+ 'apiKey',
22
+ 'openaiApiKey',
23
+ 'anthropicApiKey',
24
+ 'httpApiKey',
25
+ 'twilioAuthToken',
26
+ ];
27
+ function registerConfigCommand(program) {
28
+ const configCmd = program
29
+ .command('config')
30
+ .description('Manage CLI configuration');
31
+ configCmd
32
+ .command('set <key> <value>')
33
+ .description(`Set a configuration value (${VALID_KEYS.join(', ')})`)
34
+ .action((key, value) => {
35
+ if (!VALID_KEYS.includes(key)) {
36
+ (0, output_1.printError)(`Invalid config key "${key}". Valid keys: ${VALID_KEYS.join(', ')}`);
37
+ process.exit(1);
38
+ }
39
+ // Handle boolean values
40
+ const parsedValue = value === 'true' ? true : value === 'false' ? false : value;
41
+ (0, config_1.setConfig)(key, parsedValue);
42
+ const display = SECRET_KEYS.includes(key)
43
+ ? maskKey(String(value))
44
+ : value;
45
+ (0, output_1.printSuccess)(`${key} = ${display}`);
46
+ });
47
+ configCmd
48
+ .command('get <key>')
49
+ .description('Get a configuration value')
50
+ .action((key) => {
51
+ if (!VALID_KEYS.includes(key)) {
52
+ (0, output_1.printError)(`Invalid config key "${key}". Valid keys: ${VALID_KEYS.join(', ')}`);
53
+ process.exit(1);
54
+ }
55
+ const value = (0, config_1.getConfig)(key);
56
+ if (SECRET_KEYS.includes(key) && value) {
57
+ console.log(maskKey(String(value)));
58
+ }
59
+ else {
60
+ console.log(value !== undefined && value !== '' ? String(value) : '(not set)');
61
+ }
62
+ });
63
+ configCmd
64
+ .command('list')
65
+ .description('Show all configuration values')
66
+ .action(() => {
67
+ const config = (0, config_1.loadConfig)();
68
+ const format = program.opts().format;
69
+ const display = {};
70
+ for (const key of VALID_KEYS) {
71
+ const val = config[key];
72
+ if (SECRET_KEYS.includes(key) && val) {
73
+ display[key] = maskKey(String(val));
74
+ }
75
+ else {
76
+ display[key] = val !== undefined && val !== '' ? String(val) : '(not set)';
77
+ }
78
+ }
79
+ if (format === 'json') {
80
+ (0, output_1.printJson)(display);
81
+ }
82
+ else {
83
+ for (const [k, v] of Object.entries(display)) {
84
+ console.log(`${k.padEnd(20)} ${v}`);
85
+ }
86
+ }
87
+ });
88
+ }
89
+ function maskKey(key) {
90
+ if (key.length <= 8)
91
+ return '****';
92
+ return key.slice(0, 4) + '...' + key.slice(-4);
93
+ }
94
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Register the `chanl dataset` command group.
4
+ */
5
+ export declare function registerDatasetCommand(program: Command): void;
6
+ //# sourceMappingURL=dataset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/commands/dataset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkJ7D"}