@clipboard-health/tribunal 1.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 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../../packages/tribunal/src/html.ts"],"names":[],"mappings":"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"}
package/src/index.d.ts ADDED
@@ -0,0 +1,60 @@
1
+ import { type CreateIntermediateOutputRecorderInput } from "./intermediates.ts";
2
+ import { type ModelRole, type ModelSpec } from "./models.ts";
3
+ import { type ReasoningOverrides } from "./reasoning.ts";
4
+ import { type OutputFormat, type TribunalProgressHandler, type TribunalRequest, type TribunalResponse } from "./tribunal.ts";
5
+ export { formatOutput, type FormatOutputInput } from "./format.ts";
6
+ export { createDefaultIntermediateOutputPath, createIntermediateOutputRecorder, type CreateIntermediateOutputRecorderInput, type IntermediateOutputCall, type IntermediateOutputEvent, type IntermediateOutputRecorder, type IntermediateOutputRunStatus, type IntermediateOutputSnapshot, } from "./intermediates.ts";
7
+ export { DEFAULT_MODELS, formatModelSpec, parseModelOverride, parseModelRole, parseModelSpec, resolveLanguageModel, resolveModelSet, } from "./models.ts";
8
+ export { createReasoningProviderOptions, parseReasoningLevel, parseReasoningOverride, type ReasoningLevel, type ReasoningOverride, type ReasoningOverrides, type ReasoningProviderOptions, } from "./reasoning.ts";
9
+ export { type Claim, claimSchema, confidenceSchema, type DeliberationResult, deliberationResultSchema, type PerspectiveResult, perspectiveResultSchema, type Role, roleSchema, } from "./schemas.ts";
10
+ export { type CallMetadata, type CostEstimate, type CostEstimateCall, estimateCostUsd, normalizeUsage, type OutputFormat, type PerspectiveOutput, runStructuredOutput, runTribunal, type StructuredOutputInput, type StructuredOutputResult, type StructuredOutputRunner, sumTokenUsage, type TokenUsage, type TribunalProgressEvent, type TribunalProgressHandler, type TribunalProgressStatus, type TribunalRequest, type TribunalResponse, } from "./tribunal.ts";
11
+ export interface ParsedCliArguments {
12
+ query: string;
13
+ context?: string;
14
+ contextFilePath?: string;
15
+ models: Partial<Record<ModelRole, ModelSpec>>;
16
+ reasoning: ReasoningOverrides;
17
+ intermediateOutputFilePath?: string;
18
+ htmlReportFilePath?: string;
19
+ outputFormat: OutputFormat;
20
+ showPerspectives: boolean;
21
+ shouldSaveIntermediates: boolean;
22
+ shouldWriteHtmlReport: boolean;
23
+ shouldOpenHtmlReport: boolean;
24
+ verbose: boolean;
25
+ shouldShowHelp: boolean;
26
+ }
27
+ export interface LoadContextInput {
28
+ cwd: string;
29
+ inlineContext?: string;
30
+ contextFilePath?: string;
31
+ maxContextChars?: number;
32
+ readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
33
+ }
34
+ export interface LoadedContext {
35
+ context?: string;
36
+ warnings: string[];
37
+ }
38
+ export interface TextWritable {
39
+ write(chunk: string): void;
40
+ }
41
+ export interface RunCliInput {
42
+ argv?: readonly string[];
43
+ cwd?: string;
44
+ environment?: Record<string, string | undefined>;
45
+ stdout?: TextWritable;
46
+ stderr?: TextWritable;
47
+ readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
48
+ writeFile?: CreateIntermediateOutputRecorderInput["writeFile"];
49
+ makeDirectory?: CreateIntermediateOutputRecorderInput["makeDirectory"];
50
+ writeHtmlReport?: (filePath: string, html: string) => Promise<void>;
51
+ openHtmlReport?: (filePath: string) => Promise<void>;
52
+ now?: () => Date;
53
+ runTribunal?: (request: TribunalRequest, options: {
54
+ environment: Record<string, string | undefined>;
55
+ onProgress?: TribunalProgressHandler;
56
+ }) => Promise<TribunalResponse>;
57
+ }
58
+ export declare function parseCliArguments(argv: readonly string[]): ParsedCliArguments;
59
+ export declare function loadContext(input: LoadContextInput): Promise<LoadedContext>;
60
+ export declare function runCli(input?: RunCliInput): Promise<number>;
package/src/index.js ADDED
@@ -0,0 +1,573 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, readFile as readFileFromDisk, writeFile as writeFileToDisk, } from "node:fs/promises";
3
+ import { dirname, resolve } from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { formatOutput } from "./format.js";
6
+ import { renderHtmlReport } from "./html.js";
7
+ import { createDefaultIntermediateOutputPath, createIntermediateOutputRecorder, } from "./intermediates.js";
8
+ import { formatModelSpec, parseModelOverride, parseModelSpec, } from "./models.js";
9
+ import { parseReasoningOverride } from "./reasoning.js";
10
+ import { runTribunal as runTribunalDefault, } from "./tribunal.js";
11
+ export { formatOutput } from "./format.js";
12
+ export { createDefaultIntermediateOutputPath, createIntermediateOutputRecorder, } from "./intermediates.js";
13
+ export { DEFAULT_MODELS, formatModelSpec, parseModelOverride, parseModelRole, parseModelSpec, resolveLanguageModel, resolveModelSet, } from "./models.js";
14
+ export { createReasoningProviderOptions, parseReasoningLevel, parseReasoningOverride, } from "./reasoning.js";
15
+ export { claimSchema, confidenceSchema, deliberationResultSchema, perspectiveResultSchema, roleSchema, } from "./schemas.js";
16
+ export { estimateCostUsd, normalizeUsage, runStructuredOutput, runTribunal, sumTokenUsage, } from "./tribunal.js";
17
+ const MAX_CONTEXT_CHARS = 120_000;
18
+ const DEFAULT_PROGRESS_INTERVAL_MS = 5000;
19
+ const USAGE = `Usage:
20
+ tribunal "Should we use microservices or a monolith?"
21
+
22
+ Flags:
23
+ --context <text> Inline context string
24
+ --context-file <path> Read additional context from a file
25
+ --model <role=provider:model> Override advocate, skeptic, or analyst model
26
+ --deliberator <provider:model> Override deliberator model
27
+ --reasoning <role=level> Override reasoning for advocate, skeptic, analyst, or deliberator
28
+ --output <text|json|markdown> Output format; default text
29
+ --show-perspectives Include specialist outputs in text/markdown
30
+ --save-intermediates <path> Write intermediate run snapshots; default .tribunal/runs/<timestamp>.json
31
+ --no-save-intermediates Disable intermediate run snapshots
32
+ --html <path> Write HTML report; default .tribunal/reports/<timestamp>.html
33
+ --no-html Disable HTML report
34
+ --no-open Write the HTML report but skip opening it
35
+ --verbose Print progress, wait dots, and warnings to stderr
36
+ -h, --help Show usage`;
37
+ export function parseCliArguments(argv) {
38
+ const positionalArguments = [];
39
+ const models = {};
40
+ const reasoning = {};
41
+ let intermediateOutputFilePath;
42
+ let htmlReportFilePath;
43
+ let context;
44
+ let contextFilePath;
45
+ let outputFormat = "text";
46
+ let showPerspectives = false;
47
+ let shouldSaveIntermediates = true;
48
+ let shouldWriteHtmlReport = true;
49
+ let shouldOpenHtmlReport = true;
50
+ let verbose = false;
51
+ let shouldShowHelp = false;
52
+ for (let index = 0; index < argv.length; index += 1) {
53
+ const argument = argv[index];
54
+ if (argument === undefined) {
55
+ continue;
56
+ }
57
+ switch (argument) {
58
+ case "-h":
59
+ case "--help": {
60
+ shouldShowHelp = true;
61
+ break;
62
+ }
63
+ case "--context": {
64
+ context = readFlagValue({ argv, flag: argument, index });
65
+ index += 1;
66
+ break;
67
+ }
68
+ case "--context-file": {
69
+ contextFilePath = readFlagValue({ argv, flag: argument, index });
70
+ index += 1;
71
+ break;
72
+ }
73
+ case "--model": {
74
+ const override = parseModelOverride(readFlagValue({ argv, flag: argument, index }));
75
+ models[override.role] = override.model;
76
+ index += 1;
77
+ break;
78
+ }
79
+ case "--deliberator": {
80
+ models.deliberator = parseModelSpec(readFlagValue({ argv, flag: argument, index }));
81
+ index += 1;
82
+ break;
83
+ }
84
+ case "--reasoning": {
85
+ const override = parseReasoningOverride(readFlagValue({ argv, flag: argument, index }));
86
+ reasoning[override.role] = override.level;
87
+ index += 1;
88
+ break;
89
+ }
90
+ case "--output": {
91
+ outputFormat = parseOutputFormat(readFlagValue({ argv, flag: argument, index }));
92
+ index += 1;
93
+ break;
94
+ }
95
+ case "--show-perspectives": {
96
+ showPerspectives = true;
97
+ break;
98
+ }
99
+ case "--save-intermediates": {
100
+ intermediateOutputFilePath = readFlagValue({ argv, flag: argument, index });
101
+ shouldSaveIntermediates = true;
102
+ index += 1;
103
+ break;
104
+ }
105
+ case "--no-save-intermediates": {
106
+ shouldSaveIntermediates = false;
107
+ intermediateOutputFilePath = undefined;
108
+ break;
109
+ }
110
+ case "--verbose": {
111
+ verbose = true;
112
+ break;
113
+ }
114
+ default: {
115
+ const htmlState = {
116
+ htmlReportFilePath,
117
+ shouldOpenHtmlReport,
118
+ shouldWriteHtmlReport,
119
+ };
120
+ const htmlAdvance = tryApplyHtmlFlag({ argv, argument, index, state: htmlState });
121
+ if (htmlAdvance >= 0) {
122
+ ({ htmlReportFilePath, shouldOpenHtmlReport, shouldWriteHtmlReport } = htmlState);
123
+ index += htmlAdvance;
124
+ break;
125
+ }
126
+ if (argument.startsWith("-")) {
127
+ throw new Error(`Unknown flag: ${argument}`);
128
+ }
129
+ positionalArguments.push(argument);
130
+ break;
131
+ }
132
+ }
133
+ }
134
+ const query = positionalArguments.join(" ").trim();
135
+ if (!shouldShowHelp && query.length === 0) {
136
+ throw new Error("Query is required. Run tribunal --help for usage.");
137
+ }
138
+ const parsedArguments = {
139
+ query,
140
+ models,
141
+ outputFormat,
142
+ reasoning,
143
+ shouldOpenHtmlReport,
144
+ shouldSaveIntermediates,
145
+ shouldWriteHtmlReport,
146
+ showPerspectives,
147
+ verbose,
148
+ shouldShowHelp,
149
+ };
150
+ assignParsedContext(parsedArguments, context);
151
+ assignParsedContextFilePath(parsedArguments, contextFilePath);
152
+ assignParsedIntermediateOutputFilePath(parsedArguments, intermediateOutputFilePath);
153
+ assignParsedHtmlReportFilePath(parsedArguments, htmlReportFilePath);
154
+ return parsedArguments;
155
+ }
156
+ export async function loadContext(input) {
157
+ const { contextFilePath, cwd, inlineContext, maxContextChars = MAX_CONTEXT_CHARS, readFile = readFileFromDisk, } = input;
158
+ const warnings = [];
159
+ const parts = [];
160
+ if (inlineContext !== undefined) {
161
+ parts.push(inlineContext);
162
+ }
163
+ if (contextFilePath !== undefined) {
164
+ let fileContents;
165
+ try {
166
+ fileContents = await readFile(resolve(cwd, contextFilePath), "utf8");
167
+ }
168
+ catch (error) {
169
+ throw new Error(`Failed to read context file ${contextFilePath}: ${formatErrorMessage(error)}`, { cause: error });
170
+ }
171
+ if (inlineContext !== undefined) {
172
+ parts.splice(0, 1, `Inline context:\n\n${inlineContext}`);
173
+ }
174
+ parts.push(`File context from ${contextFilePath}:\n\n${fileContents}`);
175
+ }
176
+ if (parts.length === 0) {
177
+ return { warnings };
178
+ }
179
+ const combinedContext = parts.join("\n\n");
180
+ if (combinedContext.length <= maxContextChars) {
181
+ return { context: combinedContext, warnings };
182
+ }
183
+ warnings.push(`Context exceeded ${maxContextChars} characters and was truncated.`);
184
+ return {
185
+ context: combinedContext.slice(0, maxContextChars),
186
+ warnings,
187
+ };
188
+ }
189
+ export async function runCli(input = {}) {
190
+ const argv = input.argv ?? process.argv.slice(2);
191
+ const cwd = input.cwd ?? process.cwd();
192
+ // oxlint-disable-next-line node/no-process-env -- CLI defaults to inherited environment so op run can inject API keys and model override vars at runtime.
193
+ const environment = input.environment ?? process.env;
194
+ const stdout = input.stdout ?? process.stdout;
195
+ const stderr = input.stderr ?? process.stderr;
196
+ const runTribunal = input.runTribunal ?? runTribunalDefault;
197
+ let progressReporter;
198
+ let intermediateOutputRecorder;
199
+ try {
200
+ const parsedArguments = parseCliArguments(argv);
201
+ if (parsedArguments.shouldShowHelp) {
202
+ stdout.write(`${USAGE}\n`);
203
+ return 0;
204
+ }
205
+ if (parsedArguments.verbose) {
206
+ stderr.write("Running tribunal...\n");
207
+ progressReporter = createCliProgressReporter({
208
+ intervalMs: DEFAULT_PROGRESS_INTERVAL_MS,
209
+ stderr,
210
+ });
211
+ }
212
+ const loadContextInput = createLoadContextInput({
213
+ cwd,
214
+ parsedArguments,
215
+ readFile: input.readFile,
216
+ });
217
+ const loadedContext = await loadContext(loadContextInput);
218
+ const tribunalRequest = createTribunalRequest(parsedArguments, loadedContext);
219
+ intermediateOutputRecorder = await createCliIntermediateOutputRecorder({
220
+ cwd,
221
+ makeDirectory: input.makeDirectory,
222
+ now: input.now,
223
+ parsedArguments,
224
+ request: tribunalRequest,
225
+ stderr,
226
+ writeFile: input.writeFile,
227
+ });
228
+ const onProgress = createProgressHandler({
229
+ intermediateOutputRecorder,
230
+ progressReporter,
231
+ });
232
+ const runTribunalOptions = { environment };
233
+ if (onProgress !== undefined) {
234
+ runTribunalOptions.onProgress = onProgress;
235
+ }
236
+ const response = await runTribunal(tribunalRequest, runTribunalOptions);
237
+ const responseWithContextWarnings = appendWarnings(response, loadedContext.warnings);
238
+ await intermediateOutputRecorder?.markCompleted(responseWithContextWarnings);
239
+ stdout.write(`${formatOutput(responseWithContextWarnings, {
240
+ outputFormat: parsedArguments.outputFormat,
241
+ showPerspectives: parsedArguments.showPerspectives,
242
+ })}\n`);
243
+ await writeAndOpenHtmlReport({
244
+ cwd,
245
+ now: input.now,
246
+ openHtmlReport: input.openHtmlReport,
247
+ parsedArguments,
248
+ request: tribunalRequest,
249
+ response: responseWithContextWarnings,
250
+ stderr,
251
+ writeHtmlReport: input.writeHtmlReport,
252
+ });
253
+ if (parsedArguments.verbose) {
254
+ writeWarnings(stderr, responseWithContextWarnings.metadata.warnings);
255
+ }
256
+ return 0;
257
+ }
258
+ catch (error) {
259
+ try {
260
+ await intermediateOutputRecorder?.markFailed(error);
261
+ }
262
+ catch (recordingError) {
263
+ stderr.write(`Warning: Failed to persist failure snapshot: ${formatErrorMessage(recordingError)}\n`);
264
+ }
265
+ stderr.write(`Error: ${formatErrorMessage(error)}\n`);
266
+ return 1;
267
+ }
268
+ finally {
269
+ progressReporter?.stop();
270
+ }
271
+ }
272
+ function tryApplyHtmlFlag(input) {
273
+ const { argument, argv, index, state } = input;
274
+ if (argument === "--html") {
275
+ state.htmlReportFilePath = readFlagValue({ argv, flag: argument, index });
276
+ state.shouldWriteHtmlReport = true;
277
+ return 1;
278
+ }
279
+ if (argument === "--no-html") {
280
+ state.shouldWriteHtmlReport = false;
281
+ state.htmlReportFilePath = undefined;
282
+ return 0;
283
+ }
284
+ if (argument === "--no-open") {
285
+ state.shouldOpenHtmlReport = false;
286
+ return 0;
287
+ }
288
+ return -1;
289
+ }
290
+ function readFlagValue(input) {
291
+ const value = input.argv[input.index + 1];
292
+ if (value === undefined || value.startsWith("--")) {
293
+ throw new Error(`Missing value for ${input.flag}`);
294
+ }
295
+ return value;
296
+ }
297
+ function parseOutputFormat(input) {
298
+ switch (input) {
299
+ case "text": {
300
+ return input;
301
+ }
302
+ case "json": {
303
+ return input;
304
+ }
305
+ case "markdown": {
306
+ return input;
307
+ }
308
+ default: {
309
+ throw new Error(`Unknown output format: ${input}`);
310
+ }
311
+ }
312
+ }
313
+ function assignParsedContext(arguments_, context) {
314
+ if (context === undefined) {
315
+ return;
316
+ }
317
+ arguments_.context = context;
318
+ }
319
+ function assignParsedContextFilePath(arguments_, contextFilePath) {
320
+ if (contextFilePath === undefined) {
321
+ return;
322
+ }
323
+ arguments_.contextFilePath = contextFilePath;
324
+ }
325
+ function assignParsedIntermediateOutputFilePath(arguments_, intermediateOutputFilePath) {
326
+ if (intermediateOutputFilePath === undefined) {
327
+ return;
328
+ }
329
+ arguments_.intermediateOutputFilePath = intermediateOutputFilePath;
330
+ }
331
+ function assignParsedHtmlReportFilePath(arguments_, htmlReportFilePath) {
332
+ if (htmlReportFilePath === undefined) {
333
+ return;
334
+ }
335
+ arguments_.htmlReportFilePath = htmlReportFilePath;
336
+ }
337
+ function createLoadContextInput(input) {
338
+ const { cwd, parsedArguments, readFile } = input;
339
+ const loadContextInput = { cwd };
340
+ if (parsedArguments.contextFilePath !== undefined) {
341
+ loadContextInput.contextFilePath = parsedArguments.contextFilePath;
342
+ }
343
+ if (parsedArguments.context !== undefined) {
344
+ loadContextInput.inlineContext = parsedArguments.context;
345
+ }
346
+ if (readFile !== undefined) {
347
+ loadContextInput.readFile = readFile;
348
+ }
349
+ return loadContextInput;
350
+ }
351
+ function createTribunalRequest(parsedArguments, loadedContext) {
352
+ const request = {
353
+ query: parsedArguments.query,
354
+ models: parsedArguments.models,
355
+ reasoning: parsedArguments.reasoning,
356
+ showPerspectives: parsedArguments.showPerspectives,
357
+ };
358
+ if (loadedContext.context !== undefined) {
359
+ request.context = loadedContext.context;
360
+ }
361
+ return request;
362
+ }
363
+ function appendWarnings(response, warnings) {
364
+ if (warnings.length === 0) {
365
+ return response;
366
+ }
367
+ return {
368
+ ...response,
369
+ metadata: {
370
+ ...response.metadata,
371
+ warnings: [...warnings, ...response.metadata.warnings],
372
+ },
373
+ };
374
+ }
375
+ function writeWarnings(stderr, warnings) {
376
+ for (const warning of warnings) {
377
+ stderr.write(`Warning: ${warning}\n`);
378
+ }
379
+ }
380
+ async function createCliIntermediateOutputRecorder(input) {
381
+ const { cwd, makeDirectory, now, parsedArguments, request, stderr, writeFile } = input;
382
+ if (!parsedArguments.shouldSaveIntermediates) {
383
+ return undefined;
384
+ }
385
+ const filePath = resolveIntermediateOutputFilePath({ cwd, now, parsedArguments });
386
+ const recorderInput = { filePath, request };
387
+ if (makeDirectory !== undefined) {
388
+ recorderInput.makeDirectory = makeDirectory;
389
+ }
390
+ if (writeFile !== undefined) {
391
+ recorderInput.writeFile = writeFile;
392
+ }
393
+ if (now !== undefined) {
394
+ recorderInput.now = now;
395
+ }
396
+ const recorder = await createIntermediateOutputRecorder(recorderInput);
397
+ stderr.write(`Saving intermediate outputs to ${filePath}\n`);
398
+ return recorder;
399
+ }
400
+ function resolveIntermediateOutputFilePath(input) {
401
+ const { cwd, now, parsedArguments } = input;
402
+ if (parsedArguments.intermediateOutputFilePath !== undefined) {
403
+ return resolve(cwd, parsedArguments.intermediateOutputFilePath);
404
+ }
405
+ if (now === undefined) {
406
+ return createDefaultIntermediateOutputPath({ cwd });
407
+ }
408
+ return createDefaultIntermediateOutputPath({ cwd, now });
409
+ }
410
+ const HTML_REPORT_DIRECTORY = ".tribunal/reports";
411
+ async function writeAndOpenHtmlReport(input) {
412
+ const { cwd, now, openHtmlReport, parsedArguments, request, response, stderr, writeHtmlReport } = input;
413
+ if (!parsedArguments.shouldWriteHtmlReport) {
414
+ return;
415
+ }
416
+ const generatedAt = now === undefined ? new Date() : now();
417
+ const filePath = resolveHtmlReportFilePath({ cwd, generatedAt, parsedArguments });
418
+ const html = renderHtmlReport({
419
+ generatedAt,
420
+ query: request.query,
421
+ response,
422
+ ...(request.context === undefined ? {} : { context: request.context }),
423
+ });
424
+ const writer = writeHtmlReport ?? defaultWriteHtmlReport;
425
+ try {
426
+ await writer(filePath, html);
427
+ stderr.write(`Wrote HTML report to ${filePath}\n`);
428
+ }
429
+ catch (error) {
430
+ stderr.write(`Warning: Failed to write HTML report: ${formatErrorMessage(error)}\n`);
431
+ return;
432
+ }
433
+ if (!parsedArguments.shouldOpenHtmlReport) {
434
+ return;
435
+ }
436
+ const opener = openHtmlReport ?? defaultOpenHtmlReport;
437
+ try {
438
+ await opener(filePath);
439
+ }
440
+ catch (error) {
441
+ stderr.write(`Warning: Failed to open HTML report: ${formatErrorMessage(error)}\n`);
442
+ }
443
+ }
444
+ function resolveHtmlReportFilePath(input) {
445
+ const { cwd, generatedAt, parsedArguments } = input;
446
+ if (parsedArguments.htmlReportFilePath !== undefined) {
447
+ return resolve(cwd, parsedArguments.htmlReportFilePath);
448
+ }
449
+ const timestamp = generatedAt.toISOString().replaceAll(":", "-").replaceAll(".", "-");
450
+ return resolve(cwd, HTML_REPORT_DIRECTORY, `${timestamp}.html`);
451
+ }
452
+ async function defaultWriteHtmlReport(filePath, html) {
453
+ await mkdir(dirname(filePath), { recursive: true });
454
+ await writeFileToDisk(filePath, html, "utf8");
455
+ }
456
+ async function defaultOpenHtmlReport(filePath) {
457
+ const { command, args } = getOpenCommand(filePath);
458
+ const child = spawn(command, args, { detached: true, stdio: "ignore" });
459
+ child.on("error", () => {
460
+ // Swallow spawn errors (e.g., open/xdg-open not installed); the file was still written.
461
+ });
462
+ child.unref();
463
+ }
464
+ function getOpenCommand(filePath) {
465
+ if (process.platform === "darwin") {
466
+ return { command: "open", args: [filePath] };
467
+ }
468
+ if (process.platform === "win32") {
469
+ return { command: "cmd", args: ["/c", "start", "", filePath] };
470
+ }
471
+ return { command: "xdg-open", args: [filePath] };
472
+ }
473
+ function createProgressHandler(input) {
474
+ const { intermediateOutputRecorder, progressReporter } = input;
475
+ if (progressReporter === undefined && intermediateOutputRecorder === undefined) {
476
+ return undefined;
477
+ }
478
+ return async (event) => {
479
+ await progressReporter?.onProgress(event);
480
+ await intermediateOutputRecorder?.onProgress(event);
481
+ };
482
+ }
483
+ function createCliProgressReporter(input) {
484
+ const { intervalMs, stderr } = input;
485
+ const activeRoles = new Set();
486
+ let interval;
487
+ let hasOpenDotLine = false;
488
+ function onProgress(event) {
489
+ if (event.status === "started") {
490
+ activeRoles.add(event.role);
491
+ writeProgressLine(`Starting ${event.role} (${formatModelSpec(event.model)})...`);
492
+ startTimer();
493
+ return;
494
+ }
495
+ if (event.status === "completed") {
496
+ activeRoles.delete(event.role);
497
+ writeProgressLine(`Finished ${event.role} in ${formatProgressDuration(event.latencyMs)}.`);
498
+ stopTimerIfIdle();
499
+ return;
500
+ }
501
+ activeRoles.delete(event.role);
502
+ writeProgressLine(`Failed ${event.role} (${formatModelSpec(event.model)}).`);
503
+ stopTimerIfIdle();
504
+ }
505
+ function startTimer() {
506
+ if (interval !== undefined) {
507
+ return;
508
+ }
509
+ interval = setInterval(writeProgressTick, intervalMs);
510
+ }
511
+ function writeProgressTick() {
512
+ if (activeRoles.size === 0) {
513
+ return;
514
+ }
515
+ stderr.write(".");
516
+ hasOpenDotLine = true;
517
+ }
518
+ function writeProgressLine(line) {
519
+ if (hasOpenDotLine) {
520
+ stderr.write("\n");
521
+ hasOpenDotLine = false;
522
+ }
523
+ stderr.write(`${line}\n`);
524
+ }
525
+ function stopTimerIfIdle() {
526
+ if (activeRoles.size > 0) {
527
+ return;
528
+ }
529
+ stop();
530
+ }
531
+ function stop() {
532
+ if (interval !== undefined) {
533
+ clearInterval(interval);
534
+ interval = undefined;
535
+ }
536
+ if (!hasOpenDotLine) {
537
+ return;
538
+ }
539
+ stderr.write("\n");
540
+ hasOpenDotLine = false;
541
+ }
542
+ return { onProgress, stop };
543
+ }
544
+ function formatProgressDuration(latencyMs) {
545
+ if (latencyMs === undefined) {
546
+ return "unknown duration";
547
+ }
548
+ if (latencyMs < 1000) {
549
+ return `${Math.round(latencyMs)}ms`;
550
+ }
551
+ return `${formatSeconds(latencyMs / 1000)}s`;
552
+ }
553
+ function formatSeconds(seconds) {
554
+ if (seconds < 10) {
555
+ return seconds.toFixed(1);
556
+ }
557
+ return `${Math.round(seconds)}`;
558
+ }
559
+ function formatErrorMessage(error) {
560
+ return error instanceof Error ? error.message : String(error);
561
+ }
562
+ function isMainModule(argv, moduleUrl) {
563
+ const [, entryPoint] = argv;
564
+ if (entryPoint === undefined) {
565
+ return false;
566
+ }
567
+ return pathToFileURL(resolve(entryPoint)).href === moduleUrl;
568
+ }
569
+ /* v8 ignore next @preserve */
570
+ if (isMainModule(process.argv, import.meta.url)) {
571
+ process.exitCode = await runCli();
572
+ }
573
+ //# sourceMappingURL=index.js.map