inferock-bench 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,424 @@
1
+ // Copied from apps/proxy/src/adapters/openai.ts for inferock-bench Track C.
2
+ // Reuse approved by .claude/plans/oss-wave-2026-07.md "Track C Reuse Boundary".
3
+ import { canonicalAttempts, canonicalRequest, canonicalTiming, createStreamTimingCapture, providerRequestIdFromHeaders, recordStreamChunk, recordStreamToken, sanitizedProviderHeaders, streamTiming, } from "./canonical-v2.js";
4
+ import { asRecord, booleanValue, collectRateLimitHeaders, isRecord, joinUrl, numberValue, parseJsonRecord, recordArray, stringValue, textFromContent, } from "../record.js";
5
+ import { SseAccumulator } from "../sse.js";
6
+ /**
7
+ * @contract-id openai-adapter
8
+ */
9
+ export const openAiAdapter = {
10
+ provider: "openai",
11
+ buildRequest(input) {
12
+ const payload = withOpenAiStreamUsage(input.body);
13
+ return {
14
+ url: joinUrl(input.baseUrl, "/chat/completions"),
15
+ init: {
16
+ method: "POST",
17
+ headers: {
18
+ authorization: `Bearer ${input.apiKey}`,
19
+ "content-type": "application/json",
20
+ },
21
+ body: JSON.stringify(payload),
22
+ },
23
+ };
24
+ },
25
+ toCanonicalEvent(input) {
26
+ return mapOpenAiResponseToCanonical(input);
27
+ },
28
+ observeStream(input) {
29
+ return observeOpenAiStream(input);
30
+ },
31
+ };
32
+ export function mapOpenAiResponseToCanonical(input) {
33
+ const parsed = parseJsonRecord(input.responseBody);
34
+ const rateLimitHeaders = collectRateLimitHeaders(input.headers);
35
+ const providerRequestId = providerRequestIdFromHeaders(input.headers);
36
+ const sanitizedHeaders = sanitizedProviderHeaders(input.headers);
37
+ if (!parsed || input.statusCode >= 400 || isRecord(parsed.error)) {
38
+ const error = asRecord(parsed?.error);
39
+ const errorType = stringValue(error?.type) ?? "provider_error";
40
+ const errorCode = stringValue(error?.code);
41
+ const errorMessage = stringValue(error?.message) ?? "";
42
+ const servedModel = stringValue(parsed?.model) ?? input.requestModel;
43
+ const errorClass = `http_${input.statusCode}:${errorType}`;
44
+ return {
45
+ rateLimitHeaders,
46
+ event: {
47
+ schemaVersion: "v2",
48
+ request: canonicalRequest(input, "openai", "chat_completions"),
49
+ response: {
50
+ statusCode: input.statusCode,
51
+ finishReason: "error",
52
+ content: errorMessage,
53
+ servedModel,
54
+ ...(providerRequestId ? { providerRequestId } : {}),
55
+ ...(sanitizedHeaders ? { sanitizedHeaders } : {}),
56
+ rawErrorType: errorType,
57
+ ...(errorCode ? { rawErrorCode: errorCode } : {}),
58
+ providerSafety: openAiErrorSafety(errorType, errorCode),
59
+ errorClass,
60
+ },
61
+ usage: openAiUsageToCanonical({ input: 0, output: 0 }),
62
+ timing: canonicalTiming(input.startedAt, input.endedAt, "error"),
63
+ attempts: canonicalAttempts(input, "openai", servedModel, input.endedAt, "error", errorClass),
64
+ },
65
+ };
66
+ }
67
+ const choice = firstChoice(parsed);
68
+ const message = asRecord(choice?.message);
69
+ const usage = readOpenAiUsage(asRecord(parsed.usage));
70
+ const toolCalls = recordArray(message?.tool_calls);
71
+ const servedModel = stringValue(parsed.model) ?? input.requestModel;
72
+ const providerResponseId = stringValue(parsed.id);
73
+ return {
74
+ rateLimitHeaders,
75
+ event: {
76
+ schemaVersion: "v2",
77
+ request: canonicalRequest(input, "openai", "chat_completions"),
78
+ response: {
79
+ statusCode: input.statusCode,
80
+ finishReason: stringValue(choice?.finish_reason) ?? "",
81
+ content: textFromContent(message?.content),
82
+ servedModel,
83
+ ...(toolCalls && toolCalls.length > 0 ? { toolCalls } : {}),
84
+ ...(toolCalls && toolCalls.length > 0 ? { rawToolCalls: toolCalls } : {}),
85
+ ...(providerRequestId ? { providerRequestId } : {}),
86
+ ...(providerResponseId ? { providerResponseId, rawObjectId: providerResponseId } : {}),
87
+ ...(stringValue(parsed.system_fingerprint)
88
+ ? { systemFingerprint: stringValue(parsed.system_fingerprint) }
89
+ : {}),
90
+ ...(stringValue(parsed.service_tier) ? { serviceTier: stringValue(parsed.service_tier) } : {}),
91
+ ...(sanitizedHeaders ? { sanitizedHeaders } : {}),
92
+ ...optionalOpenAiSafety(choice, message),
93
+ },
94
+ usage: openAiUsageToCanonical(usage),
95
+ timing: canonicalTiming(input.startedAt, input.endedAt, "complete"),
96
+ attempts: canonicalAttempts(input, "openai", servedModel, input.endedAt, "success"),
97
+ },
98
+ };
99
+ }
100
+ function observeOpenAiStream(input) {
101
+ const decoder = new TextDecoder();
102
+ const parser = new SseAccumulator();
103
+ const state = {
104
+ content: "",
105
+ finishReason: "",
106
+ usage: { input: 0, output: 0 },
107
+ toolCalls: new Map(),
108
+ observedTerminalMarker: false,
109
+ providerSafety: [],
110
+ timing: createStreamTimingCapture(),
111
+ };
112
+ return input.body.pipeThrough(new TransformStream({
113
+ transform(chunk, controller) {
114
+ const observedAt = new Date();
115
+ let observedContentDelta = false;
116
+ for (const message of parser.push(decoder.decode(chunk, { stream: true }))) {
117
+ observedContentDelta = applyOpenAiStreamMessage(state, message.data, input.statusCode, observedAt) || observedContentDelta;
118
+ }
119
+ if (observedContentDelta)
120
+ recordStreamToken(state.timing, observedAt);
121
+ controller.enqueue(chunk);
122
+ },
123
+ flush() {
124
+ const observedAt = new Date();
125
+ const tail = decoder.decode();
126
+ for (const message of [...parser.push(tail), ...parser.end()]) {
127
+ if (applyOpenAiStreamMessage(state, message.data, input.statusCode, observedAt)) {
128
+ recordStreamToken(state.timing, observedAt);
129
+ }
130
+ }
131
+ if (state.timing.terminalStatus === "unknown") {
132
+ if (state.errorClass || input.statusCode >= 400) {
133
+ state.timing.terminalStatus = "error";
134
+ }
135
+ else {
136
+ state.timing.terminalStatus = state.observedTerminalMarker ? "complete" : "aborted";
137
+ }
138
+ }
139
+ input.onTerminal(finalizeOpenAiStream(input, state));
140
+ },
141
+ }));
142
+ }
143
+ function applyOpenAiStreamMessage(state, data, statusCode, observedAt) {
144
+ if (data === "[DONE]") {
145
+ state.observedTerminalMarker = true;
146
+ state.timing.terminalStatus = state.errorClass ? "error" : "complete";
147
+ return false;
148
+ }
149
+ const parsed = parseJsonRecord(data);
150
+ if (!parsed)
151
+ return false;
152
+ recordStreamChunk(state.timing, observedAt);
153
+ if (isRecord(parsed.error)) {
154
+ const errorType = stringValue(parsed.error.type) ?? "provider_error";
155
+ const errorCode = stringValue(parsed.error.code);
156
+ state.errorClass = `http_${statusCode}:${errorType}`;
157
+ state.rawErrorType = errorType;
158
+ state.rawErrorCode = errorCode;
159
+ state.finishReason = "error";
160
+ const errorSafety = openAiErrorSafety(errorType, errorCode);
161
+ if (errorSafety)
162
+ state.providerSafety.push(...errorSafety);
163
+ state.timing.terminalStatus = "error";
164
+ return false;
165
+ }
166
+ const id = stringValue(parsed.id);
167
+ if (id)
168
+ state.providerResponseId = id;
169
+ const fingerprint = stringValue(parsed.system_fingerprint);
170
+ if (fingerprint)
171
+ state.systemFingerprint = fingerprint;
172
+ const serviceTier = stringValue(parsed.service_tier);
173
+ if (serviceTier)
174
+ state.serviceTier = serviceTier;
175
+ const model = stringValue(parsed.model);
176
+ if (model)
177
+ state.model = model;
178
+ const usage = readOpenAiUsage(asRecord(parsed.usage));
179
+ if (usage.input > 0 || usage.output > 0 || usage.cacheRead !== undefined) {
180
+ state.usage = usage;
181
+ }
182
+ const choice = firstChoice(parsed);
183
+ const finishReason = stringValue(choice?.finish_reason);
184
+ if (finishReason)
185
+ state.finishReason = finishReason;
186
+ if (finishReason === "content_filter") {
187
+ state.providerSafety.push(openAiContentFilterSafety());
188
+ }
189
+ const delta = asRecord(choice?.delta);
190
+ const refusal = stringValue(delta?.refusal);
191
+ if (refusal) {
192
+ state.providerSafety.push(openAiRefusalSafety("choices[0].delta.refusal", refusal));
193
+ }
194
+ const contentPartRefusals = openAiContentPartRefusals(delta?.content, "choices[0].delta.content");
195
+ state.providerSafety.push(...contentPartRefusals);
196
+ const content = textFromContent(delta?.content);
197
+ if (content)
198
+ state.content += content;
199
+ const toolCalls = recordArray(delta?.tool_calls);
200
+ if (toolCalls)
201
+ appendOpenAiToolCallDeltas(state.toolCalls, toolCalls);
202
+ return Boolean(content) || Boolean(refusal) || contentPartRefusals.length > 0;
203
+ }
204
+ function finalizeOpenAiStream(input, state) {
205
+ const endedAt = new Date();
206
+ const servedModel = state.model ?? input.requestModel;
207
+ const providerRequestId = providerRequestIdFromHeaders(input.headers);
208
+ const sanitizedHeaders = sanitizedProviderHeaders(input.headers);
209
+ const terminalStatus = state.errorClass || input.statusCode >= 400 ? "error" : "success";
210
+ const toolCalls = openAiToolCallsFromAccumulators(state.toolCalls);
211
+ const response = {
212
+ statusCode: input.statusCode,
213
+ finishReason: state.finishReason,
214
+ content: state.content,
215
+ servedModel,
216
+ ...(toolCalls.length > 0 ? { toolCalls } : {}),
217
+ ...(toolCalls.length > 0 ? { rawToolCalls: toolCalls } : {}),
218
+ ...(providerRequestId ? { providerRequestId } : {}),
219
+ ...(state.providerResponseId ? { providerResponseId: state.providerResponseId, rawObjectId: state.providerResponseId } : {}),
220
+ ...(state.systemFingerprint ? { systemFingerprint: state.systemFingerprint } : {}),
221
+ ...(state.serviceTier ? { serviceTier: state.serviceTier } : {}),
222
+ ...(sanitizedHeaders ? { sanitizedHeaders } : {}),
223
+ ...(state.rawErrorType ? { rawErrorType: state.rawErrorType } : {}),
224
+ ...(state.rawErrorCode ? { rawErrorCode: state.rawErrorCode } : {}),
225
+ ...(state.providerSafety.length > 0 ? { providerSafety: state.providerSafety } : {}),
226
+ ...(state.errorClass ? { errorClass: state.errorClass } : {}),
227
+ };
228
+ return {
229
+ rateLimitHeaders: collectRateLimitHeaders(input.headers),
230
+ event: {
231
+ schemaVersion: "v2",
232
+ request: canonicalRequest(input, "openai", "chat_completions"),
233
+ response,
234
+ usage: openAiUsageToCanonical(state.usage),
235
+ timing: streamTiming(input.startedAt, endedAt, state.timing),
236
+ attempts: canonicalAttempts(input, "openai", servedModel, endedAt, terminalStatus, state.errorClass),
237
+ },
238
+ };
239
+ }
240
+ function appendOpenAiToolCallDeltas(accumulators, deltas) {
241
+ for (const delta of deltas) {
242
+ const index = numberValue(delta.index);
243
+ if (index === undefined)
244
+ continue;
245
+ const accumulator = accumulators.get(index) ?? {
246
+ index,
247
+ argumentFragments: [],
248
+ };
249
+ const functionDelta = asRecord(delta.function);
250
+ const id = stringValue(delta.id);
251
+ if (id)
252
+ accumulator.id = id;
253
+ const type = stringValue(delta.type);
254
+ if (type)
255
+ accumulator.type = type;
256
+ const functionName = stringValue(functionDelta?.name);
257
+ if (functionName)
258
+ accumulator.functionName = functionName;
259
+ const argumentFragment = stringValue(functionDelta?.arguments);
260
+ if (argumentFragment !== undefined)
261
+ accumulator.argumentFragments.push(argumentFragment);
262
+ accumulators.set(index, accumulator);
263
+ }
264
+ }
265
+ function openAiToolCallsFromAccumulators(accumulators) {
266
+ return [...accumulators.values()]
267
+ .sort((left, right) => left.index - right.index)
268
+ .map(openAiToolCallFromAccumulator);
269
+ }
270
+ function openAiToolCallFromAccumulator(accumulator) {
271
+ const argumentsText = accumulator.argumentFragments.join("");
272
+ const functionRecord = {
273
+ arguments: argumentsText,
274
+ };
275
+ if (accumulator.functionName)
276
+ functionRecord.name = accumulator.functionName;
277
+ return {
278
+ index: accumulator.index,
279
+ ...(accumulator.id ? { id: accumulator.id } : {}),
280
+ ...(accumulator.type ? { type: accumulator.type } : {}),
281
+ function: functionRecord,
282
+ argumentFragments: accumulator.argumentFragments,
283
+ argumentsParseResult: parseResult(argumentsText),
284
+ };
285
+ }
286
+ function parseResult(text) {
287
+ try {
288
+ JSON.parse(text);
289
+ return { ok: true };
290
+ }
291
+ catch {
292
+ return { ok: false, reason: "invalid_json" };
293
+ }
294
+ }
295
+ function withOpenAiStreamUsage(body) {
296
+ if (booleanValue(body.stream) !== true)
297
+ return body;
298
+ const streamOptions = isRecord(body.stream_options)
299
+ ? { ...body.stream_options, include_usage: true }
300
+ : { include_usage: true };
301
+ return {
302
+ ...body,
303
+ stream_options: streamOptions,
304
+ };
305
+ }
306
+ function firstChoice(parsed) {
307
+ const choices = parsed.choices;
308
+ if (!Array.isArray(choices))
309
+ return undefined;
310
+ return asRecord(choices[0]);
311
+ }
312
+ function readOpenAiUsage(usage) {
313
+ const promptDetails = asRecord(usage?.prompt_tokens_details);
314
+ const promptTokens = numberValue(usage?.prompt_tokens) ?? 0;
315
+ const cacheRead = numberValue(promptDetails?.cached_tokens);
316
+ return {
317
+ input: Math.max(0, promptTokens - (cacheRead ?? 0)),
318
+ output: numberValue(usage?.completion_tokens) ?? 0,
319
+ cacheRead,
320
+ ...(usage ? { raw: usage } : {}),
321
+ };
322
+ }
323
+ function openAiUsageToCanonical(usage) {
324
+ return {
325
+ input: usage.input,
326
+ output: usage.output,
327
+ ...(usage.cacheRead !== undefined
328
+ ? { cache: { read: usage.cacheRead } }
329
+ : {}),
330
+ ...(usage.raw ? { raw: usage.raw } : {}),
331
+ categories: openAiUsageCategories(usage),
332
+ usageSource: usage.raw ? "provider" : "missing",
333
+ };
334
+ }
335
+ function openAiUsageCategories(usage) {
336
+ const raw = usage.raw;
337
+ const promptDetails = asRecord(raw?.prompt_tokens_details);
338
+ const completionDetails = asRecord(raw?.completion_tokens_details);
339
+ return [
340
+ { category: "prompt", tokens: numberValue(raw?.prompt_tokens) ?? usage.input, sourceField: "prompt_tokens" },
341
+ { category: "completion", tokens: usage.output, sourceField: "completion_tokens" },
342
+ ...(usage.cacheRead !== undefined
343
+ ? [{ category: "cached", tokens: usage.cacheRead, sourceField: "prompt_tokens_details.cached_tokens" }]
344
+ : []),
345
+ ...optionalCategory("reasoning", completionDetails?.reasoning_tokens, "completion_tokens_details.reasoning_tokens"),
346
+ ...optionalCategory("audio", promptDetails?.audio_tokens, "prompt_tokens_details.audio_tokens"),
347
+ ...optionalCategory("audio", completionDetails?.audio_tokens, "completion_tokens_details.audio_tokens"),
348
+ ...providerSpecificCategories("openai", raw),
349
+ ];
350
+ }
351
+ function optionalOpenAiSafety(choice, message) {
352
+ const safety = [];
353
+ if (stringValue(choice?.finish_reason) === "content_filter") {
354
+ safety.push(openAiContentFilterSafety());
355
+ }
356
+ const refusal = stringValue(message?.refusal);
357
+ if (refusal) {
358
+ safety.push(openAiRefusalSafety("choices[0].message.refusal", refusal));
359
+ }
360
+ safety.push(...openAiContentPartRefusals(message?.content, "choices[0].message.content"));
361
+ return safety.length > 0 ? { providerSafety: safety } : {};
362
+ }
363
+ function openAiRefusalSafety(fieldPath, refusal) {
364
+ return {
365
+ kind: "refusal",
366
+ source: "provider",
367
+ reason: "refusal",
368
+ raw: {
369
+ fieldPath,
370
+ refusal,
371
+ },
372
+ };
373
+ }
374
+ function openAiContentFilterSafety() {
375
+ return {
376
+ kind: "content_filter",
377
+ source: "provider",
378
+ reason: "content_filter",
379
+ raw: {
380
+ fieldPath: "choices[0].finish_reason",
381
+ value: "content_filter",
382
+ },
383
+ };
384
+ }
385
+ function openAiContentPartRefusals(content, fieldPathPrefix) {
386
+ if (!Array.isArray(content))
387
+ return [];
388
+ return content.flatMap((item, index) => {
389
+ if (!isRecord(item) || item.type !== "refusal")
390
+ return [];
391
+ const refusal = stringValue(item.refusal);
392
+ if (!refusal)
393
+ return [];
394
+ return [openAiRefusalSafety(`${fieldPathPrefix}[${index}].refusal`, refusal)];
395
+ });
396
+ }
397
+ function openAiErrorSafety(errorType, errorCode) {
398
+ const evidence = `${errorType}:${errorCode ?? ""}`;
399
+ if (!/policy|safety|moderation|content_filter/.test(evidence))
400
+ return undefined;
401
+ return [{ kind: "moderation", source: "provider", reason: errorCode ?? errorType }];
402
+ }
403
+ function optionalCategory(category, value, sourceField) {
404
+ const tokens = numberValue(value);
405
+ return tokens === undefined ? [] : [{ category, tokens, sourceField }];
406
+ }
407
+ function providerSpecificCategories(provider, raw, prefix = "") {
408
+ if (!raw)
409
+ return [];
410
+ const categories = [];
411
+ for (const [key, value] of Object.entries(raw)) {
412
+ const path = prefix ? `${prefix}.${key}` : key;
413
+ const numeric = numberValue(value);
414
+ if (numeric !== undefined) {
415
+ categories.push({ category: `provider:${provider}:${path}`, tokens: numeric, sourceField: path });
416
+ continue;
417
+ }
418
+ const nested = asRecord(value);
419
+ if (nested)
420
+ categories.push(...providerSpecificCategories(provider, nested, path));
421
+ }
422
+ return categories;
423
+ }
424
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ // Copied from apps/proxy/src/adapters/types.ts for inferock-bench Track C.
2
+ // Reuse approved by .claude/plans/oss-wave-2026-07.md "Track C Reuse Boundary".
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF"}
package/dist/cli.js ADDED
@@ -0,0 +1,195 @@
1
+ import { benchKeyFromConfig, ensureBenchHome, ensureGeneratedBenchKey, ensureReliabilityIndexAsked, readBenchConfig, resolveBenchPaths, setReliabilityIndexEnabled, } from "./config.js";
2
+ import { runInit } from "./init.js";
3
+ import { createReceiptBundle, renderReceipt, writeReceiptBundle } from "./receipt.js";
4
+ import { startServer } from "./server.js";
5
+ import { JsonlEventStore } from "./storage.js";
6
+ import { renderReport, summarizeBenchEvents } from "./summary.js";
7
+ import { sendReliabilityIndexPayload } from "./telemetry.js";
8
+ export async function runCli(argv, runtime = {}) {
9
+ if (argv[0] === "help" || argv[0] === "--help" || argv[0] === "-h") {
10
+ (runtime.log ?? console.log)(helpText());
11
+ return;
12
+ }
13
+ const command = argv[0] && !argv[0].startsWith("-") ? argv[0] : "start";
14
+ const args = command === "start" ? (argv[0]?.startsWith("-") ? argv : argv.slice(1)) : argv.slice(1);
15
+ const env = runtime.env ?? process.env;
16
+ const cwd = runtime.cwd ?? process.cwd();
17
+ const log = runtime.log ?? console.log;
18
+ const error = runtime.error ?? console.error;
19
+ const paths = resolveBenchPaths(env);
20
+ await ensureBenchHome(paths);
21
+ let config = await readBenchConfig(paths);
22
+ config = await ensureGeneratedBenchKey({ paths, config });
23
+ if (command === "telemetry" || command === "index") {
24
+ await runTelemetryCommand({
25
+ command,
26
+ args,
27
+ paths,
28
+ config,
29
+ env,
30
+ log,
31
+ });
32
+ return;
33
+ }
34
+ config = await ensureReliabilityIndexAsked({
35
+ paths,
36
+ config,
37
+ env,
38
+ stdinIsTty: runtime.stdinIsTty,
39
+ stdoutIsTty: runtime.stdoutIsTty,
40
+ log,
41
+ });
42
+ if (command === "init") {
43
+ await runInit({
44
+ cwd,
45
+ host: stringArg(args, "--host"),
46
+ port: numberArg(args, "--port"),
47
+ patchFile: stringArg(args, "--patch"),
48
+ yes: booleanArg(args, "--yes"),
49
+ benchKey: config.benchKey ?? benchKeyFromConfig(config, env),
50
+ log,
51
+ });
52
+ return;
53
+ }
54
+ if (command === "start") {
55
+ await startServer({
56
+ paths,
57
+ config,
58
+ host: stringArg(args, "--host"),
59
+ port: numberArg(args, "--port"),
60
+ env,
61
+ log,
62
+ });
63
+ return;
64
+ }
65
+ if (command === "report" || command === "live") {
66
+ const summary = await currentSummary(paths.eventsFile, parseWindow(args));
67
+ log(renderReport(summary));
68
+ return;
69
+ }
70
+ if (command === "receipt") {
71
+ const compact = booleanArg(args, "--compact");
72
+ const jsonOnly = booleanArg(args, "--json");
73
+ const summary = await currentSummary(paths.eventsFile, parseWindow(args));
74
+ const bundle = createReceiptBundle(summary);
75
+ if (jsonOnly) {
76
+ log(JSON.stringify(bundle, null, 2));
77
+ return;
78
+ }
79
+ log(renderReceipt(bundle, compact));
80
+ const path = await writeReceiptBundle(paths.receiptsDir, bundle);
81
+ log(`JSON bundle: ${path}`);
82
+ return;
83
+ }
84
+ error(`Unknown command: ${command}`);
85
+ error(helpText());
86
+ throw new CliUsageError();
87
+ }
88
+ async function runTelemetryCommand(input) {
89
+ const action = input.args[0] ?? "status";
90
+ const wantsReliabilityIndex = input.command === "index" || input.args.includes("--reliability-index");
91
+ if (action === "enable" || action === "on") {
92
+ if (!wantsReliabilityIndex) {
93
+ input.log("Specify --reliability-index to enable reliability-index telemetry.");
94
+ return;
95
+ }
96
+ const config = await setReliabilityIndexEnabled({
97
+ paths: input.paths,
98
+ config: input.config,
99
+ enabled: true,
100
+ });
101
+ input.log("Reliability index enabled for anonymous aggregate failure counts only.");
102
+ await printTelemetryPayload(input.paths.eventsFile, config, input.env, input.log);
103
+ return;
104
+ }
105
+ if (action === "disable" || action === "off") {
106
+ await setReliabilityIndexEnabled({
107
+ paths: input.paths,
108
+ config: input.config,
109
+ enabled: false,
110
+ });
111
+ input.log("Reliability index disabled.");
112
+ return;
113
+ }
114
+ input.log(input.config.reliabilityIndex?.enabled
115
+ ? "Reliability index: enabled"
116
+ : "Reliability index: off");
117
+ await printTelemetryPayload(input.paths.eventsFile, input.config, input.env, input.log);
118
+ }
119
+ async function printTelemetryPayload(eventsFile, config, env, log) {
120
+ const summary = await currentSummary(eventsFile, {});
121
+ const result = await sendReliabilityIndexPayload({ config, summary, env });
122
+ log(result.message);
123
+ log(JSON.stringify(result.payload, null, 2));
124
+ }
125
+ async function currentSummary(eventsFile, window) {
126
+ const store = new JsonlEventStore(eventsFile);
127
+ return summarizeBenchEvents(await store.readAll(), window);
128
+ }
129
+ function parseWindow(args) {
130
+ const sinceText = stringArg(args, "--since");
131
+ const untilText = stringArg(args, "--until");
132
+ const lastText = stringArg(args, "--last");
133
+ const until = untilText ? parseDateOrThrow(untilText, "--until") : undefined;
134
+ const since = sinceText
135
+ ? parseDateOrThrow(sinceText, "--since")
136
+ : lastText
137
+ ? new Date((until ?? new Date()).getTime() - parseDurationMs(lastText))
138
+ : undefined;
139
+ return {
140
+ ...(since ? { since } : {}),
141
+ ...(until ? { until } : {}),
142
+ };
143
+ }
144
+ function parseDateOrThrow(value, flag) {
145
+ const date = new Date(value);
146
+ if (Number.isNaN(date.getTime())) {
147
+ throw new Error(`${flag} must be an ISO date/time.`);
148
+ }
149
+ return date;
150
+ }
151
+ function parseDurationMs(value) {
152
+ const match = value.match(/^(\d+)(m|h|d)$/);
153
+ if (!match)
154
+ throw new Error("--last must use m, h, or d, for example --last 24h.");
155
+ const amount = Number(match[1]);
156
+ const unit = match[2];
157
+ if (unit === "m")
158
+ return amount * 60_000;
159
+ if (unit === "h")
160
+ return amount * 60 * 60_000;
161
+ return amount * 24 * 60 * 60_000;
162
+ }
163
+ function stringArg(args, flag) {
164
+ const index = args.indexOf(flag);
165
+ if (index === -1)
166
+ return undefined;
167
+ return args[index + 1];
168
+ }
169
+ function numberArg(args, flag) {
170
+ const value = stringArg(args, flag);
171
+ if (!value)
172
+ return undefined;
173
+ const parsed = Number(value);
174
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
175
+ }
176
+ function booleanArg(args, flag) {
177
+ return args.includes(flag);
178
+ }
179
+ function helpText() {
180
+ return [
181
+ "inferock-bench",
182
+ "",
183
+ "Commands:",
184
+ " start [--host 127.0.0.1] [--port 4318]",
185
+ " init [--patch path/to/client.ts --yes]",
186
+ " report [--last 24h] [--since ISO] [--until ISO]",
187
+ " receipt --compact [--last 30d]",
188
+ " telemetry enable --reliability-index",
189
+ " telemetry disable --reliability-index",
190
+ " index on|off|status",
191
+ ].join("\n");
192
+ }
193
+ class CliUsageError extends Error {
194
+ }
195
+ //# sourceMappingURL=cli.js.map