@noego/telemetry 0.0.5 → 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.
- package/README.md +6 -0
- package/dist/browser/index.d.cts +6 -5
- package/dist/browser/index.d.ts +6 -5
- package/dist/{browser_telemetry_client-BSAMZ8Qb.d.cts → browser_telemetry_client-ClZl3awO.d.cts} +2 -2
- package/dist/{browser_telemetry_client-DPBU6NGw.d.ts → browser_telemetry_client-t4dPp8Ku.d.ts} +2 -2
- package/dist/cli/telemetry_bin.cjs +393 -35
- package/dist/cli/telemetry_bin.cjs.map +1 -1
- package/dist/cli/telemetry_bin.js +378 -20
- package/dist/cli/telemetry_bin.js.map +1 -1
- package/dist/cli/telemetry_cli.cjs +393 -35
- package/dist/cli/telemetry_cli.cjs.map +1 -1
- package/dist/cli/telemetry_cli.d.cts +35 -5
- package/dist/cli/telemetry_cli.d.ts +35 -5
- package/dist/cli/telemetry_cli.js +378 -20
- package/dist/cli/telemetry_cli.js.map +1 -1
- package/dist/{client_defaults-ShVYQYmn.d.ts → client_defaults-CZ8PysZX.d.ts} +2 -2
- package/dist/{client_defaults-Dk0MMzvx.d.cts → client_defaults-lDbWYWWK.d.cts} +2 -2
- package/dist/core/index.cjs +5 -1
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.cts +15 -12
- package/dist/core/index.d.ts +15 -12
- package/dist/core/index.js +5 -1
- package/dist/core/index.js.map +1 -1
- package/dist/electron/index.d.cts +5 -4
- package/dist/electron/index.d.ts +5 -4
- package/dist/{envelope.types-rOLpWXRC.d.cts → envelope.types-DIvZD3xH.d.ts} +2 -6
- package/dist/{envelope.types-rOLpWXRC.d.ts → envelope.types-DyrlRG49.d.cts} +2 -6
- package/dist/{in_memory_batch_transport-DKW9EZnU.d.cts → in_memory_batch_transport-3T6gElXP.d.cts} +1 -1
- package/dist/{in_memory_batch_transport-oOwNxXnA.d.ts → in_memory_batch_transport-DpQU6JqM.d.ts} +1 -1
- package/dist/index.cjs +5 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -12
- package/dist/index.d.ts +14 -12
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/json.types-BqS77fcN.d.cts +7 -0
- package/dist/json.types-BqS77fcN.d.ts +7 -0
- package/dist/{maintenance_coordinator.types-C4ULi4A4.d.cts → maintenance_coordinator.types-Crhx9i9k.d.cts} +3 -3
- package/dist/{maintenance_coordinator.types-ikUrRXmO.d.ts → maintenance_coordinator.types-DprmgpVn.d.ts} +3 -3
- package/dist/metric.types-D8aOAnUm.d.ts +67 -0
- package/dist/metric.types-Dg4eZq6u.d.cts +67 -0
- package/dist/{metric_definition_contract-BYtnODhu.d.ts → metric_definition_contract-C6MERhJs.d.ts} +1 -1
- package/dist/{metric_definition_contract-DfhhmTZ1.d.cts → metric_definition_contract-DoAk7NOw.d.cts} +1 -1
- package/dist/node/index.cjs +5 -1
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +11 -9
- package/dist/node/index.d.ts +11 -9
- package/dist/node/index.js +5 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/producer/index.d.cts +5 -4
- package/dist/node/producer/index.d.ts +5 -4
- package/dist/projector/index.cjs +1370 -0
- package/dist/projector/index.cjs.map +1 -0
- package/dist/projector/index.d.cts +246 -0
- package/dist/projector/index.d.ts +246 -0
- package/dist/projector/index.js +1328 -0
- package/dist/projector/index.js.map +1 -0
- package/dist/{query.types-DU5v7vM0.d.ts → query.types-CRqAsGTX.d.cts} +4 -66
- package/dist/{query.types-DuYWbFFe.d.cts → query.types-DnOMYXpC.d.ts} +4 -66
- package/dist/sqlite/index.cjs +5 -1
- package/dist/sqlite/index.cjs.map +1 -1
- package/dist/sqlite/index.d.cts +7 -5
- package/dist/sqlite/index.d.ts +7 -5
- package/dist/sqlite/index.js +5 -1
- package/dist/sqlite/index.js.map +1 -1
- package/dist/{storage.types-k7oElEB3.d.ts → storage.types-BKWoIOHp.d.ts} +3 -2
- package/dist/{storage.types-Bji_pWqr.d.cts → storage.types-DHbAm3j_.d.cts} +3 -2
- package/dist/{telemetry_client-BO5Pjp41.d.cts → telemetry_client-Bg5tbj5E.d.cts} +3 -2
- package/dist/{telemetry_client-D8uZ-mTL.d.ts → telemetry_client-DWKgufmc.d.ts} +3 -2
- package/dist/{telemetry_configuration_parser-BZ8Nvnle.d.ts → telemetry_configuration_parser-6BR3_dD_.d.ts} +2 -2
- package/dist/{telemetry_configuration_parser-CgSN7R6A.d.cts → telemetry_configuration_parser-ybeweUPE.d.cts} +2 -2
- package/dist/testing/index.d.cts +7 -5
- package/dist/testing/index.d.ts +7 -5
- package/dist/trace-adapter/index.d.cts +4 -3
- package/dist/trace-adapter/index.d.ts +4 -3
- package/dist/{transport.types-BAl_TRtU.d.cts → transport.types-C2dP-eed.d.cts} +1 -1
- package/dist/{transport.types-DDnZoKWi.d.ts → transport.types-SA8KpLiK.d.ts} +1 -1
- package/native/noego_telemetry_native.node +0 -0
- package/package.json +11 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/telemetry_cli.ts","../../src/platform/node/telemetry_configuration_parser.ts","../../src/core/metric_definition_contract.ts","../../src/core/helper/canonical_json.ts","../../src/storage/helper/sqlite_table_names.ts","../../src/storage/telemetry_table_map.ts","../../src/platform/node/helper/telemetry_duration_parser.ts","../../src/platform/node/schema/telemetry_configuration_schema.ts","../../src/cli/metric_graph_renderer.ts","../../src/cli/offline_sqlite_session.ts","../../src/storage/sqlite_ownership_lease.ts","../../src/storage/telemetry_proper_sql_runner.ts","../../src/storage/telemetry_repository.ts","../../src/storage/schema/telemetry_repository_rows.ts","../../src/storage/telemetry_repository_row_parser.ts","../../src/transports/schema/telemetry_schema_manifest.ts","../../src/cli/helper/read_only_sql_guard.ts","../../src/cli/helper/telemetry_cli_arguments.ts","../../src/cli/helper/telemetry_cli_formatter.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs';\nimport type {\n ResolvedTelemetryConfiguration,\n SqliteTargetConfiguration,\n} from '../core/types/configuration.types.js';\nimport type {\n MetricDimensionFilter,\n MetricQuery,\n TimelineQuery,\n} from '../core/types/query.types.js';\nimport {\n NodeTelemetryConfigurationParser,\n TelemetryConfigurationError,\n} from '../platform/node/telemetry_configuration_parser.js';\nimport { TelemetryDurationParser } from '../platform/node/helper/telemetry_duration_parser.js';\nimport {\n MetricGraphRenderer,\n type MetricGraphFormat,\n type MetricGraphType,\n} from './metric_graph_renderer.js';\nimport { OfflineSqliteTelemetrySession } from './offline_sqlite_session.js';\nimport {\n TelemetryCliArguments,\n TelemetryCliUsageError,\n type ParsedTelemetryCliCommand,\n} from './helper/telemetry_cli_arguments.js';\nimport { TelemetryCliFormatter } from './helper/telemetry_cli_formatter.js';\nimport type {\n TelemetryCliOptions,\n TelemetryCliSession,\n TelemetryCliSessionFactory,\n TelemetryCliSessionMode,\n TelemetryCliStructuredFormat,\n} from './types/telemetry_cli.types.js';\n\nconst MAX_DIAGNOSTIC_DURATION_MS = 30_000;\n\nexport class TelemetryCli {\n private readonly configurationParser: NodeTelemetryConfigurationParser;\n private readonly argumentsParser = new TelemetryCliArguments();\n private readonly formatter = new TelemetryCliFormatter();\n private readonly graphRenderer = new MetricGraphRenderer();\n private readonly durations = new TelemetryDurationParser();\n private readonly createSession: TelemetryCliSessionFactory;\n private readonly stdout: (text: string) => void;\n private readonly stderr: (text: string) => void;\n private readonly writeOutputFile: (path: string, content: string) => void;\n private readonly now: () => number;\n private activeSession: TelemetryCliSession | null = null;\n\n constructor(options: TelemetryCliOptions = {}) {\n this.configurationParser =\n options.configurationParser ?? new NodeTelemetryConfigurationParser();\n this.stdout = options.stdout ?? ((text) => process.stdout.write(text));\n this.stderr = options.stderr ?? ((text) => process.stderr.write(text));\n this.writeOutputFile =\n options.writeOutputFile ?? ((path, content) => writeFileSync(path, content, 'utf8'));\n this.now = options.now ?? (() => Date.now());\n this.createSession =\n options.createSession ??\n ((configuration, target, mode) =>\n OfflineSqliteTelemetrySession.create(target, mode, configuration.metrics, this.now));\n }\n\n async run(argv: readonly string[]): Promise<number> {\n try {\n return await this.execute(argv);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n this.stderr(`telemetry: ${message}\\n`);\n return cause instanceof TelemetryCliUsageError || cause instanceof TelemetryConfigurationError\n ? 2\n : 1;\n }\n }\n\n async shutdown(): Promise<void> {\n await this.activeSession?.close();\n this.activeSession = null;\n }\n\n private async execute(argv: readonly string[]): Promise<number> {\n const command = this.argumentsParser.parse(argv);\n if (command.kind === 'help') {\n this.stdout(this.help());\n return 0;\n }\n const configurationPath = this.requiredOption(command, 'config');\n const storageBaseDirectory = this.optionalOption(command, 'storage-base');\n const configuration = this.configurationParser.parseFile(\n configurationPath,\n storageBaseDirectory === null ? {} : { storageBaseDirectory },\n );\n const target = this.resolveTarget(configuration, this.optionalOption(command, 'target'));\n const mode = this.sessionMode(command);\n const session = await this.createSession(configuration, target, mode);\n this.activeSession = session;\n try {\n await this.executeCommand(command, target, session);\n return 0;\n } finally {\n await session.close();\n if (this.activeSession === session) {\n this.activeSession = null;\n }\n }\n }\n\n private async executeCommand(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n if (command.kind === 'timeline-query') {\n await this.timelineQuery(command, target, session);\n return;\n }\n if (command.kind === 'metrics-query') {\n await this.metricQuery(command, target, session);\n return;\n }\n if (command.kind === 'metrics-graph') {\n await this.metricGraph(command, target, session);\n return;\n }\n if (command.kind === 'sqlite-query') {\n await this.sqliteQuery(command, target, session);\n return;\n }\n if (command.kind === 'sqlite-migration-status' || command.kind === 'sqlite-migration-up') {\n await this.sqliteMigration(command, target, session);\n return;\n }\n throw new TelemetryCliUsageError(`Unsupported telemetry command ${command.kind}`);\n }\n\n private async timelineQuery(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const query: TimelineQuery = Object.freeze({\n targetId: target.targetId,\n fromMs: this.timestampOption(command, 'from'),\n toMs: this.timestampOption(command, 'to'),\n conversationId: this.optionalOption(command, 'conversation-id'),\n source: this.optionalOption(command, 'source'),\n label: this.optionalOption(command, 'label'),\n level: this.optionalOption(command, 'level'),\n producerId: this.optionalOption(command, 'producer-id'),\n correlationId: this.optionalOption(command, 'correlation-id'),\n order: this.orderOption(command),\n limit: this.rowLimitOption(command, target),\n cursor: this.optionalOption(command, 'cursor'),\n });\n const result = await session.timeline(query);\n if (!result.ok) {\n throw new Error(`${result.error.kind}: ${result.error.message}`);\n }\n const format = this.structuredFormat(command);\n const output = this.formatter.timeline(result.value, format, this.timezoneOption(command));\n this.writeBounded(output, target.query.maxResponseBytes);\n }\n\n private async metricQuery(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const result = await session.metrics(this.metricQueryInput(command, target));\n if (!result.ok) {\n throw new Error(`${result.error.kind}: ${result.error.message}`);\n }\n const output = this.formatter.metrics(\n result.value,\n this.structuredFormat(command),\n this.timezoneOption(command),\n );\n this.writeBounded(output, target.query.maxResponseBytes);\n }\n\n private async metricGraph(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const measurements = this.options(command, 'measurement');\n if (measurements.length !== 1) {\n throw new TelemetryCliUsageError('metrics graph requires exactly one --measurement');\n }\n const result = await session.metrics(this.metricQueryInput(command, target));\n if (!result.ok) {\n throw new Error(`${result.error.kind}: ${result.error.message}`);\n }\n const output = this.graphRenderer.render(result.value, {\n type: this.graphType(command),\n format: this.graphFormat(command),\n measurement: measurements[0] ?? '',\n timezone: this.timezoneOption(command),\n width: this.positiveIntegerOption(command, 'width', 960),\n height: this.positiveIntegerOption(command, 'height', 560),\n maxSeries: this.positiveIntegerOption(command, 'max-series', 32),\n maxPoints: this.positiveIntegerOption(command, 'max-points', target.query.maxBuckets),\n maxOutputBytes: target.query.maxResponseBytes,\n });\n const outputPath = this.optionalOption(command, 'output');\n if (outputPath === null) {\n this.writeBounded(output, target.query.maxResponseBytes);\n } else {\n this.assertBytes(output, target.query.maxResponseBytes);\n this.writeOutputFile(outputPath, output);\n }\n }\n\n private async sqliteQuery(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const maxDurationMs = this.durations.parse(\n this.optionalOption(command, 'max-duration') ?? '2s',\n '--max-duration',\n );\n if (maxDurationMs > MAX_DIAGNOSTIC_DURATION_MS) {\n throw new TelemetryCliUsageError('--max-duration cannot exceed 30s');\n }\n const result = await session.diagnosticQuery(\n this.requiredOption(command, 'sql'),\n this.bindings(command),\n {\n maxRows: this.rowLimitOption(command, target),\n maxBytes: target.query.maxResponseBytes,\n maxDurationMs,\n },\n );\n const output = this.formatter.diagnostic(result, this.structuredFormat(command));\n this.writeBounded(output, target.query.maxResponseBytes);\n }\n\n private async sqliteMigration(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const result =\n command.kind === 'sqlite-migration-up'\n ? await session.migrateUp()\n : await session.migrationStatus();\n const format = this.optionalOption(command, 'format') ?? 'table';\n if (format !== 'table' && format !== 'json') {\n throw new TelemetryCliUsageError('Migration format must be table or json');\n }\n this.writeBounded(this.formatter.migrations(result, format), target.query.maxResponseBytes);\n }\n\n private metricQueryInput(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): MetricQuery {\n const measurements = this.options(command, 'measurement');\n if (measurements.length === 0) {\n throw new TelemetryCliUsageError('Metric commands require --measurement');\n }\n return Object.freeze({\n targetId: target.targetId,\n metric: this.requiredOption(command, 'metric'),\n fromMs: this.timestampOption(command, 'from'),\n toMs: this.timestampOption(command, 'to'),\n resolution: this.resolutionOption(command),\n where: this.where(command),\n measurements: Object.freeze([...measurements]),\n order: this.orderOption(command),\n limit: this.bucketLimitOption(command, target),\n cursor: this.optionalOption(command, 'cursor'),\n });\n }\n\n private resolveTarget(\n configuration: ResolvedTelemetryConfiguration,\n requestedTargetId: string | null,\n ): SqliteTargetConfiguration {\n const resolvedId =\n requestedTargetId ??\n configuration.defaultTargetId ??\n (configuration.sqliteTargets.length === 1\n ? (configuration.sqliteTargets[0]?.targetId ?? null)\n : null);\n if (resolvedId === null) {\n throw new TelemetryCliUsageError(\n 'Multiple telemetry targets require --target or a configured defaultTarget',\n );\n }\n const target = configuration.sqliteTargets.find(\n (candidate) => candidate.targetId === resolvedId,\n );\n if (!target) {\n throw new TelemetryCliUsageError(`Unknown telemetry target ${resolvedId}`);\n }\n return target;\n }\n\n private sessionMode(command: ParsedTelemetryCliCommand): TelemetryCliSessionMode {\n return command.kind === 'sqlite-migration-status' || command.kind === 'sqlite-migration-up'\n ? 'maintenance'\n : 'query';\n }\n\n private structuredFormat(command: ParsedTelemetryCliCommand): TelemetryCliStructuredFormat {\n const value = this.optionalOption(command, 'format') ?? 'table';\n if (value === 'table' || value === 'json' || value === 'jsonl' || value === 'csv') {\n return value;\n }\n throw new TelemetryCliUsageError('Format must be table, json, jsonl, or csv');\n }\n\n private graphFormat(command: ParsedTelemetryCliCommand): MetricGraphFormat {\n const value = this.optionalOption(command, 'format') ?? 'terminal';\n if (value === 'terminal' || value === 'svg' || value === 'html') {\n return value;\n }\n throw new TelemetryCliUsageError('Graph format must be terminal, svg, or html');\n }\n\n private graphType(command: ParsedTelemetryCliCommand): MetricGraphType {\n const value = this.optionalOption(command, 'type') ?? 'line';\n if (value === 'line' || value === 'bar' || value === 'stacked-bar') {\n return value;\n }\n throw new TelemetryCliUsageError('Graph type must be line, bar, or stacked-bar');\n }\n\n private orderOption(command: ParsedTelemetryCliCommand): 'asc' | 'desc' {\n const value = this.optionalOption(command, 'order') ?? 'asc';\n if (value !== 'asc' && value !== 'desc') {\n throw new TelemetryCliUsageError('--order must be asc or desc');\n }\n return value;\n }\n\n private timezoneOption(command: ParsedTelemetryCliCommand): string {\n const timezone = this.optionalOption(command, 'timezone') ?? 'UTC';\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: timezone }).format(0);\n } catch {\n throw new TelemetryCliUsageError(`Invalid timezone ${timezone}`);\n }\n return timezone;\n }\n\n private resolutionOption(command: ParsedTelemetryCliCommand): number | 'auto' {\n const value = this.requiredOption(command, 'resolution');\n return value === 'auto' ? value : this.durations.parse(value, '--resolution');\n }\n\n private rowLimitOption(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): number {\n return this.limitOption(command, target.query.maxRows, 'maxRows');\n }\n\n private bucketLimitOption(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): number {\n return this.limitOption(command, target.query.maxBuckets, 'maxBuckets');\n }\n\n private limitOption(\n command: ParsedTelemetryCliCommand,\n maximum: number,\n configurationName: 'maxRows' | 'maxBuckets',\n ): number {\n const limit = this.positiveIntegerOption(command, 'limit', Math.min(500, maximum));\n if (limit > maximum) {\n throw new TelemetryCliUsageError(\n `--limit cannot exceed configured ${configurationName} ${maximum}`,\n );\n }\n return limit;\n }\n\n private positiveIntegerOption(\n command: ParsedTelemetryCliCommand,\n name: string,\n fallback: number,\n ): number {\n const raw = this.optionalOption(command, name);\n if (raw === null) {\n return fallback;\n }\n const value = Number(raw);\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TelemetryCliUsageError(`--${name} must be a positive integer`);\n }\n return value;\n }\n\n private timestampOption(command: ParsedTelemetryCliCommand, name: string): number {\n const source = this.requiredOption(command, name);\n const value = /^-?[0-9]+$/.test(source) ? Number(source) : Date.parse(source);\n if (!Number.isSafeInteger(value) || Number.isNaN(new Date(value).getTime())) {\n throw new TelemetryCliUsageError(`--${name} must be an ISO timestamp or epoch milliseconds`);\n }\n return value;\n }\n\n private where(\n command: ParsedTelemetryCliCommand,\n ): Readonly<Record<string, MetricDimensionFilter>> {\n const result: Record<string, MetricDimensionFilter> = {};\n for (const expression of this.options(command, 'where')) {\n const separator = expression.indexOf('=');\n if (separator <= 0) {\n throw new TelemetryCliUsageError('--where must use dimension=value');\n }\n const key = expression.slice(0, separator);\n const value = this.whereValue(expression.slice(separator + 1));\n const existing = result[key];\n result[key] =\n existing === undefined\n ? value\n : Object.freeze([\n ...(Array.isArray(existing) ? existing : [existing]),\n ...(Array.isArray(value) ? value : [value]),\n ]);\n }\n return Object.freeze(result);\n }\n\n private whereValue(source: string): MetricDimensionFilter {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n if (source.startsWith('[')) {\n throw new TelemetryCliUsageError('--where array values must be valid JSON');\n }\n return source;\n }\n if (Array.isArray(parsed)) {\n if (parsed.length === 0 || parsed.some((value) => !this.isJsonPrimitive(value))) {\n throw new TelemetryCliUsageError('--where arrays must contain JSON primitive values');\n }\n return Object.freeze(parsed);\n }\n if (!this.isJsonPrimitive(parsed)) {\n throw new TelemetryCliUsageError('--where values must be JSON primitives or arrays');\n }\n return parsed;\n }\n\n private bindings(command: ParsedTelemetryCliCommand): Readonly<Record<string, unknown>> {\n const bindings: Record<string, unknown> = {};\n for (const expression of this.options(command, 'param')) {\n const separator = expression.indexOf('=');\n const key = expression.slice(0, separator);\n if (separator <= 0 || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new TelemetryCliUsageError('--param must use name=value');\n }\n if (Object.hasOwn(bindings, key)) {\n throw new TelemetryCliUsageError(`Duplicate SQL parameter ${key}`);\n }\n bindings[key] = this.bindingValue(expression.slice(separator + 1));\n }\n return Object.freeze(bindings);\n }\n\n private bindingValue(source: string): string | number | boolean | null {\n try {\n const parsed: unknown = JSON.parse(source);\n return this.isJsonPrimitive(parsed) ? parsed : source;\n } catch {\n return source;\n }\n }\n\n private isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n }\n\n private requiredOption(command: ParsedTelemetryCliCommand, name: string): string {\n const value = this.optionalOption(command, name);\n if (value === null) {\n throw new TelemetryCliUsageError(`Missing required option --${name}`);\n }\n return value;\n }\n\n private optionalOption(command: ParsedTelemetryCliCommand, name: string): string | null {\n return command.options.get(name)?.[0] ?? null;\n }\n\n private options(command: ParsedTelemetryCliCommand, name: string): readonly string[] {\n return command.options.get(name) ?? [];\n }\n\n private writeBounded(output: string, maxBytes: number): void {\n this.assertBytes(output, maxBytes);\n this.stdout(output);\n }\n\n private assertBytes(output: string, maxBytes: number): void {\n const bytes = Buffer.byteLength(output, 'utf8');\n if (bytes > maxBytes) {\n throw new Error(`CLI output exceeds configured maxResponseBytes (${bytes} > ${maxBytes})`);\n }\n }\n\n private help(): string {\n return `Usage:\n telemetry timeline query --config FILE --from TIME --to TIME [filters] [--format table|json|jsonl|csv]\n telemetry metrics query --config FILE --metric NAME --measurement NAME --resolution DURATION|auto --from TIME --to TIME [--where KEY=VALUE]\n telemetry metrics graph --config FILE --metric NAME --measurement NAME --resolution DURATION|auto --from TIME --to TIME [--type line|bar|stacked-bar] [--format terminal|svg|html]\n telemetry sqlite query --config FILE --sql SQL [--param NAME=VALUE] [--format table|json|jsonl|csv]\n telemetry sqlite migration status --config FILE [--format table|json]\n telemetry sqlite migration up --config FILE [--format table|json]\n\nRead-only timeline, metric, graph, and guarded SQL queries support a live WAL target.\nMigration and maintenance commands acquire the exclusive lease and refuse a live target.\nUse --storage-base DIR when relative SQLite paths belong to an application data directory.\nSchema rename is intentionally unavailable until transactional manifest-backed recovery exists.\n`;\n }\n}\n\nexport async function runTelemetryCli(\n argv: readonly string[],\n options: TelemetryCliOptions = {},\n): Promise<number> {\n return new TelemetryCli(options).run(argv);\n}\n\nexport type {\n TelemetryCliDiagnosticResult,\n TelemetryCliMigrationStatus,\n TelemetryCliOptions,\n TelemetryCliSession,\n TelemetryCliSessionFactory,\n TelemetryCliSessionMode,\n TelemetryCliStructuredFormat,\n} from './types/telemetry_cli.types.js';\n","import { dirname, resolve } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { load as loadYaml } from 'js-yaml';\nimport { MetricDefinitionContract } from '../../core/metric_definition_contract.js';\nimport type {\n ResolvedTelemetryConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n} from '../../core/types/configuration.types.js';\nimport type { MetricDefinition, MetricMeasurement } from '../../core/types/metric.types.js';\nimport { TelemetryTableMap } from '../../storage/telemetry_table_map.js';\nimport { TelemetryDurationParser } from './helper/telemetry_duration_parser.js';\nimport {\n TelemetryConfigurationDocumentSchema,\n type SerializedMetricDefinition,\n type SerializedSqliteTarget,\n} from './schema/telemetry_configuration_schema.js';\nimport type { NodeTelemetryConfigurationParseOptions } from './types/telemetry_configuration_parser.types.js';\n\nconst DEFAULT_LEASE_EXPIRY = '30s';\nconst DEFAULT_QUERY_RANGE = '365d';\nconst DEFAULT_QUERY_ROWS = 10_000;\nconst DEFAULT_QUERY_BUCKETS = 10_000;\nconst DEFAULT_QUERY_BYTES = 5_000_000;\nconst DEFAULT_RECLAIM_PAGES = 100;\n\nexport class TelemetryConfigurationError extends Error {\n constructor(\n message: string,\n readonly source: string,\n ) {\n super(`${source}: ${message}`);\n this.name = 'TelemetryConfigurationError';\n }\n}\n\nexport class NodeTelemetryConfigurationParser {\n constructor(\n private readonly durations = new TelemetryDurationParser(),\n private readonly metricContract = new MetricDefinitionContract(),\n ) {}\n\n parseFile(\n configurationPath: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const absolutePath = resolve(configurationPath);\n let source: string;\n try {\n source = readFileSync(absolutePath, 'utf8');\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), absolutePath);\n }\n return this.parseYaml(source, {\n sourceName: options.sourceName ?? absolutePath,\n storageBaseDirectory: options.storageBaseDirectory ?? dirname(absolutePath),\n });\n }\n\n parseYaml(\n source: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const sourceName = options.sourceName ?? '<telemetry-configuration>';\n let document: unknown;\n try {\n document = loadYaml(source);\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n const parsed = TelemetryConfigurationDocumentSchema.safeParse(document);\n if (!parsed.success) {\n throw new TelemetryConfigurationError(parsed.error.message, sourceName);\n }\n try {\n const baseDirectory =\n options.storageBaseDirectory === undefined\n ? dirname(resolve(sourceName))\n : resolve(options.storageBaseDirectory);\n return this.resolveDocument(parsed.data, baseDirectory);\n } catch (cause) {\n if (cause instanceof TelemetryConfigurationError) {\n throw cause;\n }\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n }\n\n private resolveDocument(\n document: ReturnType<typeof TelemetryConfigurationDocumentSchema.parse>,\n baseDirectory: string,\n ): ResolvedTelemetryConfiguration {\n const telemetry = document.telemetry;\n this.validateRole(telemetry.role, telemetry.trace);\n const serializedTargets = telemetry.trace.storage?.targets ?? [];\n const targets = serializedTargets.map((target, index) =>\n this.resolveTarget(target, baseDirectory, index),\n );\n this.validateTargets(telemetry.role, targets, telemetry.trace.storage?.defaultTarget ?? null);\n const metrics = (telemetry.metrics ?? []).map((metric, index) =>\n this.resolveMetric(metric, targets, index),\n );\n this.validateMetricIdentities(metrics);\n return Object.freeze({\n version: telemetry.version ?? 1,\n role: telemetry.role,\n ingestionTransport: telemetry.trace.ingestionTransport ?? null,\n logTransport: telemetry.logs?.transport ?? null,\n defaultTargetId: telemetry.trace.storage?.defaultTarget ?? null,\n sqliteTargets: Object.freeze(targets),\n metrics: Object.freeze(metrics),\n });\n }\n\n private validateRole(\n role: 'producer' | 'collector' | 'combined',\n trace: Readonly<{\n ingestionTransport?: string | undefined;\n storage?: unknown;\n }>,\n ): void {\n const hasIngestion = trace.ingestionTransport !== undefined;\n const hasStorage = trace.storage !== undefined;\n if (role === 'producer' && (!hasIngestion || hasStorage)) {\n throw new Error('Producer telemetry requires ingestionTransport and forbids storage');\n }\n if (role === 'collector' && !hasStorage) {\n throw new Error('Collector telemetry requires storage targets');\n }\n if (role === 'combined' && (!hasIngestion || !hasStorage)) {\n throw new Error('Combined telemetry requires ingestionTransport and storage targets');\n }\n }\n\n private resolveTarget(\n target: SerializedSqliteTarget,\n baseDirectory: string,\n index: number,\n ): SqliteTargetConfiguration {\n const field = `telemetry.trace.storage.targets[${index}]`;\n const rawMs = this.durations.parse(target.retention.raw, `${field}.retention.raw`);\n const lateArrivalMs = this.durations.parse(\n target.retention.lateArrival ?? '0ms',\n `${field}.retention.lateArrival`,\n true,\n );\n const samplesMs =\n target.retention.samples === undefined\n ? rawMs + lateArrivalMs\n : this.durations.parse(target.retention.samples, `${field}.retention.samples`);\n const levelMs = this.resolveLevelRetention(target.retention.levels, field);\n const rollups = target.retention.rollups.map((tier, tierIndex) =>\n Object.freeze({\n resolutionMs: this.durations.parse(\n tier.resolution,\n `${field}.retention.rollups[${tierIndex}].resolution`,\n ),\n retainMs: this.durations.parse(\n tier.retain,\n `${field}.retention.rollups[${tierIndex}].retain`,\n ),\n }),\n );\n const tables = Object.freeze(\n Object.fromEntries(\n Object.entries(target.schema?.tables ?? {}).filter((entry) => entry[1] !== undefined),\n ),\n ) as SqliteTableOverrides;\n const schema = Object.freeze({\n tablePrefix: target.schema?.tablePrefix ?? null,\n tables,\n });\n const tableMap = TelemetryTableMap.create(schema);\n if (!tableMap.ok) {\n throw new Error(`${field}.schema: ${tableMap.error}`);\n }\n const resolved = Object.freeze({\n targetId: target.id,\n path: resolve(baseDirectory, target.path),\n delivery: target.delivery,\n schema,\n retention: Object.freeze({\n rawMs,\n lateArrivalMs,\n samplesMs,\n levelMs,\n rollups: Object.freeze(rollups),\n }),\n maintenance: Object.freeze({\n intervalMs: this.durations.parse(\n target.maintenance.interval,\n `${field}.maintenance.interval`,\n ),\n maxWorkMs: target.maintenance.maxWorkMs,\n maxReclaimPages: target.maintenance.maxReclaimPages ?? DEFAULT_RECLAIM_PAGES,\n }),\n leaseExpiryMs: this.durations.parse(\n target.leaseExpiry ?? DEFAULT_LEASE_EXPIRY,\n `${field}.leaseExpiry`,\n ),\n query: Object.freeze({\n maxRangeMs: this.durations.parse(\n target.query?.maxRange ?? DEFAULT_QUERY_RANGE,\n `${field}.query.maxRange`,\n ),\n maxRows: target.query?.maxRows ?? DEFAULT_QUERY_ROWS,\n maxBuckets: target.query?.maxBuckets ?? DEFAULT_QUERY_BUCKETS,\n maxResponseBytes: target.query?.maxResponseBytes ?? DEFAULT_QUERY_BYTES,\n }),\n });\n this.validateRetention(resolved, field);\n if (resolved.leaseExpiryMs < 1_000) {\n throw new Error(`${field}.leaseExpiry must be at least 1s`);\n }\n return resolved;\n }\n\n private resolveLevelRetention(\n levels: Readonly<Record<string, string>> | undefined,\n field: string,\n ): Readonly<Record<string, number>> {\n if (levels === undefined) {\n return Object.freeze({});\n }\n const resolved: Record<string, number> = {};\n for (const [level, duration] of Object.entries(levels)) {\n const normalized = level.trim().toLowerCase();\n if (normalized.length === 0) {\n throw new Error(`${field}.retention.levels contains an empty level name`);\n }\n if (resolved[normalized] !== undefined) {\n throw new Error(`${field}.retention.levels declares \"${normalized}\" more than once`);\n }\n resolved[normalized] = this.durations.parse(\n duration,\n `${field}.retention.levels.${normalized}`,\n );\n }\n return Object.freeze(resolved);\n }\n\n private validateRetention(target: SqliteTargetConfiguration, field: string): void {\n const retention = target.retention;\n const requiredSamplesMs = retention.rawMs + retention.lateArrivalMs;\n if (!Number.isSafeInteger(requiredSamplesMs) || retention.samplesMs < requiredSamplesMs) {\n throw new Error(`${field}.retention.samples must cover raw plus lateArrival`);\n }\n for (let index = 0; index < retention.rollups.length; index += 1) {\n const tier = retention.rollups[index];\n const previous = retention.rollups[index - 1];\n if (!tier || tier.retainMs < retention.rawMs) {\n throw new Error(`${field}.retention rollup retention cannot be shorter than raw retention`);\n }\n if (\n previous &&\n (tier.resolutionMs <= previous.resolutionMs || tier.retainMs <= previous.retainMs)\n ) {\n throw new Error(\n `${field}.retention rollup tiers must increase by resolution and retention`,\n );\n }\n }\n }\n\n private validateTargets(\n role: 'producer' | 'collector' | 'combined',\n targets: readonly SqliteTargetConfiguration[],\n defaultTargetId: string | null,\n ): void {\n if (role === 'producer') {\n return;\n }\n const targetIds = targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n if (!targets.some((target) => target.delivery === 'required')) {\n throw new Error('Telemetry storage requires at least one required durable target');\n }\n if (defaultTargetId !== null && !targetIds.includes(defaultTargetId)) {\n throw new Error(`Unknown default telemetry target ${defaultTargetId}`);\n }\n }\n\n private resolveMetric(\n metric: SerializedMetricDefinition,\n targets: readonly SqliteTargetConfiguration[],\n index: number,\n ): MetricDefinition {\n if (metric.selector.endsWith('[*]') && (metric.groupBy?.length ?? 0) > 0) {\n throw new Error(`telemetry.metrics[${index}] selector [*] cannot declare groupBy`);\n }\n const targetIds = metric.targets ?? targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error(`telemetry.metrics[${index}] has duplicate target ids`);\n }\n const unknownTarget = targetIds.find(\n (targetId) => !targets.some((target) => target.targetId === targetId),\n );\n if (unknownTarget !== undefined) {\n throw new Error(`telemetry.metrics[${index}] references unknown target ${unknownTarget}`);\n }\n const resolutionsMs =\n metric.resolutions?.map((resolution, resolutionIndex) =>\n this.durations.parse(\n resolution,\n `telemetry.metrics[${index}].resolutions[${resolutionIndex}]`,\n ),\n ) ?? this.metricResolutions(targets, targetIds);\n this.validateMetricResolutions(resolutionsMs, targets, targetIds, index);\n const cardinality = Object.freeze(\n Object.fromEntries(\n Object.entries(metric.cardinality ?? {}).map(([field, rule]) => [\n field,\n Object.freeze({ ...rule }),\n ]),\n ),\n );\n const definition: MetricDefinition = {\n name: metric.name,\n version: metric.version ?? 1,\n selector: metric.selector,\n groupBy: Object.freeze([...(metric.groupBy ?? [])]),\n measurements: Object.freeze(\n metric.measurements.map((measurement) => this.resolveMeasurement(measurement)),\n ),\n cardinality,\n targetIds: Object.freeze([...targetIds]),\n resolutionsMs: Object.freeze(resolutionsMs),\n missingField: metric.missingField ?? 'record-failure',\n };\n const normalized = this.metricContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(`telemetry.metrics[${index}]: ${normalized.error}`);\n }\n this.validateNormalizedMetric(normalized.value, index);\n return normalized.value;\n }\n\n private validateNormalizedMetric(definition: MetricDefinition, index: number): void {\n const segments = definition.selector.split('.');\n const invalidSelector = segments.some(\n (segment) =>\n segment !== '*' && segment !== '**' && !/^[A-Za-z0-9_:-][A-Za-z0-9_:\\-]*$/.test(segment),\n );\n if (invalidSelector) {\n throw new Error(`telemetry.metrics[${index}] has an invalid dotted selector`);\n }\n const invalidGroupBy = definition.groupBy.find((field) => !this.isFieldPath(field));\n if (\n invalidGroupBy !== undefined ||\n new Set(definition.groupBy).size !== definition.groupBy.length\n ) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate groupBy fields`);\n }\n const extraCardinality = Object.keys(definition.cardinality).find(\n (field) => !definition.groupBy.includes(field),\n );\n if (extraCardinality !== undefined) {\n throw new Error(\n `telemetry.metrics[${index}] cardinality policy ${extraCardinality} is not a declared dimension`,\n );\n }\n const measurementKeys = definition.measurements.map((measurement) =>\n measurement.kind === 'count' ? 'count' : `field:${measurement.field}`,\n );\n const invalidField = definition.measurements.find(\n (measurement) => measurement.kind === 'field' && !this.isFieldPath(measurement.field),\n );\n if (invalidField !== undefined || new Set(measurementKeys).size !== measurementKeys.length) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate measurements`);\n }\n }\n\n private isFieldPath(value: string): boolean {\n return value.split('.').every((segment) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(segment));\n }\n\n private resolveMeasurement(\n measurement: SerializedMetricDefinition['measurements'][number],\n ): MetricMeasurement {\n if (measurement === 'count') {\n return Object.freeze({ kind: 'count' });\n }\n if (new Set(measurement.aggregate).size !== measurement.aggregate.length) {\n throw new Error(`Metric field ${measurement.field} has duplicate aggregates`);\n }\n return Object.freeze({\n kind: 'field',\n field: measurement.field,\n aggregates: Object.freeze([...measurement.aggregate]),\n });\n }\n\n private metricResolutions(\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n ): number[] {\n const selected = targets.filter((target) => targetIds.includes(target.targetId));\n const first = selected[0]?.retention.rollups.map((tier) => tier.resolutionMs) ?? [];\n return first\n .filter((resolution) =>\n selected.every((target) =>\n target.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n ),\n )\n .sort((left, right) => left - right);\n }\n\n private validateMetricResolutions(\n resolutions: readonly number[],\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n metricIndex: number,\n ): void {\n for (const targetId of targetIds) {\n const target = targets.find((candidate) => candidate.targetId === targetId);\n const unavailable = resolutions.find(\n (resolution) => !target?.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n );\n if (unavailable !== undefined) {\n throw new Error(\n `telemetry.metrics[${metricIndex}] resolution ${unavailable} is not configured for target ${targetId}`,\n );\n }\n }\n }\n\n private validateMetricIdentities(metrics: readonly MetricDefinition[]): void {\n const identities = metrics.map((metric) => `${metric.name}:${metric.version}`);\n if (new Set(identities).size !== identities.length) {\n throw new Error('Metric name/version identities must be unique');\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type { MetricDefinition } from './types/metric.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\n\nexport class MetricDefinitionContract {\n normalize(definition: MetricDefinition): TelemetryResult<MetricDefinition, string> {\n const parsedSelector = this.parseSelector(definition.selector);\n if (!parsedSelector.ok) {\n return parsedSelector;\n }\n\n const bracketGroupBy = parsedSelector.value.groupBy;\n const configuredGroupBy = definition.groupBy;\n const bothSpecifyDifferentGrouping = bracketGroupBy.length > 0\n && configuredGroupBy.length > 0\n && bracketGroupBy.join('.') !== configuredGroupBy.join('.');\n if (bothSpecifyDifferentGrouping) {\n return { ok: false, error: `Metric ${definition.name} has conflicting selector and groupBy declarations` };\n }\n const groupBy = configuredGroupBy.length > 0 ? configuredGroupBy : bracketGroupBy;\n\n const basicError = this.validateBasic(definition, parsedSelector.value.selector, groupBy);\n if (basicError !== null) {\n return { ok: false, error: basicError };\n }\n if (parsedSelector.value.wildcardUngrouped\n && definition.measurements.some((measurement) => measurement.kind !== 'count')) {\n return {\n ok: false,\n error: `Metric ${definition.name} uses [*] and may only declare count`,\n };\n }\n\n return {\n ok: true,\n value: Object.freeze({\n ...definition,\n selector: parsedSelector.value.selector,\n groupBy: Object.freeze([...groupBy]),\n resolutionsMs: Object.freeze([...definition.resolutionsMs].sort((left, right) => left - right)),\n measurements: Object.freeze([...definition.measurements]),\n targetIds: Object.freeze([...definition.targetIds]),\n cardinality: Object.freeze({ ...definition.cardinality }),\n }),\n };\n }\n\n matches(selector: string, label: string): boolean {\n const selectorSegments = selector.split('.');\n const labelSegments = label.split('.');\n return this.matchSegments(selectorSegments, labelSegments, 0, 0);\n }\n\n private parseSelector(selector: string): TelemetryResult<Readonly<{\n selector: string;\n groupBy: readonly string[];\n wildcardUngrouped: boolean;\n }>, string> {\n if (selector.startsWith('[')) {\n return { ok: false, error: 'A metric selector cannot omit its event label or glob' };\n }\n\n const bracketStart = selector.lastIndexOf('[');\n if (bracketStart < 0) {\n return { ok: true, value: { selector, groupBy: [], wildcardUngrouped: false } };\n }\n if (!selector.endsWith(']')) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n\n const eventSelector = selector.slice(0, bracketStart);\n const bracket = selector.slice(bracketStart + 1, -1).trim();\n if (!eventSelector || !bracket) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n return {\n ok: true,\n value: {\n selector: eventSelector,\n groupBy: bracket === '*' ? [] : [bracket],\n wildcardUngrouped: bracket === '*',\n },\n };\n }\n\n private validateBasic(\n definition: MetricDefinition,\n selector: string,\n groupBy: readonly string[],\n ): string | null {\n if (!/^[A-Za-z0-9_*][A-Za-z0-9_.:*\\-]*$/.test(selector)) {\n return `Metric ${definition.name} has an invalid selector`;\n }\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(definition.name)) {\n return `Metric name ${definition.name} is invalid`;\n }\n if (!Number.isInteger(definition.version) || definition.version <= 0) {\n return `Metric ${definition.name} must have a positive integer version`;\n }\n if (definition.measurements.length === 0) {\n return `Metric ${definition.name} must declare at least one measurement`;\n }\n const invalidResolution = definition.resolutionsMs.some(\n (resolution) => !Number.isInteger(resolution) || resolution <= 0,\n );\n const duplicateResolution = new Set(definition.resolutionsMs).size !== definition.resolutionsMs.length;\n if (invalidResolution || duplicateResolution || definition.resolutionsMs.length === 0) {\n return `Metric ${definition.name} has invalid or duplicate resolutions`;\n }\n const missingCardinality = groupBy.find((field) => definition.cardinality[field] === undefined);\n if (missingCardinality) {\n return `Metric ${definition.name} is missing cardinality policy for ${missingCardinality}`;\n }\n const invalidCardinality = Object.values(definition.cardinality).some(\n (rule) => !Number.isInteger(rule.maxValuesPerBucket) || rule.maxValuesPerBucket <= 0,\n );\n if (invalidCardinality) {\n return `Metric ${definition.name} has an invalid cardinality limit`;\n }\n return null;\n }\n\n private matchSegments(\n selector: readonly string[],\n label: readonly string[],\n selectorIndex: number,\n labelIndex: number,\n ): boolean {\n if (selectorIndex === selector.length) {\n return labelIndex === label.length;\n }\n const segment = selector[selectorIndex];\n if (segment === '**') {\n if (selectorIndex === selector.length - 1) {\n return true;\n }\n for (let next = labelIndex; next <= label.length; next += 1) {\n if (this.matchSegments(selector, label, selectorIndex + 1, next)) {\n return true;\n }\n }\n return false;\n }\n if (labelIndex >= label.length) {\n return false;\n }\n const segmentMatches = segment === '*' || segment === label[labelIndex];\n return segmentMatches\n && this.matchSegments(selector, label, selectorIndex + 1, labelIndex + 1);\n }\n}\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import type { SqliteTableOverrides } from '../../core/types/configuration.types.js';\n\nexport const SQLITE_LOGICAL_TABLE_NAMES = [\n 'rawEvents',\n 'batchAcknowledgements',\n 'ingestWatermarks',\n 'metricDefinitions',\n 'metricSamples',\n 'metricRollups',\n 'rollupCompletions',\n 'extractionFailures',\n 'maintenanceRuns',\n 'readerLeases',\n 'committedDropCounters',\n 'migrationHistory',\n] as const satisfies readonly (keyof SqliteTableOverrides)[];\n\nexport const SQLITE_DEFAULT_TABLE_NAMES: Readonly<Record<(typeof SQLITE_LOGICAL_TABLE_NAMES)[number], string>> =\n Object.freeze({\n rawEvents: 'raw_events',\n batchAcknowledgements: 'batch_acknowledgements',\n ingestWatermarks: 'ingest_watermarks',\n metricDefinitions: 'metric_definitions',\n metricSamples: 'metric_samples',\n metricRollups: 'metric_rollups',\n rollupCompletions: 'rollup_completions',\n extractionFailures: 'extraction_failures',\n maintenanceRuns: 'maintenance_runs',\n readerLeases: 'reader_leases',\n committedDropCounters: 'committed_drop_counters',\n migrationHistory: 'migration_history',\n });\n\nexport const SQLITE_SCHEMA_MANIFEST_TABLE = 'telemetry_schema_manifest';\n","import type { SqliteSchemaConfiguration } from '../core/types/configuration.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport { telemetryChecksum } from '../core/helper/canonical_json.js';\nimport {\n SQLITE_DEFAULT_TABLE_NAMES,\n SQLITE_LOGICAL_TABLE_NAMES,\n SQLITE_SCHEMA_MANIFEST_TABLE,\n} from './helper/sqlite_table_names.js';\nimport type {\n TelemetryLogicalTableName,\n TelemetryPhysicalTableMapping,\n} from './types/telemetry_table_map.types.js';\n\nexport class TelemetryTableMap {\n private readonly tokenMap: Readonly<Record<string, string>>;\n\n private constructor(\n private readonly mapping: TelemetryPhysicalTableMapping,\n readonly checksum: string,\n ) {\n this.tokenMap = Object.freeze({\n ...mapping,\n rawEventsOccurredIndex: this.indexName(mapping.rawEvents, 'occurred'),\n rawEventsConversationIndex: this.indexName(mapping.rawEvents, 'conversation'),\n rawEventsLabelIndex: this.indexName(mapping.rawEvents, 'label'),\n rawEventsLevelIndex: this.indexName(mapping.rawEvents, 'level'),\n metricSamplesTimeIndex: this.indexName(mapping.metricSamples, 'time'),\n metricSamplesEventIndex: this.indexName(mapping.metricSamples, 'event'),\n metricRollupsTimeIndex: this.indexName(mapping.metricRollups, 'time'),\n });\n }\n\n static create(configuration: SqliteSchemaConfiguration): TelemetryResult<TelemetryTableMap, string> {\n const prefixError = TelemetryTableMap.validateOptionalPrefix(configuration.tablePrefix);\n if (prefixError !== null) {\n return { ok: false, error: prefixError };\n }\n\n const entries = SQLITE_LOGICAL_TABLE_NAMES.map((logicalName) => {\n const override = configuration.tables[logicalName];\n const defaultName = SQLITE_DEFAULT_TABLE_NAMES[logicalName];\n const physicalName = override ?? (configuration.tablePrefix === null\n ? defaultName\n : `${configuration.tablePrefix}${defaultName}`);\n return [logicalName, physicalName] as const;\n });\n\n for (const [logicalName, physicalName] of entries) {\n const identifierError = TelemetryTableMap.validateIdentifier(physicalName);\n if (identifierError !== null) {\n return { ok: false, error: `${logicalName}: ${identifierError}` };\n }\n if (physicalName.toLowerCase() === SQLITE_SCHEMA_MANIFEST_TABLE) {\n return { ok: false, error: `${logicalName} cannot use the fixed schema manifest name` };\n }\n }\n\n const foldedNames = entries.map(([, physicalName]) => physicalName.toLowerCase());\n if (new Set(foldedNames).size !== foldedNames.length) {\n return { ok: false, error: 'Resolved telemetry table names must be unique after case folding' };\n }\n\n const mapping = Object.freeze(Object.fromEntries(entries)) as TelemetryPhysicalTableMapping;\n const checksum = telemetryChecksum(mapping);\n return { ok: true, value: new TelemetryTableMap(mapping, checksum) };\n }\n\n physical(logicalName: TelemetryLogicalTableName): string {\n return this.mapping[logicalName];\n }\n\n quoted(logicalName: TelemetryLogicalTableName): string {\n return this.quote(this.mapping[logicalName]);\n }\n\n manifestMapping(): TelemetryPhysicalTableMapping {\n return this.mapping;\n }\n\n substitute(sql: string): TelemetryResult<string, string> {\n const unknownTokens: string[] = [];\n const substituted = sql.replace(/\\{\\{([A-Za-z][A-Za-z0-9]*)\\}\\}/g, (_match, token: string) => {\n const identifier = this.tokenMap[token];\n if (identifier === undefined) {\n unknownTokens.push(token);\n return `{{${token}}}`;\n }\n return this.quote(identifier);\n });\n if (unknownTokens.length > 0 || substituted.includes('{{')) {\n return {\n ok: false,\n error: `Unknown telemetry migration identifier token(s): ${unknownTokens.join(', ') || 'malformed token'}`,\n };\n }\n return { ok: true, value: substituted };\n }\n\n private quote(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n }\n\n private indexName(tableName: string, purpose: string): string {\n const raw = `${tableName}_${purpose}_idx`;\n if (raw.length <= 63) {\n return raw;\n }\n const suffix = telemetryChecksum(raw).slice(0, 8);\n return `${raw.slice(0, 54)}_${suffix}`;\n }\n\n private static validateOptionalPrefix(prefix: string | null): string | null {\n if (prefix === null) {\n return null;\n }\n return this.validateIdentifier(prefix);\n }\n\n private static validateIdentifier(identifier: string): string | null {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n return `Invalid SQLite identifier ${identifier}`;\n }\n if (identifier.length > 63) {\n return `SQLite identifier ${identifier} exceeds 63 characters`;\n }\n if (identifier.toLowerCase().startsWith('sqlite_')) {\n return `SQLite identifier ${identifier} uses the reserved sqlite_ prefix`;\n }\n return null;\n }\n}\n","export class TelemetryDurationParser {\n private static readonly MULTIPLIERS = Object.freeze({\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 60 * 60_000,\n d: 24 * 60 * 60_000,\n w: 7 * 24 * 60 * 60_000,\n y: 365 * 24 * 60 * 60_000,\n });\n\n parse(value: string, field: string, allowZero = false): number {\n const match = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|y)$/.exec(value);\n if (!match) {\n throw new Error(`${field} must be an integer duration using ms, s, m, h, d, w, or y`);\n }\n const amount = Number(match[1]);\n const unit = match[2] as keyof typeof TelemetryDurationParser.MULTIPLIERS;\n const milliseconds = amount * TelemetryDurationParser.MULTIPLIERS[unit];\n if (!Number.isSafeInteger(milliseconds) || (!allowZero && milliseconds <= 0)) {\n throw new Error(`${field} is outside the supported duration range`);\n }\n return milliseconds;\n }\n}\n","import { z } from 'zod';\n\nconst DurationSchema = z.string().min(1);\nconst NonEmptyStringSchema = z.string().trim().min(1);\nconst StableIdSchema = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/);\n\nconst CardinalityRuleSchema = z\n .object({\n maxValuesPerBucket: z.number().int().positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict();\n\nconst MetricMeasurementSchema = z.union([\n z.literal('count'),\n z\n .object({\n field: z.string().min(1),\n aggregate: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nconst MetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: z.number().int().positive().optional(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)).optional(),\n measurements: z.array(MetricMeasurementSchema).min(1),\n cardinality: z.record(z.string(), CardinalityRuleSchema).optional(),\n targets: z.array(StableIdSchema).min(1).optional(),\n resolutions: z.array(DurationSchema).min(1).optional(),\n missingField: z.enum(['skip', 'record-failure']).optional(),\n })\n .strict();\n\nconst SqliteTablesSchema = z\n .object({\n rawEvents: NonEmptyStringSchema.optional(),\n batchAcknowledgements: NonEmptyStringSchema.optional(),\n ingestWatermarks: NonEmptyStringSchema.optional(),\n metricDefinitions: NonEmptyStringSchema.optional(),\n metricSamples: NonEmptyStringSchema.optional(),\n metricRollups: NonEmptyStringSchema.optional(),\n rollupCompletions: NonEmptyStringSchema.optional(),\n extractionFailures: NonEmptyStringSchema.optional(),\n maintenanceRuns: NonEmptyStringSchema.optional(),\n readerLeases: NonEmptyStringSchema.optional(),\n committedDropCounters: NonEmptyStringSchema.optional(),\n migrationHistory: NonEmptyStringSchema.optional(),\n })\n .strict();\n\nconst SqliteTargetSchema = z\n .object({\n id: StableIdSchema,\n transport: z.literal('sqlite'),\n delivery: z.enum(['required', 'best-effort']),\n path: z.string().min(1),\n schema: z\n .object({\n tablePrefix: NonEmptyStringSchema.nullable().optional(),\n tables: SqliteTablesSchema.optional(),\n })\n .strict()\n .optional(),\n retention: z\n .object({\n raw: DurationSchema,\n lateArrival: DurationSchema.optional(),\n samples: DurationSchema.optional(),\n levels: z.record(z.string().min(1), DurationSchema).optional(),\n rollups: z\n .array(\n z\n .object({\n resolution: DurationSchema,\n retain: DurationSchema,\n })\n .strict(),\n )\n .min(1),\n })\n .strict(),\n maintenance: z\n .object({\n interval: DurationSchema,\n maxWorkMs: z.number().int().positive(),\n reclaim: z.literal('incremental'),\n maxReclaimPages: z.number().int().positive().optional(),\n })\n .strict(),\n leaseExpiry: DurationSchema.optional(),\n query: z\n .object({\n maxRange: DurationSchema.optional(),\n maxRows: z.number().int().positive().optional(),\n maxBuckets: z.number().int().positive().optional(),\n maxResponseBytes: z.number().int().positive().optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst StorageSchema = z\n .object({\n defaultTarget: StableIdSchema.nullable().optional(),\n targets: z.array(SqliteTargetSchema).min(1),\n })\n .strict();\n\nconst TraceSchema = z\n .object({\n ingestionTransport: z.string().min(1).optional(),\n storage: StorageSchema.optional(),\n })\n .strict();\n\nexport const TelemetryConfigurationDocumentSchema = z\n .object({\n telemetry: z\n .object({\n version: z.literal(1).optional(),\n role: z.enum(['producer', 'collector', 'combined']),\n trace: TraceSchema,\n metrics: z.array(MetricDefinitionSchema).optional(),\n logs: z\n .object({\n transport: z.literal('console'),\n })\n .strict()\n .optional(),\n })\n .strict(),\n })\n .strict();\n\nexport type TelemetryConfigurationDocument = z.infer<typeof TelemetryConfigurationDocumentSchema>;\n\nexport type SerializedMetricDefinition = z.infer<typeof MetricDefinitionSchema>;\nexport type SerializedSqliteTarget = z.infer<typeof SqliteTargetSchema>;\n","import type { MetricQueryResponse } from '../core/types/query.types.js';\n\nexport type MetricGraphType = 'line' | 'bar' | 'stacked-bar';\n\nexport type MetricGraphFormat = 'terminal' | 'svg' | 'html';\n\nexport interface MetricGraphRenderOptions {\n type: MetricGraphType;\n format: MetricGraphFormat;\n measurement: string;\n timezone?: string;\n width?: number;\n height?: number;\n maxSeries?: number;\n maxPoints?: number;\n maxOutputBytes?: number;\n}\n\nexport type MetricGraphLimitCode = 'MAX_SERIES' | 'MAX_POINTS' | 'MAX_OUTPUT_BYTES';\n\nexport class MetricGraphRenderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MetricGraphRenderError';\n }\n}\n\nexport class MetricGraphLimitError extends MetricGraphRenderError {\n constructor(\n public readonly code: MetricGraphLimitCode,\n public readonly limit: number,\n public readonly actual: number,\n ) {\n super(`Metric graph ${code} limit exceeded: ${actual} > ${limit}`);\n this.name = 'MetricGraphLimitError';\n }\n}\n\ninterface ResolvedGraphOptions {\n type: MetricGraphType;\n format: MetricGraphFormat;\n measurement: string;\n timezone: string;\n width: number;\n height: number;\n maxSeries: number;\n maxPoints: number;\n maxOutputBytes: number;\n}\n\ninterface GraphGap {\n fromMs: number;\n toMs: number;\n reason: string;\n}\n\ninterface GraphPartialFailure {\n targetId: string;\n reason: string;\n}\n\ninterface GraphDimensions {\n key: string;\n label: string;\n json: string;\n}\n\ninterface GraphPoint {\n startMs: number;\n endMs: number;\n value: number;\n seriesKey: string;\n seriesLabel: string;\n dimensionsJson: string;\n definitionVersion: number;\n resolutionMs: number;\n}\n\ninterface GraphSeries {\n key: string;\n label: string;\n dimensionsJson: string;\n points: GraphPoint[];\n}\n\ninterface GraphTimeline {\n fromMs: number;\n toMs: number;\n hasCoverage: boolean;\n}\n\ninterface GraphModel {\n targetId: string;\n metric: string;\n options: ResolvedGraphOptions;\n definitions: number[];\n resolutions: number[];\n series: GraphSeries[];\n points: GraphPoint[];\n gaps: GraphGap[];\n partialFailures: GraphPartialFailure[];\n hasNextPage: boolean;\n timeline: GraphTimeline;\n}\n\ninterface GraphScale {\n left: number;\n right: number;\n top: number;\n bottom: number;\n x: (value: number) => number;\n y: (value: number) => number;\n yMin: number;\n yMax: number;\n}\n\ninterface BucketGroup {\n startMs: number;\n endMs: number;\n points: GraphPoint[];\n}\n\nconst DEFAULT_WIDTH = 960;\nconst DEFAULT_HEIGHT = 560;\nconst DEFAULT_MAX_SERIES = 32;\nconst DEFAULT_MAX_POINTS = 10_000;\nconst DEFAULT_MAX_OUTPUT_BYTES = 8 * 1024 * 1024;\nconst MIN_WIDTH = 320;\nconst MAX_WIDTH = 4_096;\nconst MIN_HEIGHT = 280;\nconst MAX_HEIGHT = 4_096;\nconst TERMINAL_BAR_WIDTH = 24;\nconst SVG_COLORS = [\n '#2563eb',\n '#dc2626',\n '#16a34a',\n '#9333ea',\n '#ea580c',\n '#0891b2',\n '#4f46e5',\n '#be123c',\n '#65a30d',\n '#7c3aed',\n '#c2410c',\n '#0f766e',\n '#1d4ed8',\n '#b91c1c',\n '#15803d',\n '#7e22ce',\n '#d97706',\n '#0e7490',\n '#4338ca',\n '#a21caf',\n] as const;\n\n/**\n * Pure renderer for already queried metric buckets.\n *\n * It deliberately has no query or storage dependency: every input bucket is\n * represented in the output or the render fails a configured hard limit.\n */\nexport class MetricGraphRenderer {\n render(response: MetricQueryResponse, options: MetricGraphRenderOptions): string {\n const model = this.buildModel(response, options);\n const output = this.renderFormat(model);\n const outputBytes = this.utf8ByteLength(output);\n\n if (outputBytes > model.options.maxOutputBytes) {\n throw new MetricGraphLimitError(\n 'MAX_OUTPUT_BYTES',\n model.options.maxOutputBytes,\n outputBytes,\n );\n }\n\n return output;\n }\n\n private buildModel(response: MetricQueryResponse, options: MetricGraphRenderOptions): GraphModel {\n const resolvedOptions = this.resolveOptions(options);\n const gaps = this.normalizeGaps(response.gaps ?? []);\n const partialFailures = this.normalizePartialFailures(response.partialFailures ?? []);\n const points = this.normalizePoints(response, resolvedOptions.measurement);\n const series = this.groupSeries(points);\n\n this.enforceCollectionLimits(series.length, points.length, resolvedOptions);\n\n return {\n targetId: this.requireText(response.targetId, 'response.targetId'),\n metric: this.requireText(response.metric, 'response.metric'),\n options: resolvedOptions,\n definitions: this.sortedUniqueNumbers(\n response.segments.map((segment) => segment.definitionVersion),\n ),\n resolutions: this.sortedUniqueNumbers(\n response.segments.map((segment) => segment.resolutionMs),\n ),\n series,\n points,\n gaps,\n partialFailures,\n hasNextPage: response.nextCursor !== null,\n timeline: this.resolveTimeline(response, gaps, points),\n };\n }\n\n private resolveOptions(options: MetricGraphRenderOptions): ResolvedGraphOptions {\n const measurement = this.requireText(options.measurement, 'measurement');\n const timezone = options.timezone ?? 'UTC';\n this.validateTimezone(timezone);\n\n return {\n type: this.requireGraphType(options.type),\n format: this.requireGraphFormat(options.format),\n measurement,\n timezone,\n width: this.requireIntegerInRange(\n options.width ?? DEFAULT_WIDTH,\n MIN_WIDTH,\n MAX_WIDTH,\n 'width',\n ),\n height: this.requireIntegerInRange(\n options.height ?? DEFAULT_HEIGHT,\n MIN_HEIGHT,\n MAX_HEIGHT,\n 'height',\n ),\n maxSeries: this.requirePositiveInteger(options.maxSeries ?? DEFAULT_MAX_SERIES, 'maxSeries'),\n maxPoints: this.requirePositiveInteger(options.maxPoints ?? DEFAULT_MAX_POINTS, 'maxPoints'),\n maxOutputBytes: this.requirePositiveInteger(\n options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES,\n 'maxOutputBytes',\n ),\n };\n }\n\n private requireGraphType(value: MetricGraphType): MetricGraphType {\n if (value === 'line' || value === 'bar' || value === 'stacked-bar') {\n return value;\n }\n throw new MetricGraphRenderError(`Unsupported metric graph type: ${String(value)}`);\n }\n\n private requireGraphFormat(value: MetricGraphFormat): MetricGraphFormat {\n if (value === 'terminal' || value === 'svg' || value === 'html') {\n return value;\n }\n throw new MetricGraphRenderError(`Unsupported metric graph format: ${String(value)}`);\n }\n\n private validateTimezone(timezone: string): void {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: timezone }).format(0);\n } catch {\n throw new MetricGraphRenderError(`Invalid display timezone: ${timezone}`);\n }\n }\n\n private requireText(value: string, field: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new MetricGraphRenderError(`${field} must be a non-empty string`);\n }\n return value;\n }\n\n private requirePositiveInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new MetricGraphRenderError(`${field} must be a positive safe integer`);\n }\n return value;\n }\n\n private requireIntegerInRange(\n value: number,\n minimum: number,\n maximum: number,\n field: string,\n ): number {\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n throw new MetricGraphRenderError(\n `${field} must be an integer between ${minimum} and ${maximum}`,\n );\n }\n return value;\n }\n\n private enforceCollectionLimits(\n seriesCount: number,\n pointCount: number,\n options: ResolvedGraphOptions,\n ): void {\n if (seriesCount > options.maxSeries) {\n throw new MetricGraphLimitError('MAX_SERIES', options.maxSeries, seriesCount);\n }\n if (pointCount > options.maxPoints) {\n throw new MetricGraphLimitError('MAX_POINTS', options.maxPoints, pointCount);\n }\n }\n\n private normalizeGaps(source: MetricQueryResponse['gaps']): GraphGap[] {\n return source\n .map((gap, index) => {\n this.requireInterval(gap.fromMs, gap.toMs, `gaps[${index}]`);\n return {\n fromMs: gap.fromMs,\n toMs: gap.toMs,\n reason: this.requireText(gap.reason, `gaps[${index}].reason`),\n };\n })\n .sort((left, right) =>\n this.compareTuple(\n [left.fromMs, left.toMs, left.reason],\n [right.fromMs, right.toMs, right.reason],\n ),\n );\n }\n\n private normalizePartialFailures(\n source: MetricQueryResponse['partialFailures'],\n ): GraphPartialFailure[] {\n return source\n .map((failure, index) => ({\n targetId: this.requireText(failure.targetId, `partialFailures[${index}].targetId`),\n reason: this.requireText(failure.reason, `partialFailures[${index}].reason`),\n }))\n .sort((left, right) =>\n this.compareTuple([left.targetId, left.reason], [right.targetId, right.reason]),\n );\n }\n\n private normalizePoints(response: MetricQueryResponse, measurement: string): GraphPoint[] {\n const points: GraphPoint[] = [];\n\n response.segments.forEach((segment, segmentIndex) => {\n this.requireInterval(segment.fromMs, segment.toMs, `segments[${segmentIndex}]`);\n this.requirePositiveInteger(segment.resolutionMs, `segments[${segmentIndex}].resolutionMs`);\n this.requirePositiveInteger(\n segment.definitionVersion,\n `segments[${segmentIndex}].definitionVersion`,\n );\n\n segment.buckets.forEach((bucket, bucketIndex) => {\n const path = `segments[${segmentIndex}].buckets[${bucketIndex}]`;\n this.requireInterval(bucket.startMs, bucket.endMs, path);\n this.requireBucketInsideSegment(\n bucket.startMs,\n bucket.endMs,\n segment.fromMs,\n segment.toMs,\n path,\n );\n const dimensions = this.normalizeDimensions(bucket.dimensions, path);\n const baseLabel = dimensions.label || measurement;\n const versionLabel = `definition=v${segment.definitionVersion}, resolution=${segment.resolutionMs}ms`;\n points.push({\n startMs: bucket.startMs,\n endMs: bucket.endMs,\n value: this.readMeasurement(bucket.values, measurement, path),\n seriesKey: JSON.stringify([\n dimensions.key,\n segment.definitionVersion,\n segment.resolutionMs,\n ]),\n seriesLabel: `${baseLabel} [${versionLabel}]`,\n dimensionsJson: dimensions.json,\n definitionVersion: segment.definitionVersion,\n resolutionMs: segment.resolutionMs,\n });\n });\n });\n\n return points.sort((left, right) => this.comparePoints(left, right));\n }\n\n private requireInterval(fromMs: number, toMs: number, field: string): void {\n if (!this.isValidTimestamp(fromMs) || !this.isValidTimestamp(toMs) || fromMs >= toMs) {\n throw new MetricGraphRenderError(\n `${field} must have valid millisecond timestamps in ascending order`,\n );\n }\n }\n\n private requireBucketInsideSegment(\n startMs: number,\n endMs: number,\n segmentFromMs: number,\n segmentToMs: number,\n field: string,\n ): void {\n if (startMs < segmentFromMs || endMs > segmentToMs) {\n throw new MetricGraphRenderError(`${field} falls outside its query segment`);\n }\n }\n\n private normalizeDimensions(value: unknown, field: string): GraphDimensions {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new MetricGraphRenderError(`${field}.dimensions must be an object`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => this.compareText(left, right));\n const normalized = entries.map(([key, entryValue]) => ({\n key,\n value: this.requireDimensionValue(entryValue, `${field}.dimensions.${key}`),\n }));\n const key = JSON.stringify(\n normalized.map((entry) => [entry.key, this.dimensionIdentity(entry.value)]),\n );\n const label = normalized\n .map((entry) => `${entry.key}=${this.dimensionLabel(entry.value)}`)\n .join(', ');\n const json = JSON.stringify(\n Object.fromEntries(normalized.map((entry) => [entry.key, entry.value])),\n );\n\n return { key, label, json };\n }\n\n private requireDimensionValue(value: unknown, field: string): string | number | boolean | null {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n throw new MetricGraphRenderError(`${field} must be a finite number, string, boolean, or null`);\n }\n\n private dimensionIdentity(value: string | number | boolean | null): string {\n if (value === null) {\n return 'null:null';\n }\n if (typeof value === 'number') {\n return `number:${this.exactNumber(value)}`;\n }\n return `${typeof value}:${String(value)}`;\n }\n\n private dimensionLabel(value: string | number | boolean | null): string {\n if (typeof value === 'string') {\n return /^[A-Za-z0-9_.:@/+-]+$/.test(value) ? value : JSON.stringify(value);\n }\n return value === null ? 'null' : String(value);\n }\n\n private readMeasurement(values: unknown, path: string, field: string): number {\n const parts = path.split('.');\n if (parts.some((part) => part.length === 0)) {\n throw new MetricGraphRenderError(`Invalid measurement path: ${path}`);\n }\n\n let current: unknown = values;\n for (const part of parts) {\n if (\n current === null ||\n typeof current !== 'object' ||\n !Object.prototype.hasOwnProperty.call(current, part)\n ) {\n throw new MetricGraphRenderError(\n `${field}.values does not contain numeric measurement ${path}`,\n );\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n if (typeof current !== 'number' || !Number.isFinite(current)) {\n throw new MetricGraphRenderError(\n `${field}.values measurement ${path} must be a finite number`,\n );\n }\n return current;\n }\n\n private comparePoints(left: GraphPoint, right: GraphPoint): number {\n return this.compareTuple(\n [\n left.startMs,\n left.endMs,\n left.seriesKey,\n left.definitionVersion,\n left.resolutionMs,\n this.exactNumber(left.value),\n ],\n [\n right.startMs,\n right.endMs,\n right.seriesKey,\n right.definitionVersion,\n right.resolutionMs,\n this.exactNumber(right.value),\n ],\n );\n }\n\n private groupSeries(points: GraphPoint[]): GraphSeries[] {\n const byKey = new Map<string, GraphSeries>();\n\n for (const point of points) {\n const existing = byKey.get(point.seriesKey);\n if (existing) {\n existing.points.push(point);\n continue;\n }\n byKey.set(point.seriesKey, {\n key: point.seriesKey,\n label: point.seriesLabel,\n dimensionsJson: point.dimensionsJson,\n points: [point],\n });\n }\n\n return [...byKey.values()].sort((left, right) =>\n this.compareTuple([left.label, left.key], [right.label, right.key]),\n );\n }\n\n private resolveTimeline(\n response: MetricQueryResponse,\n gaps: GraphGap[],\n points: GraphPoint[],\n ): GraphTimeline {\n const starts = [\n ...response.segments.map((segment) => segment.fromMs),\n ...gaps.map((gap) => gap.fromMs),\n ...points.map((point) => point.startMs),\n ].filter(Number.isFinite);\n const ends = [\n ...response.segments.map((segment) => segment.toMs),\n ...gaps.map((gap) => gap.toMs),\n ...points.map((point) => point.endMs),\n ].filter(Number.isFinite);\n\n if (starts.length === 0 || ends.length === 0) {\n return { fromMs: 0, toMs: 1, hasCoverage: false };\n }\n\n const fromMs = Math.min(...starts);\n const rawToMs = Math.max(...ends);\n return {\n fromMs,\n toMs: rawToMs > fromMs ? rawToMs : fromMs + 1,\n hasCoverage: true,\n };\n }\n\n private sortedUniqueNumbers(values: number[]): number[] {\n for (const value of values) {\n if (!Number.isFinite(value)) {\n throw new MetricGraphRenderError('Graph metadata contains a non-finite number');\n }\n }\n return [...new Set(values)].sort((left, right) => left - right);\n }\n\n private renderFormat(model: GraphModel): string {\n if (model.options.format === 'terminal') {\n return this.renderTerminal(model);\n }\n if (model.options.format === 'svg') {\n return this.renderSvg(model);\n }\n return this.renderHtml(model);\n }\n\n private renderTerminal(model: GraphModel): string {\n const lines = this.renderTerminalHeader(model);\n lines.push('', 'Series:');\n lines.push(...this.renderTerminalSeries(model));\n lines.push('', 'Plot:');\n lines.push(...this.renderTerminalPlot(model));\n lines.push('', 'Points (start -> end | series | value):');\n lines.push(...this.renderTerminalPoints(model));\n lines.push('', 'Gaps:');\n lines.push(...this.renderTerminalGaps(model));\n lines.push('', 'Partial failures:');\n lines.push(...this.renderTerminalPartialFailures(model));\n if (model.hasNextPage) {\n lines.push('', 'Pagination: incomplete (next cursor present)');\n }\n return `${lines.join('\\n')}\\n`;\n }\n\n private renderTerminalHeader(model: GraphModel): string[] {\n const coverage = model.timeline.hasCoverage\n ? `${this.formatTimestamp(model.timeline.fromMs, model.options.timezone)} -> ${this.formatTimestamp(model.timeline.toMs, model.options.timezone)}`\n : 'no coverage';\n return [\n 'Telemetry metric graph',\n `Type: ${model.options.type}`,\n `Target: ${this.terminalText(model.targetId)}`,\n `Metric: ${this.terminalText(model.metric)}`,\n `Measurement: ${this.terminalText(model.options.measurement)}`,\n `Definitions: ${model.definitions.join(', ') || 'none'}`,\n `Resolutions: ${model.resolutions.map((value) => `${value}ms`).join(', ') || 'none'}`,\n `Timezone: ${this.terminalText(model.options.timezone)}`,\n `Coverage: ${coverage}`,\n `Status: gaps=${model.gaps.length}; partialFailures=${model.partialFailures.length}; morePages=${model.hasNextPage ? 'yes' : 'no'}`,\n ];\n }\n\n private renderTerminalSeries(model: GraphModel): string[] {\n if (model.series.length === 0) {\n return [' (none)'];\n }\n return model.series.map(\n (series, index) => ` [${index + 1}] ${this.terminalText(series.label)}`,\n );\n }\n\n private renderTerminalPlot(model: GraphModel): string[] {\n if (model.points.length === 0) {\n return [' (no points)'];\n }\n if (model.options.type === 'line') {\n return this.renderTerminalLinePlot(model);\n }\n if (model.options.type === 'bar') {\n return this.renderTerminalBarPlot(model);\n }\n return this.renderTerminalStackedPlot(model);\n }\n\n private renderTerminalLinePlot(model: GraphModel): string[] {\n const values = model.points.map((point) => point.value);\n const minimum = Math.min(...values);\n const maximum = Math.max(...values);\n return model.series.map((series, index) => {\n const glyphs = series.points\n .map((point) => this.lineGlyph(point.value, minimum, maximum))\n .join('');\n const exactValues = series.points.map((point) => this.exactNumber(point.value)).join(', ');\n return ` [${index + 1}] ${glyphs} (${exactValues})`;\n });\n }\n\n private renderTerminalBarPlot(model: GraphModel): string[] {\n const maximum = Math.max(...model.points.map((point) => Math.abs(point.value)), 0);\n return model.points.map((point) => {\n const seriesIndex = this.seriesIndex(model, point.seriesKey);\n const glyph = this.barGlyph(point.value, maximum);\n return ` ${this.formatTimestamp(point.startMs, model.options.timezone)} [${seriesIndex + 1}] ${glyph} ${this.exactNumber(point.value)}`;\n });\n }\n\n private renderTerminalStackedPlot(model: GraphModel): string[] {\n const groups = this.groupBuckets(model.points);\n const maximum = Math.max(\n ...groups.map((group) =>\n Math.max(\n this.sumValues(\n group.points.filter((point) => point.value > 0).map((point) => point.value),\n ),\n Math.abs(\n this.sumValues(\n group.points.filter((point) => point.value < 0).map((point) => point.value),\n ),\n ),\n ),\n ),\n 0,\n );\n return groups.map((group) => {\n const components = group.points\n .map((point) => {\n const index = this.seriesIndex(model, point.seriesKey);\n return `[${index + 1}]=${this.exactNumber(point.value)}`;\n })\n .join(' ');\n const total = this.sumValues(group.points.map((point) => point.value));\n return ` ${this.formatTimestamp(group.startMs, model.options.timezone)} ${this.barGlyph(total, maximum)} ${components}`;\n });\n }\n\n private renderTerminalPoints(model: GraphModel): string[] {\n if (model.points.length === 0) {\n return [' (none)'];\n }\n return model.points.map((point) => {\n const start = this.formatTimestamp(point.startMs, model.options.timezone);\n const end = this.formatTimestamp(point.endMs, model.options.timezone);\n return ` ${start} -> ${end} | ${this.terminalText(point.seriesLabel)} | ${this.exactNumber(point.value)}`;\n });\n }\n\n private renderTerminalGaps(model: GraphModel): string[] {\n if (model.gaps.length === 0) {\n return [' (none)'];\n }\n return model.gaps.map(\n (gap) =>\n ` GAP ${this.formatTimestamp(gap.fromMs, model.options.timezone)} -> ${this.formatTimestamp(gap.toMs, model.options.timezone)} | ${this.terminalText(gap.reason)}`,\n );\n }\n\n private renderTerminalPartialFailures(model: GraphModel): string[] {\n if (model.partialFailures.length === 0) {\n return [' (none)'];\n }\n return model.partialFailures.map(\n (failure) =>\n ` PARTIAL ${this.terminalText(failure.targetId)} | ${this.terminalText(failure.reason)}`,\n );\n }\n\n private lineGlyph(value: number, minimum: number, maximum: number): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n if (minimum === maximum) {\n return glyphs[3] ?? '▄';\n }\n const normalized = this.normalizedFraction(value, minimum, maximum);\n const index = Math.round(normalized * (glyphs.length - 1));\n return glyphs[index] ?? '▄';\n }\n\n private barGlyph(value: number, maximum: number): string {\n if (value === 0 || maximum === 0) {\n return '·';\n }\n const size = Math.max(1, Math.round((Math.abs(value) / maximum) * TERMINAL_BAR_WIDTH));\n const bar = '█'.repeat(size);\n return value < 0 ? `◀${bar}` : bar;\n }\n\n private renderSvg(model: GraphModel): string {\n const scale = this.createScale(model);\n const title = `${model.metric} — ${model.options.measurement}`;\n const parts = [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${model.options.width}\" height=\"${model.options.height}\" viewBox=\"0 0 ${model.options.width} ${model.options.height}\" role=\"img\" aria-labelledby=\"telemetry-graph-title telemetry-graph-desc\">`,\n `<title id=\"telemetry-graph-title\">${this.escapeMarkup(title)}</title>`,\n `<desc id=\"telemetry-graph-desc\">${this.escapeMarkup(this.svgDescription(model))}</desc>`,\n '<defs><pattern id=\"telemetry-gap-pattern\" width=\"8\" height=\"8\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\"><line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"8\" stroke=\"#dc2626\" stroke-width=\"3\" opacity=\"0.35\"/></pattern></defs>',\n '<style>.bg{fill:#fff}.axis{stroke:#64748b;stroke-width:1}.grid{stroke:#e2e8f0;stroke-width:1}.label{font:12px ui-monospace,SFMono-Regular,Menlo,monospace;fill:#334155}.title{font:600 18px system-ui,sans-serif;fill:#0f172a}.meta{font:12px system-ui,sans-serif;fill:#475569}.warning{font:600 12px system-ui,sans-serif;fill:#b91c1c}.gap{fill:url(#telemetry-gap-pattern);stroke:#dc2626;stroke-width:1}.point{stroke:#fff;stroke-width:1.5}.bar{stroke:#fff;stroke-width:.75}</style>',\n `<rect class=\"bg\" x=\"0\" y=\"0\" width=\"${model.options.width}\" height=\"${model.options.height}\"/>`,\n `<text class=\"title\" x=\"24\" y=\"28\">${this.escapeMarkup(title)}</text>`,\n `<text class=\"meta\" x=\"24\" y=\"50\">${this.escapeMarkup(this.svgMetadata(model))}</text>`,\n `<text class=\"${this.hasWarnings(model) ? 'warning' : 'meta'}\" x=\"24\" y=\"72\">${this.escapeMarkup(this.svgStatus(model))}</text>`,\n ...this.renderSvgAxes(model, scale),\n ...this.renderSvgData(model, scale),\n ...this.renderSvgGaps(model, scale),\n ...this.renderSvgLegend(model, scale),\n '</svg>',\n ];\n return `${parts.join('\\n')}\\n`;\n }\n\n private svgDescription(model: GraphModel): string {\n const partial = model.partialFailures\n .map((failure) => `${failure.targetId}: ${failure.reason}`)\n .join('; ');\n const gaps = model.gaps.map((gap) => `${gap.fromMs}-${gap.toMs}: ${gap.reason}`).join('; ');\n const coverage = model.timeline.hasCoverage\n ? `${model.timeline.fromMs}-${model.timeline.toMs}`\n : 'none';\n return `Target ${model.targetId}; metric ${model.metric}; measurement ${model.options.measurement}; type ${model.options.type}; timezone ${model.options.timezone}; coverage ${coverage}; gaps ${gaps || 'none'}; partial failures ${partial || 'none'}; next page ${model.hasNextPage ? 'present' : 'absent'}`;\n }\n\n private svgMetadata(model: GraphModel): string {\n const definitions = model.definitions.join(',') || 'none';\n const resolutions = model.resolutions.map((value) => `${value}ms`).join(',') || 'none';\n const coverage = model.timeline.hasCoverage\n ? `${this.formatTimestamp(model.timeline.fromMs, model.options.timezone)}–${this.formatTimestamp(model.timeline.toMs, model.options.timezone)}`\n : 'none';\n return `target=${model.targetId} · definitions=${definitions} · resolutions=${resolutions} · timezone=${model.options.timezone} · coverage=${coverage}`;\n }\n\n private svgStatus(model: GraphModel): string {\n const failureText = model.partialFailures\n .map((failure) => `${failure.targetId}: ${failure.reason}`)\n .join(' | ');\n const parts = [\n `gaps=${model.gaps.length}`,\n `partialFailures=${model.partialFailures.length}`,\n `morePages=${model.hasNextPage ? 'yes' : 'no'}`,\n ];\n if (failureText) {\n parts.push(`PARTIAL: ${failureText}`);\n }\n return parts.join(' · ');\n }\n\n private hasWarnings(model: GraphModel): boolean {\n return model.gaps.length > 0 || model.partialFailures.length > 0 || model.hasNextPage;\n }\n\n private createScale(model: GraphModel): GraphScale {\n const left = 76;\n const right = model.options.width - 28;\n const legendColumns = this.legendColumns(model.options.width);\n const legendRows = Math.ceil(model.series.length / legendColumns);\n const top = 104;\n const bottom = model.options.height - 62 - legendRows * 19;\n if (bottom - top < 80) {\n throw new MetricGraphRenderError('Graph height is too small for the selected series legend');\n }\n\n const [yMin, yMax] = this.valueDomain(model);\n const xSpan = model.timeline.toMs - model.timeline.fromMs;\n const yFactor = Math.max(Math.abs(yMin), Math.abs(yMax), 1);\n const normalizedYMin = yMin / yFactor;\n const normalizedYSpan = yMax / yFactor - normalizedYMin;\n return {\n left,\n right,\n top,\n bottom,\n x: (value) => left + ((value - model.timeline.fromMs) / xSpan) * (right - left),\n y: (value) =>\n bottom - ((value / yFactor - normalizedYMin) / normalizedYSpan) * (bottom - top),\n yMin,\n yMax,\n };\n }\n\n private valueDomain(model: GraphModel): [number, number] {\n if (model.points.length === 0) {\n return [0, 1];\n }\n if (model.options.type === 'stacked-bar') {\n return this.stackedValueDomain(model.points);\n }\n const values = model.points.map((point) => point.value);\n const minimum = Math.min(0, ...values);\n const maximum = Math.max(0, ...values);\n return this.nonZeroDomain(minimum, maximum);\n }\n\n private stackedValueDomain(points: GraphPoint[]): [number, number] {\n const totals = this.groupBuckets(points).map((group) => ({\n negative: this.sumValues(\n group.points.filter((point) => point.value < 0).map((point) => point.value),\n ),\n positive: this.sumValues(\n group.points.filter((point) => point.value >= 0).map((point) => point.value),\n ),\n }));\n return this.nonZeroDomain(\n Math.min(0, ...totals.map((total) => total.negative)),\n Math.max(0, ...totals.map((total) => total.positive)),\n );\n }\n\n private nonZeroDomain(minimum: number, maximum: number): [number, number] {\n if (minimum === maximum) {\n return minimum === 0 ? [0, 1] : [minimum, minimum + 1];\n }\n return [minimum, maximum];\n }\n\n private renderSvgAxes(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n const tickCount = 5;\n for (let index = 0; index < tickCount; index += 1) {\n const fraction = index / (tickCount - 1);\n const value = this.interpolate(scale.yMax, scale.yMin, fraction);\n const y = scale.y(value);\n lines.push(\n `<line class=\"grid\" x1=\"${this.coordinate(scale.left)}\" y1=\"${this.coordinate(y)}\" x2=\"${this.coordinate(scale.right)}\" y2=\"${this.coordinate(y)}\"/>`,\n `<text class=\"label\" x=\"${this.coordinate(scale.left - 8)}\" y=\"${this.coordinate(y + 4)}\" text-anchor=\"end\">${this.escapeMarkup(this.axisNumber(value))}</text>`,\n );\n }\n lines.push(\n `<line class=\"axis\" x1=\"${scale.left}\" y1=\"${scale.top}\" x2=\"${scale.left}\" y2=\"${scale.bottom}\"/>`,\n `<line class=\"axis\" x1=\"${scale.left}\" y1=\"${scale.bottom}\" x2=\"${scale.right}\" y2=\"${scale.bottom}\"/>`,\n `<text class=\"label\" x=\"${scale.left}\" y=\"${scale.bottom + 20}\" text-anchor=\"start\">${this.escapeMarkup(this.timelineLabel(model, model.timeline.fromMs))}</text>`,\n `<text class=\"label\" x=\"${scale.right}\" y=\"${scale.bottom + 20}\" text-anchor=\"end\">${this.escapeMarkup(this.timelineLabel(model, model.timeline.toMs))}</text>`,\n );\n return lines;\n }\n\n private renderSvgData(model: GraphModel, scale: GraphScale): string[] {\n if (model.options.type === 'line') {\n return this.renderSvgLines(model, scale);\n }\n if (model.options.type === 'bar') {\n return this.renderSvgBars(model, scale);\n }\n return this.renderSvgStackedBars(model, scale);\n }\n\n private renderSvgLines(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n model.series.forEach((series, seriesIndex) => {\n const color = this.seriesColor(seriesIndex);\n const runs = this.splitLineRuns(series.points, model.gaps);\n for (const run of runs) {\n if (run.length > 1) {\n const points = run\n .map(\n (point) =>\n `${this.coordinate(scale.x(this.pointCenter(point)))},${this.coordinate(scale.y(point.value))}`,\n )\n .join(' ');\n lines.push(\n `<polyline fill=\"none\" stroke=\"${color}\" stroke-width=\"2\" points=\"${points}\"/>`,\n );\n }\n }\n for (const point of series.points) {\n lines.push(\n `<circle class=\"point\" fill=\"${color}\" cx=\"${this.coordinate(scale.x(this.pointCenter(point)))}\" cy=\"${this.coordinate(scale.y(point.value))}\" r=\"4\" ${this.svgPointAttributes(point)}><title>${this.escapeMarkup(this.pointTitle(point, model.options.timezone))}</title></circle>`,\n );\n }\n });\n return lines;\n }\n\n private splitLineRuns(points: GraphPoint[], gaps: GraphGap[]): GraphPoint[][] {\n const runs: GraphPoint[][] = [];\n let current: GraphPoint[] = [];\n for (const point of points) {\n const previous = current[current.length - 1];\n if (previous && this.hasGapBetween(previous, point, gaps)) {\n runs.push(current);\n current = [];\n }\n current.push(point);\n }\n if (current.length > 0) {\n runs.push(current);\n }\n return runs;\n }\n\n private hasGapBetween(previous: GraphPoint, next: GraphPoint, gaps: GraphGap[]): boolean {\n const previousCenter = this.pointCenter(previous);\n const nextCenter = this.pointCenter(next);\n return gaps.some((gap) => gap.fromMs < nextCenter && gap.toMs > previousCenter);\n }\n\n private renderSvgBars(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n const seriesCount = Math.max(1, model.series.length);\n for (const point of model.points) {\n const seriesIndex = this.seriesIndex(model, point.seriesKey);\n const bucketLeft = scale.x(point.startMs);\n const bucketRight = scale.x(point.endMs);\n const availableWidth = Math.max(1, bucketRight - bucketLeft) * 0.82;\n const barWidth = Math.max(0.5, availableWidth / seriesCount);\n const x =\n bucketLeft + (bucketRight - bucketLeft - availableWidth) / 2 + seriesIndex * barWidth;\n const zeroY = scale.y(0);\n const valueY = scale.y(point.value);\n lines.push(\n `<rect class=\"bar\" fill=\"${this.seriesColor(seriesIndex)}\" x=\"${this.coordinate(x)}\" y=\"${this.coordinate(Math.min(zeroY, valueY))}\" width=\"${this.coordinate(barWidth)}\" height=\"${this.coordinate(Math.max(1, Math.abs(zeroY - valueY)))}\" ${this.svgPointAttributes(point)}><title>${this.escapeMarkup(this.pointTitle(point, model.options.timezone))}</title></rect>`,\n );\n }\n return lines;\n }\n\n private renderSvgStackedBars(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n for (const group of this.groupBuckets(model.points)) {\n const bucketLeft = scale.x(group.startMs);\n const bucketRight = scale.x(group.endMs);\n const width = Math.max(0.5, (bucketRight - bucketLeft) * 0.72);\n const x = bucketLeft + (bucketRight - bucketLeft - width) / 2;\n let positiveBase = 0;\n let negativeBase = 0;\n\n for (const point of group.points) {\n const seriesIndex = this.seriesIndex(model, point.seriesKey);\n const base = point.value >= 0 ? positiveBase : negativeBase;\n const next = base + point.value;\n const baseY = scale.y(base);\n const nextY = scale.y(next);\n lines.push(\n `<rect class=\"bar\" fill=\"${this.seriesColor(seriesIndex)}\" x=\"${this.coordinate(x)}\" y=\"${this.coordinate(Math.min(baseY, nextY))}\" width=\"${this.coordinate(width)}\" height=\"${this.coordinate(Math.max(1, Math.abs(baseY - nextY)))}\" data-stack-base=\"${this.escapeMarkup(this.exactNumber(base))}\" ${this.svgPointAttributes(point)}><title>${this.escapeMarkup(this.pointTitle(point, model.options.timezone))}</title></rect>`,\n );\n if (point.value >= 0) {\n positiveBase = next;\n } else {\n negativeBase = next;\n }\n }\n }\n return lines;\n }\n\n private renderSvgGaps(model: GraphModel, scale: GraphScale): string[] {\n return model.gaps.map((gap) => {\n const start = Math.max(model.timeline.fromMs, gap.fromMs);\n const end = Math.min(model.timeline.toMs, gap.toMs);\n const x = scale.x(start);\n const width = Math.max(2, scale.x(end) - x);\n const title = `GAP ${this.formatTimestamp(gap.fromMs, model.options.timezone)} to ${this.formatTimestamp(gap.toMs, model.options.timezone)}: ${gap.reason}`;\n return `<rect class=\"gap\" x=\"${this.coordinate(x)}\" y=\"${scale.top}\" width=\"${this.coordinate(width)}\" height=\"${this.coordinate(scale.bottom - scale.top)}\" data-gap-from-ms=\"${gap.fromMs}\" data-gap-to-ms=\"${gap.toMs}\" data-gap-reason=\"${this.escapeMarkup(this.terminalText(gap.reason))}\"><title>${this.escapeMarkup(title)}</title></rect>`;\n });\n }\n\n private renderSvgLegend(model: GraphModel, scale: GraphScale): string[] {\n if (model.series.length === 0) {\n return [\n `<text class=\"meta\" x=\"${scale.left}\" y=\"${scale.bottom + 48}\">No metric points returned.</text>`,\n ];\n }\n const columns = this.legendColumns(model.options.width);\n const columnWidth = (scale.right - scale.left) / columns;\n return model.series.map((series, index) => {\n const column = index % columns;\n const row = Math.floor(index / columns);\n const x = scale.left + column * columnWidth;\n const y = scale.bottom + 48 + row * 19;\n return `<g class=\"legend-item\" data-series=\"${this.escapeMarkup(this.terminalText(series.label))}\"><circle cx=\"${this.coordinate(x)}\" cy=\"${this.coordinate(y - 4)}\" r=\"5\" fill=\"${this.seriesColor(index)}\"/><text class=\"label\" x=\"${this.coordinate(x + 10)}\" y=\"${this.coordinate(y)}\">${this.escapeMarkup(series.label)}</text></g>`;\n });\n }\n\n private legendColumns(width: number): number {\n return Math.max(1, Math.min(4, Math.floor((width - 100) / 220)));\n }\n\n private svgPointAttributes(point: GraphPoint): string {\n return [\n `data-start-ms=\"${point.startMs}\"`,\n `data-end-ms=\"${point.endMs}\"`,\n `data-series=\"${this.escapeMarkup(this.terminalText(point.seriesLabel))}\"`,\n `data-dimensions=\"${this.escapeMarkup(this.terminalText(point.dimensionsJson))}\"`,\n `data-value=\"${this.escapeMarkup(this.exactNumber(point.value))}\"`,\n `data-definition-version=\"${point.definitionVersion}\"`,\n `data-resolution-ms=\"${point.resolutionMs}\"`,\n ].join(' ');\n }\n\n private pointTitle(point: GraphPoint, timezone: string): string {\n return `${point.seriesLabel}: ${this.exactNumber(point.value)} (${this.formatTimestamp(point.startMs, timezone)} to ${this.formatTimestamp(point.endMs, timezone)})`;\n }\n\n private renderHtml(model: GraphModel): string {\n const title = `${model.metric} — ${model.options.measurement}`;\n const parts = [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head>',\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">',\n '<meta http-equiv=\"Content-Security-Policy\" content=\"default-src \\'none\\'; style-src \\'unsafe-inline\\'\">',\n `<title>${this.escapeMarkup(title)}</title>`,\n '<style>body{margin:0;padding:24px;background:#f8fafc;color:#0f172a;font:14px system-ui,sans-serif}main{max-width:1200px;margin:auto}.panel{background:#fff;border:1px solid #cbd5e1;border-radius:10px;padding:18px;margin-bottom:18px;overflow:auto}h1,h2{margin:0 0 12px}.meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:8px}.warning{border-left:5px solid #dc2626;background:#fef2f2}table{border-collapse:collapse;width:100%;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}th,td{border-bottom:1px solid #e2e8f0;padding:7px;text-align:left;vertical-align:top;white-space:nowrap}th{background:#f1f5f9}code{white-space:pre-wrap;overflow-wrap:anywhere}svg{max-width:100%;height:auto}</style>',\n '</head>',\n '<body>',\n '<main>',\n `<section class=\"panel\"><h1>${this.escapeMarkup(title)}</h1><div class=\"meta\">${this.renderHtmlMetadata(model)}</div></section>`,\n ...(this.hasWarnings(model) ? [this.renderHtmlWarnings(model)] : []),\n `<section class=\"panel\" aria-label=\"Metric graph\">${this.renderSvg(model)}</section>`,\n this.renderHtmlPoints(model),\n this.renderHtmlGaps(model),\n this.renderHtmlPartialFailures(model),\n '</main>',\n '</body>',\n '</html>',\n ];\n return `${parts.join('\\n')}\\n`;\n }\n\n private renderHtmlMetadata(model: GraphModel): string {\n const coverage = model.timeline.hasCoverage\n ? `${this.formatTimestamp(model.timeline.fromMs, model.options.timezone)} → ${this.formatTimestamp(model.timeline.toMs, model.options.timezone)}`\n : 'No coverage';\n const entries = [\n ['Target', model.targetId],\n ['Metric', model.metric],\n ['Measurement', model.options.measurement],\n ['Graph type', model.options.type],\n ['Definition versions', model.definitions.join(', ') || 'none'],\n ['Resolutions', model.resolutions.map((value) => `${value}ms`).join(', ') || 'none'],\n ['Timezone', model.options.timezone],\n ['Coverage', coverage],\n ];\n return entries\n .map(\n ([label, value]) =>\n `<div><strong>${this.escapeMarkup(label ?? '')}</strong><br><code>${this.escapeMarkup(value ?? '')}</code></div>`,\n )\n .join('');\n }\n\n private renderHtmlWarnings(model: GraphModel): string {\n const warnings = [\n ...(model.gaps.length > 0\n ? [`${model.gaps.length} coverage gap(s) are marked on the graph.`]\n : []),\n ...(model.partialFailures.length > 0\n ? [`${model.partialFailures.length} storage target(s) reported partial failure.`]\n : []),\n ...(model.hasNextPage\n ? ['The query has another page; this graph is explicitly incomplete.']\n : []),\n ];\n return `<section class=\"panel warning\" role=\"alert\"><h2>Incomplete coverage</h2><ul>${warnings.map((warning) => `<li>${this.escapeMarkup(warning)}</li>`).join('')}</ul></section>`;\n }\n\n private renderHtmlPoints(model: GraphModel): string {\n const rows = model.points\n .map(\n (point) =>\n `<tr><td>${this.escapeMarkup(this.formatTimestamp(point.startMs, model.options.timezone))}</td><td>${this.escapeMarkup(this.formatTimestamp(point.endMs, model.options.timezone))}</td><td>${this.escapeMarkup(point.seriesLabel)}</td><td><code>${this.escapeMarkup(point.dimensionsJson)}</code></td><td>${this.escapeMarkup(this.exactNumber(point.value))}</td><td>${point.definitionVersion}</td><td>${point.resolutionMs}</td></tr>`,\n )\n .join('');\n const body = rows || '<tr><td colspan=\"7\">No metric points returned.</td></tr>';\n return `<section class=\"panel\"><h2>Exact bucket values</h2><table><thead><tr><th>Start</th><th>End</th><th>Series</th><th>Dimensions</th><th>Value</th><th>Definition</th><th>Resolution (ms)</th></tr></thead><tbody>${body}</tbody></table></section>`;\n }\n\n private renderHtmlGaps(model: GraphModel): string {\n const rows = model.gaps\n .map(\n (gap) =>\n `<tr><td>${this.escapeMarkup(this.formatTimestamp(gap.fromMs, model.options.timezone))}</td><td>${this.escapeMarkup(this.formatTimestamp(gap.toMs, model.options.timezone))}</td><td>${this.escapeMarkup(gap.reason)}</td></tr>`,\n )\n .join('');\n const body = rows || '<tr><td colspan=\"3\">No coverage gaps.</td></tr>';\n return `<section class=\"panel\"><h2>Coverage gaps</h2><table><thead><tr><th>From</th><th>To</th><th>Reason</th></tr></thead><tbody>${body}</tbody></table></section>`;\n }\n\n private renderHtmlPartialFailures(model: GraphModel): string {\n const rows = model.partialFailures\n .map(\n (failure) =>\n `<tr><td>${this.escapeMarkup(failure.targetId)}</td><td>${this.escapeMarkup(failure.reason)}</td></tr>`,\n )\n .join('');\n const body = rows || '<tr><td colspan=\"2\">No partial target failures.</td></tr>';\n return `<section class=\"panel\"><h2>Partial target failures</h2><table><thead><tr><th>Target</th><th>Reason</th></tr></thead><tbody>${body}</tbody></table></section>`;\n }\n\n private groupBuckets(points: GraphPoint[]): BucketGroup[] {\n const byInterval = new Map<string, BucketGroup>();\n for (const point of points) {\n const key = `${point.startMs}:${point.endMs}`;\n const existing = byInterval.get(key);\n if (existing) {\n existing.points.push(point);\n } else {\n byInterval.set(key, {\n startMs: point.startMs,\n endMs: point.endMs,\n points: [point],\n });\n }\n }\n return [...byInterval.values()]\n .map((group) => ({\n ...group,\n points: [...group.points].sort((left, right) =>\n this.compareTuple(\n [left.seriesKey, this.exactNumber(left.value)],\n [right.seriesKey, this.exactNumber(right.value)],\n ),\n ),\n }))\n .sort((left, right) =>\n this.compareTuple([left.startMs, left.endMs], [right.startMs, right.endMs]),\n );\n }\n\n private seriesIndex(model: GraphModel, seriesKey: string): number {\n const index = model.series.findIndex((series) => series.key === seriesKey);\n if (index < 0) {\n throw new MetricGraphRenderError(`Series is missing from graph model: ${seriesKey}`);\n }\n return index;\n }\n\n private seriesColor(index: number): string {\n return SVG_COLORS[index % SVG_COLORS.length] ?? SVG_COLORS[0];\n }\n\n private pointCenter(point: GraphPoint): number {\n return point.startMs + (point.endMs - point.startMs) / 2;\n }\n\n private timelineLabel(model: GraphModel, value: number): string {\n return model.timeline.hasCoverage\n ? this.formatTimestamp(value, model.options.timezone)\n : 'no coverage';\n }\n\n private formatTimestamp(value: number, timezone: string): string {\n const date = new Date(value);\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23',\n timeZoneName: 'short',\n });\n const parts = Object.fromEntries(\n formatter\n .formatToParts(date)\n .filter((part) => part.type !== 'literal')\n .map((part) => [part.type, part.value]),\n );\n const milliseconds = String(date.getUTCMilliseconds()).padStart(3, '0');\n return `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}:${parts.second}.${milliseconds} ${parts.timeZoneName}`;\n }\n\n private exactNumber(value: number): string {\n return Object.is(value, -0) ? '-0' : String(value);\n }\n\n private axisNumber(value: number): string {\n return this.exactNumber(Number(value.toPrecision(6)));\n }\n\n private coordinate(value: number): string {\n return this.exactNumber(Number(value.toFixed(2)));\n }\n\n private isValidTimestamp(value: number): boolean {\n return Number.isSafeInteger(value) && !Number.isNaN(new Date(value).getTime());\n }\n\n private normalizedFraction(value: number, minimum: number, maximum: number): number {\n const factor = Math.max(Math.abs(minimum), Math.abs(maximum), 1);\n const normalizedMinimum = minimum / factor;\n return (value / factor - normalizedMinimum) / (maximum / factor - normalizedMinimum);\n }\n\n private interpolate(from: number, to: number, fraction: number): number {\n const factor = Math.max(Math.abs(from), Math.abs(to), 1);\n return (from / factor + (to / factor - from / factor) * fraction) * factor;\n }\n\n private sumValues(values: number[]): number {\n const total = values.reduce((sum, value) => sum + value, 0);\n if (!Number.isFinite(total)) {\n throw new MetricGraphRenderError('Stacked metric values exceed the finite numeric range');\n }\n return total;\n }\n\n private terminalText(value: string): string {\n return value.replace(\n /[\\u0000-\\u001f\\u007f-\\u009f]/g,\n (character) => `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n );\n }\n\n private escapeMarkup(value: string): string {\n return this.terminalText(value)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n private compareText(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n }\n\n private compareTuple(left: Array<number | string>, right: Array<number | string>): number {\n const length = Math.min(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const leftValue = left[index];\n const rightValue = right[index];\n if (leftValue === rightValue) {\n continue;\n }\n if (leftValue === undefined || rightValue === undefined) {\n return leftValue === undefined ? -1 : 1;\n }\n return leftValue < rightValue ? -1 : 1;\n }\n return left.length - right.length;\n }\n\n private utf8ByteLength(value: string): number {\n let bytes = 0;\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint <= 0x7f) {\n bytes += 1;\n } else if (codePoint <= 0x7ff) {\n bytes += 2;\n } else if (codePoint <= 0xffff) {\n bytes += 3;\n } else {\n bytes += 4;\n }\n }\n return bytes;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { MigrationRunnerFactory } from '@noego/proper';\nimport BetterSqlite3 from 'better-sqlite3';\nimport { createSqliteDb } from 'sqlstack/adapters';\nimport { telemetryChecksum } from '../core/helper/canonical_json.js';\nimport type { SqliteTargetConfiguration } from '../core/types/configuration.types.js';\nimport type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n SQLITE_LOGICAL_TABLE_NAMES,\n SQLITE_SCHEMA_MANIFEST_TABLE,\n} from '../storage/helper/sqlite_table_names.js';\nimport { SqliteOwnershipLease } from '../storage/sqlite_ownership_lease.js';\nimport { TelemetryProperSqlRunner } from '../storage/telemetry_proper_sql_runner.js';\nimport { TelemetryRepository } from '../storage/telemetry_repository.js';\nimport { TelemetryTableMap } from '../storage/telemetry_table_map.js';\nimport { TelemetrySchemaManifestRowSchema } from '../transports/schema/telemetry_schema_manifest.js';\nimport { ReadOnlySqlGuard } from './helper/read_only_sql_guard.js';\nimport type {\n TelemetryCliDiagnosticResult,\n TelemetryCliMigrationStatus,\n TelemetryCliSession,\n TelemetryCliSessionMode,\n} from './types/telemetry_cli.types.js';\n\nconst MIGRATIONS_DIRECTORY =\n typeof __dirname === 'string'\n ? resolve(__dirname, '../../migrations')\n : fileURLToPath(new URL('../../migrations/', import.meta.url));\n\nexport class OfflineSqliteTelemetrySession implements TelemetryCliSession {\n private connection: BetterSqlite3.Database | null = null;\n private repository: TelemetryRepository | null = null;\n private lease: SqliteOwnershipLease | null = null;\n private tableMap: TelemetryTableMap | null = null;\n private legacyManifest = false;\n\n private constructor(\n private readonly target: SqliteTargetConfiguration,\n private readonly mode: TelemetryCliSessionMode,\n private readonly definitions: readonly MetricDefinition[],\n private readonly now: () => number,\n private readonly sqlGuard: ReadOnlySqlGuard,\n ) {}\n\n static async create(\n target: SqliteTargetConfiguration,\n mode: TelemetryCliSessionMode,\n definitions: readonly MetricDefinition[],\n now: () => number = () => Date.now(),\n ): Promise<OfflineSqliteTelemetrySession> {\n const session = new OfflineSqliteTelemetrySession(\n target,\n mode,\n definitions,\n now,\n new ReadOnlySqlGuard(),\n );\n try {\n await session.open();\n return session;\n } catch (cause) {\n await session.close();\n throw cause;\n }\n }\n\n async timeline(\n query: TimelineQuery,\n ): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n this.requireQueryMode();\n const validation = this.validateQueryRange(\n query.targetId,\n query.fromMs,\n query.toMs,\n query.limit,\n );\n if (validation !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validation } };\n }\n return this.requireRepository().timeline(query, this.now() - this.target.retention.rawMs);\n }\n\n async metrics(\n query: MetricQuery,\n ): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n this.requireQueryMode();\n const validation = this.validateQueryRange(\n query.targetId,\n query.fromMs,\n query.toMs,\n query.limit,\n );\n if (validation !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validation } };\n }\n if (query.limit > this.target.query.maxBuckets) {\n return {\n ok: false,\n error: {\n kind: 'invalid-query',\n message: 'Metric query limit exceeds the configured bucket maximum',\n },\n };\n }\n const result = this.requireRepository().metrics(query);\n if (!result.ok) {\n return result;\n }\n const bucketCount = result.value.segments.reduce(\n (count, segment) => count + segment.buckets.length,\n 0,\n );\n if (bucketCount > this.target.query.maxBuckets) {\n return {\n ok: false,\n error: {\n kind: 'invalid-query',\n message: 'Metric query exceeds the configured bucket limit',\n },\n };\n }\n return result;\n }\n\n async diagnosticQuery(\n sql: string,\n bindings: Readonly<Record<string, unknown>>,\n limits: Readonly<{ maxRows: number; maxBytes: number; maxDurationMs: number }>,\n ): Promise<TelemetryCliDiagnosticResult> {\n this.requireQueryMode();\n const statement = this.sqlGuard.validate(sql);\n const prepared = this.requireConnection().prepare(statement.sql);\n if (!prepared.reader) {\n throw new Error('SQLite rejected diagnostic SQL as non-read-only');\n }\n const startedAt = this.now();\n const rows: Readonly<Record<string, unknown>>[] = [];\n let bytes = 0;\n let truncated = false;\n const iterator =\n Object.keys(bindings).length === 0 ? prepared.iterate() : prepared.iterate(bindings);\n for (const rawRow of iterator) {\n const row = this.requireRecord(rawRow);\n bytes += Buffer.byteLength(JSON.stringify(row), 'utf8');\n if (bytes > limits.maxBytes) {\n throw new Error('Diagnostic SQL response exceeds the configured byte limit');\n }\n if (this.now() - startedAt > limits.maxDurationMs) {\n throw new Error('Diagnostic SQL exceeded the configured time limit');\n }\n if (rows.length === limits.maxRows) {\n truncated = true;\n break;\n }\n rows.push(Object.freeze({ ...row }));\n }\n return Object.freeze({\n columns: Object.freeze(prepared.columns().map((column) => column.name)),\n rows: Object.freeze(rows),\n truncated,\n elapsedMs: this.now() - startedAt,\n });\n }\n\n async migrationStatus(): Promise<TelemetryCliMigrationStatus> {\n this.requireMaintenanceMode();\n const runner = await this.createMigrationRunner();\n const completed = await runner.getCompletedMigrations();\n const pending = await runner.getPendingMigrations();\n return this.migrationStatusResult(\n completed.map((migration) => migration.name),\n pending.map((migration) => migration.name),\n );\n }\n\n async migrateUp(): Promise<TelemetryCliMigrationStatus> {\n this.requireMaintenanceMode();\n const runner = await this.createMigrationRunner();\n const pending = await runner.getPendingMigrations();\n await runner.migrate(pending, true);\n if (this.legacyManifest) {\n this.upgradeLegacyManifest();\n }\n this.verifySchema();\n return this.migrationStatus();\n }\n\n async close(): Promise<void> {\n try {\n if (this.connection?.open) {\n this.connection.close();\n }\n } finally {\n this.connection = null;\n this.repository = null;\n this.tableMap = null;\n this.lease?.release();\n this.lease = null;\n }\n }\n\n private async open(): Promise<void> {\n const tableMap = TelemetryTableMap.create(this.target.schema);\n if (!tableMap.ok) {\n throw new Error(tableMap.error);\n }\n this.tableMap = tableMap.value;\n if (this.mode === 'maintenance') {\n this.lease = new SqliteOwnershipLease({\n targetId: this.target.targetId,\n databasePath: this.target.path,\n mode: 'offline-maintenance',\n expiryMs: this.target.leaseExpiryMs,\n processToken: randomUUID(),\n now: this.now,\n });\n const acquired = this.lease.acquire();\n if (!acquired.ok) {\n throw new Error(acquired.error);\n }\n }\n const connection = new BetterSqlite3(this.target.path, {\n readonly: this.mode === 'query',\n fileMustExist: true,\n });\n this.connection = connection;\n connection.pragma('foreign_keys = ON');\n connection.pragma('busy_timeout = 1000');\n if (this.mode === 'query') {\n connection.pragma('query_only = ON');\n }\n this.verifyManifest();\n if (this.mode === 'query') {\n const stackDatabase = await createSqliteDb(connection);\n this.repository = new TelemetryRepository({\n targetId: this.target.targetId,\n connection,\n stackDatabase,\n tableMap: tableMap.value,\n retention: this.target.retention,\n now: this.now,\n });\n const loaded = this.repository.loadDefinitionsReadOnly(this.definitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n }\n }\n\n private verifyManifest(): void {\n const rows = this.requireConnection()\n .prepare(\n `SELECT target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n FROM \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"`,\n )\n .all();\n if (rows.length !== 1) {\n throw new Error('Telemetry schema manifest must contain exactly one target mapping');\n }\n const parsed = TelemetrySchemaManifestRowSchema.safeParse(rows[0]);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n if (parsed.data.format_version !== 1 && parsed.data.format_version !== 2) {\n throw new Error(`Unsupported telemetry schema format ${parsed.data.format_version}`);\n }\n if (parsed.data.target_id !== this.target.targetId) {\n throw new Error(\n `Telemetry database belongs to target ${parsed.data.target_id}, not ${this.target.targetId}`,\n );\n }\n if (parsed.data.state !== 'ready') {\n throw new Error('Telemetry schema rename recovery is required before offline access');\n }\n if (parsed.data.mapping_checksum === this.requireTableMap().checksum) {\n return;\n }\n if (\n this.mode === 'maintenance' &&\n parsed.data.format_version === 1 &&\n this.isLegacyManifestMapping(parsed.data.mapping_json, parsed.data.mapping_checksum)\n ) {\n this.legacyManifest = true;\n return;\n }\n throw new Error('Telemetry table mapping differs from the schema manifest');\n }\n\n private isLegacyManifestMapping(mappingJson: string, mappingChecksum: string): boolean {\n const parsed: unknown = JSON.parse(mappingJson);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return false;\n }\n if (telemetryChecksum(parsed) !== mappingChecksum) {\n return false;\n }\n const expected = this.requireTableMap().manifestMapping();\n const legacyEntries = Object.entries(expected).filter(\n ([logicalName]) => logicalName !== 'committedDropCounters',\n );\n return (\n Object.keys(parsed).length === legacyEntries.length &&\n legacyEntries.every(([logicalName, physicalName]) => {\n return Reflect.get(parsed, logicalName) === physicalName;\n })\n );\n }\n\n private upgradeLegacyManifest(): void {\n const tableMap = this.requireTableMap();\n this.requireConnection()\n .prepare(\n `UPDATE \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"\n SET format_version = 2, mapping_json = ?, mapping_checksum = ?, updated_at_ms = ?\n WHERE target_id = ?`,\n )\n .run(\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.now(),\n this.target.targetId,\n );\n this.legacyManifest = false;\n }\n\n private async createMigrationRunner() {\n return new MigrationRunnerFactory().create(\n {\n migration_folder: MIGRATIONS_DIRECTORY,\n migration_table: this.requireTableMap().quoted('migrationHistory'),\n database: 'sqlite',\n sqlite: { database: this.target.path },\n },\n new TelemetryProperSqlRunner(this.requireConnection(), this.requireTableMap()),\n );\n }\n\n private verifySchema(): void {\n const rows = this.requireConnection()\n .prepare(`SELECT name FROM sqlite_master WHERE type = 'table'`)\n .all();\n const names = new Set(\n rows.map((row) => {\n const record = this.requireRecord(row);\n const name = record.name;\n if (typeof name !== 'string') {\n throw new Error('SQLite schema returned an invalid table name');\n }\n return name;\n }),\n );\n const missing = SQLITE_LOGICAL_TABLE_NAMES.map((logicalName) =>\n this.requireTableMap().physical(logicalName),\n ).filter((name) => !names.has(name));\n if (missing.length > 0) {\n throw new Error(`Telemetry schema is missing table(s): ${missing.join(', ')}`);\n }\n }\n\n private validateQueryRange(\n targetId: string | null,\n fromMs: number,\n toMs: number,\n limit: number,\n ): string | null {\n if (targetId !== null && targetId !== this.target.targetId) {\n return `Query target ${targetId} does not match ${this.target.targetId}`;\n }\n if (!Number.isSafeInteger(fromMs) || !Number.isSafeInteger(toMs) || fromMs >= toMs) {\n return 'Query time range must use ascending millisecond timestamps';\n }\n if (toMs - fromMs > this.target.query.maxRangeMs) {\n return 'Query time range exceeds the configured maximum';\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > this.target.query.maxRows) {\n return 'Query row limit is outside the configured bounds';\n }\n return null;\n }\n\n private migrationStatusResult(\n completed: readonly string[],\n pending: readonly string[],\n ): TelemetryCliMigrationStatus {\n return Object.freeze({\n targetId: this.target.targetId,\n completed: Object.freeze([...completed].sort()),\n pending: Object.freeze([...pending].sort()),\n });\n }\n\n private requireQueryMode(): void {\n if (this.mode !== 'query') {\n throw new Error('This telemetry session is not open for queries');\n }\n }\n\n private requireMaintenanceMode(): void {\n if (this.mode !== 'maintenance') {\n throw new Error('This telemetry session is not open for migrations');\n }\n }\n\n private requireConnection(): BetterSqlite3.Database {\n if (this.connection === null) {\n throw new Error('Offline telemetry SQLite connection is closed');\n }\n return this.connection;\n }\n\n private requireRepository(): TelemetryRepository {\n if (this.repository === null) {\n throw new Error('Offline telemetry query repository is not initialized');\n }\n return this.repository;\n }\n\n private requireTableMap(): TelemetryTableMap {\n if (this.tableMap === null) {\n throw new Error('Offline telemetry table mapping is not initialized');\n }\n return this.tableMap;\n }\n\n private requireRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error('SQLite returned an invalid diagnostic row');\n }\n const record: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n record[key] = Reflect.get(value, key);\n }\n return Object.freeze(record);\n }\n}\n","import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n SqliteOwnershipLeaseOptions,\n SqliteOwnershipLeaseRecord,\n} from './types/sqlite_ownership_lease.types.js';\n\nexport class SqliteOwnershipLease {\n private readonly canonicalDatabasePath: string;\n private readonly leasePath: string;\n private held = false;\n\n constructor(private readonly options: SqliteOwnershipLeaseOptions) {\n mkdirSync(dirname(options.databasePath), { recursive: true });\n const canonicalDirectory = realpathSync(dirname(resolve(options.databasePath)));\n const databaseName = resolve(options.databasePath).slice(dirname(resolve(options.databasePath)).length + 1);\n this.canonicalDatabasePath = resolve(canonicalDirectory, databaseName);\n this.leasePath = `${this.canonicalDatabasePath}.telemetry-owner.json`;\n }\n\n acquire(): TelemetryResult<void, string> {\n const firstAttempt = this.writeExclusive(this.createRecord());\n if (firstAttempt.ok) {\n this.held = true;\n return firstAttempt;\n }\n\n const recovered = this.recoverStaleLease();\n if (!recovered.ok) {\n return recovered;\n }\n const secondAttempt = this.writeExclusive(this.createRecord());\n if (secondAttempt.ok) {\n this.held = true;\n }\n return secondAttempt;\n }\n\n heartbeat(): TelemetryResult<void, string> {\n if (!this.held) {\n return { ok: false, error: 'Cannot heartbeat a telemetry lease that is not held' };\n }\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n if (current.value.processToken !== this.options.processToken) {\n this.held = false;\n return { ok: false, error: 'Telemetry ownership lease was replaced by another owner' };\n }\n const now = this.options.now();\n return this.writeReplace({\n ...current.value,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n });\n }\n\n release(): void {\n if (!this.held || !existsSync(this.leasePath)) {\n this.held = false;\n return;\n }\n const current = this.readRecord();\n if (current.ok && current.value.processToken === this.options.processToken) {\n try {\n rmSync(this.leasePath, { force: true });\n } catch {\n // The lease will expire and can be recovered by a later owner.\n }\n }\n this.held = false;\n }\n\n isHeld(): boolean {\n return this.held;\n }\n\n path(): string {\n return this.leasePath;\n }\n\n private createRecord(): SqliteOwnershipLeaseRecord {\n const now = this.options.now();\n return {\n formatVersion: 1,\n targetId: this.options.targetId,\n databasePath: this.canonicalDatabasePath,\n mode: this.options.mode,\n pid: process.pid,\n processToken: this.options.processToken,\n acquiredAtMs: now,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n };\n }\n\n private writeExclusive(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n let descriptor: number | null = null;\n try {\n descriptor = openSync(this.leasePath, 'wx', 0o600);\n writeFileSync(descriptor, JSON.stringify(record), { encoding: 'utf8' });\n closeSync(descriptor);\n return { ok: true, value: undefined };\n } catch (cause) {\n if (descriptor !== null) {\n try {\n closeSync(descriptor);\n } catch {\n // Preserve the original lease acquisition error.\n }\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private writeReplace(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n const temporaryPath = `${this.leasePath}.${this.options.processToken}.tmp`;\n try {\n writeFileSync(temporaryPath, JSON.stringify(record), { encoding: 'utf8', mode: 0o600 });\n renameSync(temporaryPath, this.leasePath);\n return { ok: true, value: undefined };\n } catch (cause) {\n try {\n rmSync(temporaryPath, { force: true });\n } catch {\n // Preserve the original heartbeat write error.\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private readRecord(): TelemetryResult<SqliteOwnershipLeaseRecord, string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(this.leasePath, 'utf8'));\n if (!this.isLeaseRecord(parsed)) {\n return { ok: false, error: `Invalid telemetry ownership lease at ${this.leasePath}` };\n }\n return { ok: true, value: parsed };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private recoverStaleLease(): TelemetryResult<void, string> {\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n const expired = current.value.expiresAtMs < this.options.now();\n const processAlive = this.isProcessAlive(current.value.pid);\n if (!expired || processAlive) {\n return {\n ok: false,\n error: `Telemetry target ${this.options.targetId} is owned by pid ${current.value.pid} (${current.value.mode})`,\n };\n }\n try {\n const stalePath = `${this.leasePath}.stale.${current.value.processToken}`;\n renameSync(this.leasePath, stalePath);\n rmSync(stalePath, { force: true });\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (cause) {\n const code = typeof cause === 'object' && cause !== null && 'code' in cause\n ? Reflect.get(cause, 'code')\n : null;\n return code === 'EPERM';\n }\n }\n\n private isLeaseRecord(value: unknown): value is SqliteOwnershipLeaseRecord {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Reflect.get(value, 'formatVersion') === 1\n && typeof Reflect.get(value, 'targetId') === 'string'\n && typeof Reflect.get(value, 'databasePath') === 'string'\n && (Reflect.get(value, 'mode') === 'writer' || Reflect.get(value, 'mode') === 'offline-maintenance')\n && Number.isInteger(Reflect.get(value, 'pid'))\n && typeof Reflect.get(value, 'processToken') === 'string'\n && typeof Reflect.get(value, 'acquiredAtMs') === 'number'\n && typeof Reflect.get(value, 'heartbeatAtMs') === 'number'\n && typeof Reflect.get(value, 'expiresAtMs') === 'number';\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type Database from 'better-sqlite3';\nimport type { ISQLRunner } from '@noego/proper/runners';\nimport { TelemetryTableMap } from './telemetry_table_map.js';\n\nexport class TelemetryProperSqlRunner implements ISQLRunner {\n constructor(\n private readonly connection: Database.Database,\n private readonly tableMap: TelemetryTableMap,\n ) {}\n\n async query(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n const normalized = this.leadingKeyword(substituted);\n if (normalized === 'SELECT' || normalized === 'WITH' || normalized === 'PRAGMA' || normalized === 'EXPLAIN') {\n return [this.connection.prepare(substituted).all(...params), undefined];\n }\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async end(): Promise<void> {\n // Proper shares the SQLite target's connection and must not close it.\n }\n\n private substitute(sql: string): string {\n const substituted = this.tableMap.substitute(sql);\n if (!substituted.ok) {\n throw new Error(substituted.error);\n }\n return substituted.value;\n }\n\n private leadingKeyword(sql: string): string {\n const withoutComments = sql\n .replace(/--.*$/gm, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .trimStart();\n return withoutComments.split(/\\s+/, 1)[0]?.toUpperCase() ?? '';\n }\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalJson, telemetryChecksum } from '../core/helper/canonical_json.js';\nimport { MetricDefinitionContract } from '../core/metric_definition_contract.js';\nimport type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from '../core/types/json.types.js';\nimport type {\n MetricAggregate,\n MetricDefinition,\n MetricMeasurement,\n MetricRollupValues,\n} from '../core/types/metric.types.js';\nimport type {\n MetricBucket,\n MetricDimensionFilter,\n MetricQuery,\n MetricQueryGap,\n MetricQueryResponse,\n MetricQuerySegment,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n RetentionDrain,\n RetentionDrainBatchResult,\n StoragePersistRequest,\n} from '../core/types/storage.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryDropCounter,\n} from '../core/types/transport.types.js';\nimport {\n BatchAcknowledgementRowSchema,\n type MetricSampleRow,\n StoredMetricDefinitionRowSchema,\n StoredMetricDefinitionSchema,\n} from './schema/telemetry_repository_rows.js';\nimport { TelemetryRepositoryRowParser } from './telemetry_repository_row_parser.js';\nimport type {\n MetricBucketWork,\n MutableMaterializedMetricGroup,\n MutableMetricFieldAggregate,\n NormalizedMetricSample,\n RepositoryPersistOutcome,\n RollupCoverageInterval,\n TelemetryRepositoryOptions,\n} from './types/telemetry_repository.types.js';\n\nconst RETENTION_PAGE_SIZE = 500;\n\ntype RawRetentionCursor = Readonly<{\n occurredAtMs: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype SampleRetentionCursor = Readonly<{\n occurredAtMs: number;\n metricName: string;\n definitionVersion: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype RetentionStepOutcome = Readonly<{ deleted: number; done: boolean }>;\n\ntype RetentionStep = () => RetentionStepOutcome;\n\nclass MetricCardinalityRejectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MetricCardinalityRejectionError';\n }\n}\n\nexport class TelemetryRepository {\n private readonly rowParser = new TelemetryRepositoryRowParser();\n private readonly definitionContract = new MetricDefinitionContract();\n private readonly definitions = new Map<string, MetricDefinition>();\n\n constructor(private readonly options: TelemetryRepositoryOptions) {}\n\n registerDefinitions(definitions: readonly MetricDefinition[]): TelemetryResult<void, string> {\n try {\n const normalizedDefinitions = this.normalizeDefinitions(definitions);\n const registeredAtMs = this.options.now();\n const byName = new Map<string, MetricDefinition[]>();\n for (const definition of normalizedDefinitions) {\n const versions = byName.get(definition.name) ?? [];\n versions.push(definition);\n byName.set(definition.name, versions);\n }\n\n const transaction = this.options.connection.transaction(() => {\n const table = this.options.tableMap.quoted('metricDefinitions');\n const deactivate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 0 WHERE target_id = ? AND metric_name = ?`,\n );\n const existing = this.options.connection.prepare(\n `SELECT definition_checksum FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, metric_name, definition_version, definition_json,\n definition_checksum, active, registered_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n const activate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 1\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n\n for (const [metricName, versions] of byName) {\n deactivate.run(this.options.targetId, metricName);\n const latestVersion = Math.max(...versions.map((definition) => definition.version));\n for (const definition of versions) {\n const definitionJson = canonicalJson(definition);\n const definitionChecksum = telemetryChecksum(definition);\n const prior = existing.get(this.options.targetId, definition.name, definition.version);\n if (prior !== undefined) {\n const priorChecksum = this.readStringField(prior, 'definition_checksum');\n if (priorChecksum !== definitionChecksum) {\n throw new Error(\n `Metric ${definition.name} version ${definition.version} changed without a version bump`,\n );\n }\n } else {\n insert.run(\n this.options.targetId,\n definition.name,\n definition.version,\n definitionJson,\n definitionChecksum,\n definition.version === latestVersion ? 1 : 0,\n registeredAtMs,\n );\n }\n }\n activate.run(this.options.targetId, metricName, latestVersion);\n }\n });\n transaction();\n const loaded = this.loadDefinitionsReadOnly(normalizedDefinitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n loadDefinitionsReadOnly(\n expectedDefinitions: readonly MetricDefinition[],\n ): TelemetryResult<void, string> {\n try {\n const normalizedExpectedDefinitions = this.normalizeDefinitions(expectedDefinitions);\n const table = this.options.tableMap.quoted('metricDefinitions');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, definition_json, definition_checksum, active\n FROM ${table} WHERE target_id = ?`,\n )\n .all(this.options.targetId);\n const loaded = new Map<string, MetricDefinition>();\n for (const rawRow of rows) {\n const row = StoredMetricDefinitionRowSchema.parse(rawRow);\n const parsedJson: unknown = JSON.parse(row.definition_json);\n const parsedDefinition = StoredMetricDefinitionSchema.parse(parsedJson);\n const normalized = this.definitionContract.normalize(parsedDefinition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n const definition = normalized.value;\n const identityMatches =\n definition.name === row.metric_name && definition.version === row.definition_version;\n if (!identityMatches) {\n throw new Error('Stored metric definition identity does not match its row');\n }\n const checksum = telemetryChecksum(definition);\n const canonicalRowMatches =\n checksum === row.definition_checksum &&\n canonicalJson(definition) === row.definition_json;\n // Rows written before the shared canonical-json/fnv1a64 contract used\n // sha256 over the writer's own serialization. Their integrity is still\n // verifiable against their stored checksum, and registration rewrites\n // them in the canonical format on the next collector start.\n const legacyRowMatches =\n !canonicalRowMatches &&\n createHash('sha256').update(row.definition_json, 'utf8').digest('hex') ===\n row.definition_checksum;\n if (!canonicalRowMatches && !legacyRowMatches) {\n // Stale inactive rows are not load-bearing; an unreadable legacy\n // format must not wedge readers.\n if (row.active !== 1) {\n continue;\n }\n throw new Error(\n `Stored metric ${definition.name} version ${definition.version} checksum is invalid`,\n );\n }\n loaded.set(this.definitionKey(definition.name, definition.version), definition);\n }\n for (const expected of normalizedExpectedDefinitions) {\n const stored = loaded.get(this.definitionKey(expected.name, expected.version));\n if (stored === undefined || telemetryChecksum(stored) !== telemetryChecksum(expected)) {\n throw new Error(\n `Configured metric ${expected.name} version ${expected.version} is not registered in target ${this.options.targetId}`,\n );\n }\n }\n this.definitions.clear();\n for (const [identity, definition] of loaded) {\n this.definitions.set(identity, definition);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n persist(request: StoragePersistRequest): RepositoryPersistOutcome {\n try {\n const outsideHorizon = this.outsideIngestionHorizon(request.batch);\n if (outsideHorizon !== null) {\n return { kind: 'acknowledged', acknowledgement: outsideHorizon };\n }\n const replay = this.findReplay(request.batch);\n if (replay !== null) {\n return { kind: 'acknowledged', acknowledgement: replay };\n }\n const acknowledgement = this.persistTransaction(request);\n return { kind: 'acknowledged', acknowledgement };\n } catch (cause) {\n return { kind: 'failed', reason: this.errorMessage(cause) };\n }\n }\n\n timeline(\n query: TimelineQuery,\n rawRetentionCutoffMs: number,\n ): TelemetryResult<TimelineQueryResponse, TelemetryQueryError> {\n try {\n const cursor =\n query.cursor === null ? null : this.rowParser.parseTimelineCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Timeline cursor order changed' },\n };\n }\n\n const availableFromMs = Math.max(query.fromMs, rawRetentionCutoffMs);\n const clauses = ['target_id = ?', 'occurred_at_ms >= ?', 'occurred_at_ms < ?'];\n const params: unknown[] = [this.options.targetId, availableFromMs, query.toMs];\n this.addTimelineFilters(query, clauses, params);\n if (cursor?.ok) {\n this.addTimelineCursor(cursor.value, query.order, clauses, params);\n }\n const direction = query.order === 'asc' ? 'ASC' : 'DESC';\n const table = this.options.tableMap.quoted('rawEvents');\n const sql = `SELECT\n producer_id, sequence, event_id, occurred_at_ms, monotonic_ns,\n source, process_kind, level, label, conversation_id,\n conversation_id_kind, correlation_id, metadata_json, schema_version\n FROM ${table}\n WHERE ${clauses.join(' AND ')}\n ORDER BY occurred_at_ms ${direction}, producer_id ${direction}, sequence ${direction}\n LIMIT ?`;\n params.push(query.limit + 1);\n const rows = this.options.connection.prepare(sql).all(...params);\n const hasNextPage = rows.length > query.limit;\n const pageRows = hasNextPage ? rows.slice(0, query.limit) : rows;\n const events: TelemetryEnvelope[] = [];\n for (const row of pageRows) {\n const parsed = this.rowParser.parseRawEnvelope(row);\n if (!parsed.ok) {\n return { ok: false, error: { kind: 'storage-failure', message: parsed.error } };\n }\n events.push(parsed.value);\n }\n const last = events[events.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n occurredAtMs: last.occurredAtMs,\n producerId: last.producerId,\n sequence: last.sequence,\n })\n : null;\n const unavailableEnd = Math.min(query.toMs, rawRetentionCutoffMs);\n const gaps =\n query.fromMs < unavailableEnd\n ? [{ fromMs: query.fromMs, toMs: unavailableEnd, reason: 'raw-retention' as const }]\n : [];\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n events: Object.freeze(events),\n gaps: Object.freeze(gaps),\n nextCursor,\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n metrics(query: MetricQuery): TelemetryResult<MetricQueryResponse, TelemetryQueryError> {\n try {\n const definitions = this.metricDefinitions(query.metric);\n if (definitions.length === 0) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: `Unknown metric ${query.metric}` },\n };\n }\n const validationError = this.validateMetricQuery(query, definitions);\n if (validationError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validationError } };\n }\n const cursor = query.cursor === null ? null : this.rowParser.parseMetricCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric cursor order changed' },\n };\n }\n\n const coverage = this.planCoverage(query, definitions);\n const rows = this.readRollupsForCoverage(query, coverage.intervals);\n const filtered = rows.filter((row) => this.matchesWhere(row.bucket.dimensions, query.where));\n const ordered = filtered.sort((left, right) =>\n this.compareParsedRollups(left, right, query.order),\n );\n const afterCursor = cursor?.ok\n ? ordered.filter((row) => this.isAfterMetricCursor(row, cursor.value, query.order))\n : ordered;\n const hasNextPage = afterCursor.length > query.limit;\n const page = hasNextPage ? afterCursor.slice(0, query.limit) : afterCursor;\n const projected = page.map((row) => ({\n ...row,\n bucket: {\n ...row.bucket,\n values: this.selectMeasurements(row.bucket.values, query.measurements),\n },\n }));\n const segments = this.rowsToSegments(coverage.intervals, projected);\n const last = page[page.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n bucketStartMs: last.bucket.startMs,\n resolutionMs: last.resolutionMs,\n definitionVersion: last.definitionVersion,\n dimensionKey: last.dimensionKey,\n })\n : null;\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n metric: query.metric,\n segments,\n gaps: coverage.gaps,\n nextCursor,\n partialFailures: [],\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n let affectedRows = 0;\n let rejectedBucketCount = 0;\n const rejectedBucketExamples: string[] = [];\n try {\n for (const definition of this.definitions.values()) {\n for (const resolutionMs of definition.resolutionsMs) {\n const dueBeforeMs = nowMs - this.options.retention.lateArrivalMs;\n const bucketStarts = this.findDueBucketStarts(definition, resolutionMs, dueBeforeMs);\n for (const bucketStartMs of bucketStarts) {\n if (this.options.now() - startedAt >= maxWorkMs) {\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n true,\n ),\n },\n };\n }\n const work = this.loadBucketWork(definition, resolutionMs, bucketStartMs);\n if (this.bucketIsCurrent(work)) {\n continue;\n }\n try {\n affectedRows += this.materializeBucket(work, nowMs);\n } catch (cause) {\n if (!(cause instanceof MetricCardinalityRejectionError)) {\n throw cause;\n }\n this.recordRejectedBucket(work, nowMs, cause.message);\n rejectedBucketCount += 1;\n if (rejectedBucketExamples.length < 3) {\n rejectedBucketExamples.push(\n `${definition.name}:${definition.version}:${resolutionMs}:${bucketStartMs}: ${cause.message}`,\n );\n }\n }\n }\n }\n }\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n false,\n ),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n beginRetentionDrain(nowMs: number): RetentionDrain {\n const steps: RetentionStep[] = [\n this.createRawEventRetentionStep(nowMs),\n this.createSampleRetentionStep(nowMs),\n ...this.createRollupRetentionSteps(nowMs),\n ...this.createAuxiliaryRetentionSteps(nowMs),\n ];\n let index = 0;\n return {\n nextBatch: (): TelemetryResult<RetentionDrainBatchResult, string> => {\n try {\n if (steps.length === 0) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n if (index >= steps.length) {\n index = 0;\n }\n const step = steps[index];\n if (step === undefined) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n const outcome = step();\n if (outcome.done) {\n steps.splice(index, 1);\n } else {\n index += 1;\n }\n return {\n ok: true,\n value: { deletedRows: outcome.deleted, hasMore: steps.length > 0 },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n },\n };\n }\n\n checkpoint(): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const rows = this.options.connection.pragma('wal_checkpoint(PASSIVE)');\n return {\n ok: true,\n value: {\n stage: 'checkpoint',\n affectedRows: Array.isArray(rows) ? rows.length : 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n reclaim(maxPages: number): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const before = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n this.options.connection.pragma(`incremental_vacuum(${Math.max(0, Math.floor(maxPages))})`);\n const after = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n return {\n ok: true,\n value: {\n stage: 'reclaim',\n affectedRows: 0,\n affectedPages: Math.max(0, before - after),\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n pageStats(): TelemetryResult<\n Readonly<{ pageCount: number; freePages: number; pageSize: number }>,\n string\n > {\n try {\n return {\n ok: true,\n value: {\n pageCount: Number(this.options.connection.pragma('page_count', { simple: true })),\n freePages: Number(this.options.connection.pragma('freelist_count', { simple: true })),\n pageSize: Number(this.options.connection.pragma('page_size', { simple: true })),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recordMaintenance(record: MaintenanceRunRecord): TelemetryResult<void, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const affectedRows = record.stages.reduce((sum, stage) => sum + stage.affectedRows, 0);\n const affectedPages = record.stages.reduce((sum, stage) => sum + stage.affectedPages, 0);\n const detail = canonicalJson({\n stages: record.stages,\n failedStage: record.failedStage,\n error: record.error,\n });\n this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, run_id, state, stage, started_at_ms, completed_at_ms,\n affected_rows, affected_pages, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, run_id, stage) DO UPDATE SET\n state = excluded.state,\n completed_at_ms = excluded.completed_at_ms,\n affected_rows = excluded.affected_rows,\n affected_pages = excluded.affected_pages,\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n record.runId,\n record.state,\n record.kind,\n record.startedAtMs,\n record.completedAtMs,\n affectedRows,\n affectedPages,\n detail,\n );\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recoverInterruptedMaintenance(nowMs: number): TelemetryResult<number, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const detail = canonicalJson({\n stages: [],\n failedStage: null,\n error: 'interrupted-before-restart',\n });\n const result = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'failed', completed_at_ms = ?, detail = ?\n WHERE target_id = ? AND state = 'started'`,\n ).run(nowMs, detail, this.options.targetId);\n return { ok: true, value: result.changes };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n committedDropCounters(): TelemetryResult<readonly TelemetryDropCounter[], string> {\n try {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const rows = this.options.connection\n .prepare(\n `SELECT reason, priority, count\n FROM ${table}\n WHERE target_id = ?\n ORDER BY reason ASC, priority ASC`,\n )\n .all(this.options.targetId);\n const counters = rows.map((row) => this.parseCommittedDropCounter(row));\n return { ok: true, value: Object.freeze(counters) };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private findReplay(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n const rows = this.options.connection\n .prepare(\n `SELECT idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?\n AND sequence_start <= ? AND sequence_end >= ?`,\n )\n .all(this.options.targetId, batch.producerId, batch.sequenceEnd, batch.sequenceStart);\n if (rows.length === 0) {\n return this.findPrunedReplayConflict(batch);\n }\n for (const row of rows) {\n const parsed = BatchAcknowledgementRowSchema.safeParse(row);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const identical =\n parsed.data.idempotency_key === batch.idempotencyKey &&\n parsed.data.checksum === batch.checksum &&\n parsed.data.sequence_start === batch.sequenceStart &&\n parsed.data.sequence_end === batch.sequenceEnd;\n if (identical) {\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: parsed.data.committed_at_ms,\n acceptedEvents: parsed.data.accepted_events,\n duplicate: true,\n targetStates: [this.committedTargetState(0)],\n };\n }\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range overlaps a different committed batch',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-range-conflict',\n },\n ],\n };\n }\n\n private outsideIngestionHorizon(\n batch: TelemetryBatch,\n ): TelemetryAcknowledgement | null {\n const cutoffMs = this.options.now() - this.longestRetentionMs();\n const containsExpiredEvent = batch.envelopes.some(\n (envelope) => envelope.occurredAtMs < cutoffMs,\n );\n if (!containsExpiredEvent) {\n return null;\n }\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'invalid-batch',\n reason: 'Telemetry batch is older than the configured ingestion horizon',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'batch-outside-ingestion-horizon',\n },\n ],\n };\n }\n\n private findPrunedReplayConflict(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const row = this.options.connection\n .prepare(\n `SELECT highest_sequence\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?`,\n )\n .get(this.options.targetId, batch.producerId);\n if (row === undefined) {\n return null;\n }\n const highestSequence = this.readNumberField(row, 'highest_sequence');\n if (batch.sequenceStart > highestSequence) {\n return null;\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range is at or below the durable ingest watermark',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-at-or-below-watermark',\n },\n ],\n };\n }\n\n private persistTransaction(request: StoragePersistRequest): TelemetryAcknowledgement {\n const committedAtMs = this.options.now();\n const transaction = this.options.connection.transaction(() => {\n this.insertRawEvents(request, committedAtMs);\n this.insertMetricSamples(request, committedAtMs);\n this.insertExtractionFailures(request, committedAtMs);\n this.upsertCommittedDropCounters(request.batch, committedAtMs);\n this.insertBatchAcknowledgement(request.batch, committedAtMs);\n this.updateIngestWatermark(request.batch, committedAtMs);\n });\n transaction();\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs,\n acceptedEvents: request.batch.envelopes.length,\n duplicate: false,\n targetStates: [this.committedTargetState(1)],\n };\n }\n\n private insertRawEvents(request: StoragePersistRequest, insertedAtMs: number): void {\n const table = this.options.tableMap.quoted('rawEvents');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, sequence, event_id, batch_idempotency_key,\n occurred_at_ms, monotonic_ns, source, process_kind, level, label,\n conversation_id, conversation_id_kind, correlation_id, metadata_json,\n schema_version, inserted_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const envelope of request.batch.envelopes) {\n const conversationId =\n envelope.conversationId === null ? null : String(envelope.conversationId);\n const conversationKind =\n envelope.conversationId === null ? null : typeof envelope.conversationId;\n insert.run(\n this.options.targetId,\n envelope.producerId,\n envelope.sequence,\n envelope.eventId,\n request.batch.idempotencyKey,\n envelope.occurredAtMs,\n envelope.monotonicNs,\n envelope.source,\n envelope.processKind,\n envelope.level,\n envelope.label,\n conversationId,\n conversationKind,\n envelope.correlationId,\n canonicalJson(envelope.metadata),\n envelope.schemaVersion,\n insertedAtMs,\n );\n }\n }\n\n private insertMetricSamples(request: StoragePersistRequest, _insertedAtMs: number): void {\n const samplesTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${samplesTable} (\n target_id, metric_name, definition_version, occurred_at_ms,\n producer_id, sequence, dimension_key, dimensions_json, values_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n const invalidate = this.options.connection.prepare(\n `DELETE FROM ${completionTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n );\n for (const sample of request.samples) {\n insert.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n sample.occurredAtMs,\n sample.producerId,\n sample.sequence,\n sample.dimensionKey,\n canonicalJson(sample.dimensions),\n canonicalJson(sample.values),\n );\n const definition = this.definitions.get(\n this.definitionKey(sample.metricName, sample.definitionVersion),\n );\n if (!definition) {\n throw new Error(\n `Missing registered metric definition ${sample.metricName}:${sample.definitionVersion}`,\n );\n }\n for (const resolutionMs of definition.resolutionsMs) {\n const bucketStartMs = this.bucketStart(sample.occurredAtMs, resolutionMs);\n invalidate.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n resolutionMs,\n bucketStartMs,\n );\n }\n }\n }\n\n private insertExtractionFailures(request: StoragePersistRequest, recordedAtMs: number): void {\n const table = this.options.tableMap.quoted('extractionFailures');\n const insert = this.options.connection.prepare(\n `INSERT OR REPLACE INTO ${table} (\n target_id, metric_name, definition_version, producer_id,\n sequence, reason, recorded_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const failure of request.extractionFailures) {\n insert.run(\n this.options.targetId,\n failure.metricName,\n failure.definitionVersion,\n failure.producerId,\n failure.sequence,\n failure.reason.slice(0, 1_024),\n recordedAtMs,\n );\n }\n }\n\n private upsertCommittedDropCounters(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const upsert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, reason, priority, count, first_committed_at_ms, last_committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, reason, priority) DO UPDATE SET\n count = MIN(9007199254740991, ${table}.count + excluded.count),\n first_committed_at_ms = MIN(\n ${table}.first_committed_at_ms,\n excluded.first_committed_at_ms\n ),\n last_committed_at_ms = MAX(\n ${table}.last_committed_at_ms,\n excluded.last_committed_at_ms\n )`,\n );\n for (const counter of batch.dropCounters) {\n if (!Number.isSafeInteger(counter.count) || counter.count <= 0) {\n throw new Error('Committed telemetry drop counters must be positive safe integers');\n }\n upsert.run(\n this.options.targetId,\n counter.reason,\n counter.priority,\n counter.count,\n committedAtMs,\n committedAtMs,\n );\n }\n }\n\n private insertBatchAcknowledgement(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n this.options.targetId,\n batch.idempotencyKey,\n batch.producerId,\n batch.sequenceStart,\n batch.sequenceEnd,\n batch.schemaVersion,\n batch.checksum,\n batch.envelopes.length,\n committedAtMs,\n );\n }\n\n private updateIngestWatermark(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const lastOccurredAtMs = Math.max(...batch.envelopes.map((envelope) => envelope.occurredAtMs));\n const internalGapCount = batch.sequenceEnd - batch.sequenceStart + 1 - batch.envelopes.length;\n const initialGapCount = batch.sequenceStart + internalGapCount;\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, highest_sequence, last_occurred_at_ms,\n last_committed_at_ms, observed_gap_count\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, producer_id) DO UPDATE SET\n observed_gap_count = ${table}.observed_gap_count\n + MAX(0, ? - ${table}.highest_sequence - 1)\n + ?,\n highest_sequence = MAX(${table}.highest_sequence, excluded.highest_sequence),\n last_occurred_at_ms = MAX(${table}.last_occurred_at_ms, excluded.last_occurred_at_ms),\n last_committed_at_ms = excluded.last_committed_at_ms`,\n )\n .run(\n this.options.targetId,\n batch.producerId,\n batch.sequenceEnd,\n lastOccurredAtMs,\n committedAtMs,\n initialGapCount,\n batch.sequenceStart,\n internalGapCount,\n );\n }\n\n private addTimelineFilters(query: TimelineQuery, clauses: string[], params: unknown[]): void {\n const filters: readonly [unknown, string, unknown][] = [\n [\n query.conversationId,\n 'conversation_id = ?',\n query.conversationId === null ? null : String(query.conversationId),\n ],\n [query.source, 'source = ?', query.source],\n [query.label, 'label = ?', query.label],\n [query.level, 'level = ?', query.level],\n [query.producerId, 'producer_id = ?', query.producerId],\n [query.correlationId, 'correlation_id = ?', query.correlationId],\n ];\n for (const [guard, clause, parameter] of filters) {\n if (guard !== null) {\n clauses.push(clause);\n params.push(parameter);\n }\n }\n }\n\n private addTimelineCursor(\n cursor: Readonly<{ occurredAtMs: number; producerId: string; sequence: number }>,\n order: 'asc' | 'desc',\n clauses: string[],\n params: unknown[],\n ): void {\n const comparison = order === 'asc' ? '>' : '<';\n clauses.push(`(\n occurred_at_ms ${comparison} ?\n OR (occurred_at_ms = ? AND producer_id ${comparison} ?)\n OR (occurred_at_ms = ? AND producer_id = ? AND sequence ${comparison} ?)\n )`);\n params.push(\n cursor.occurredAtMs,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.sequence,\n );\n }\n\n private findDueBucketStarts(\n definition: MetricDefinition,\n resolutionMs: number,\n dueBeforeMs: number,\n ): number[] {\n const sampleTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `WITH sample_buckets AS (\n SELECT\n CAST(occurred_at_ms / ? AS INTEGER) * ? AS bucket_start_ms,\n COUNT(*) AS sample_count,\n MAX(occurred_at_ms) AS sample_watermark_ms\n FROM ${sampleTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms < ?\n AND (CAST(occurred_at_ms / ? AS INTEGER) * ?) + ? <= ?\n GROUP BY bucket_start_ms\n )\n SELECT bucket.bucket_start_ms\n FROM sample_buckets AS bucket\n LEFT JOIN ${completionTable} AS completion\n ON completion.target_id = ?\n AND completion.metric_name = ?\n AND completion.definition_version = ?\n AND completion.resolution_ms = ?\n AND completion.bucket_start_ms = bucket.bucket_start_ms\n WHERE completion.bucket_start_ms IS NULL\n OR completion.sample_count <> bucket.sample_count\n OR completion.sample_watermark_ms <> bucket.sample_watermark_ms\n ORDER BY bucket.bucket_start_ms ASC\n LIMIT 256`,\n )\n .all(\n resolutionMs,\n resolutionMs,\n this.options.targetId,\n definition.name,\n definition.version,\n dueBeforeMs,\n resolutionMs,\n resolutionMs,\n resolutionMs,\n dueBeforeMs,\n this.options.targetId,\n definition.name,\n definition.version,\n resolutionMs,\n );\n return rows.map((row) => this.readNumberField(row, 'bucket_start_ms'));\n }\n\n private loadBucketWork(\n definition: MetricDefinition,\n resolutionMs: number,\n bucketStartMs: number,\n ): MetricBucketWork {\n const table = this.options.tableMap.quoted('metricSamples');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms >= ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, producer_id ASC, sequence ASC`,\n )\n .all(\n this.options.targetId,\n definition.name,\n definition.version,\n bucketStartMs,\n bucketStartMs + resolutionMs,\n );\n const samples = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n return { definition, resolutionMs, bucketStartMs, samples };\n }\n\n private bucketIsCurrent(work: MetricBucketWork): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT sample_count, sample_watermark_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .get(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n if (row === undefined) {\n return false;\n }\n const sampleCount = this.readNumberField(row, 'sample_count');\n const watermark = this.readNumberField(row, 'sample_watermark_ms');\n return sampleCount === work.samples.length && watermark === this.sampleWatermark(work);\n }\n\n private sampleWatermark(work: MetricBucketWork): number {\n return work.samples.length === 0\n ? work.bucketStartMs\n : Math.max(...work.samples.map((sample) => sample.occurred_at_ms));\n }\n\n private materializeBucket(work: MetricBucketWork, materializedAtMs: number): number {\n const normalized = this.normalizeSamplesForCardinality(work);\n const groups = this.aggregateSamples(work.definition.measurements, normalized);\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection\n .prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${rollupTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, dimension_key, dimensions_json, values_json,\n materialized_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const [dimensionKey, group] of groups) {\n insert.run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n dimensionKey,\n group.dimensionsJson,\n canonicalJson(group.values),\n materializedAtMs,\n );\n }\n this.options.connection\n .prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'completed', NULL)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'completed',\n detail = NULL`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n materializedAtMs,\n );\n });\n transaction();\n return groups.size;\n }\n\n private recordRejectedBucket(\n work: MetricBucketWork,\n recordedAtMs: number,\n detail: string,\n ): void {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection.prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n this.options.connection.prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'rejected', ?)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'rejected',\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n recordedAtMs,\n detail.slice(0, 1_024),\n );\n });\n transaction();\n }\n\n private rollupStageDetail(\n rejectedBucketCount: number,\n examples: readonly string[],\n workBudgetReached: boolean,\n ): string | null {\n const rejected = rejectedBucketCount === 0\n ? null\n : `cardinality-rejected-buckets=${rejectedBucketCount}; ${examples.join('; ')}`;\n const detail = workBudgetReached\n ? ['work-budget-reached', rejected].filter((value) => value !== null).join('; ')\n : rejected;\n return detail?.slice(0, 2_048) ?? null;\n }\n\n private normalizeSamplesForCardinality(work: MetricBucketWork): NormalizedMetricSample[] {\n const admittedByField = new Map<string, Set<string>>();\n const normalized: NormalizedMetricSample[] = [];\n for (const sample of work.samples) {\n const dimensions = this.rowParser.parseJsonObject(sample.dimensions_json);\n const values = this.rowParser.parseNumericValues(sample.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n const admittedDimensions: Record<string, TelemetryJsonValue> = { ...dimensions.value };\n let dropSample = false;\n for (const field of work.definition.groupBy) {\n const rule = work.definition.cardinality[field];\n if (!rule) {\n throw new Error(`Missing cardinality rule for ${field}`);\n }\n const dimensionValue = admittedDimensions[field];\n const valueKey = canonicalJson(dimensionValue);\n const admittedValues = admittedByField.get(field) ?? new Set<string>();\n if (!admittedValues.has(valueKey) && admittedValues.size >= rule.maxValuesPerBucket) {\n if (rule.overflow === 'other') {\n admittedDimensions[field] = '__telemetry_other__';\n } else if (rule.overflow === 'reject') {\n throw new MetricCardinalityRejectionError(\n `Metric ${work.definition.name} rejected cardinality overflow for ${field}`,\n );\n } else {\n dropSample = true;\n break;\n }\n } else {\n admittedValues.add(valueKey);\n admittedByField.set(field, admittedValues);\n }\n }\n if (dropSample) {\n continue;\n }\n const dimensionsJson = canonicalJson(admittedDimensions);\n normalized.push({\n dimensionKey: dimensionsJson,\n dimensionsJson,\n values: values.value,\n occurredAtMs: sample.occurred_at_ms,\n producerId: sample.producer_id,\n sequence: sample.sequence,\n });\n }\n return normalized;\n }\n\n private aggregateSamples(\n measurements: readonly MetricMeasurement[],\n samples: readonly NormalizedMetricSample[],\n ): Map<string, MutableMaterializedMetricGroup> {\n const groups = new Map<string, MutableMaterializedMetricGroup>();\n const fields = measurements\n .filter((measurement): measurement is Extract<MetricMeasurement, { kind: 'field' }> => {\n return measurement.kind === 'field';\n })\n .map((measurement) => measurement.field);\n for (const sample of samples) {\n const group = groups.get(sample.dimensionKey) ?? {\n dimensionsJson: sample.dimensionsJson,\n values: { count: 0, fields: {} },\n };\n group.values.count += 1;\n for (const field of fields) {\n const measured = sample.values[field];\n if (measured === undefined) {\n continue;\n }\n const aggregate = group.values.fields[field] ?? this.newFieldAggregate(measured, sample);\n aggregate.count += group.values.fields[field] === undefined ? 0 : 1;\n aggregate.sum += group.values.fields[field] === undefined ? 0 : measured;\n aggregate.min = Math.min(aggregate.min, measured);\n aggregate.max = Math.max(aggregate.max, measured);\n aggregate.last = measured;\n aggregate.lastOccurredAtMs = sample.occurredAtMs;\n aggregate.lastProducerId = sample.producerId;\n aggregate.lastSequence = sample.sequence;\n group.values.fields[field] = aggregate;\n }\n groups.set(sample.dimensionKey, group);\n }\n return groups;\n }\n\n private newFieldAggregate(\n measured: number,\n sample: NormalizedMetricSample,\n ): MutableMetricFieldAggregate {\n return {\n count: 1,\n sum: measured,\n min: measured,\n max: measured,\n last: measured,\n lastOccurredAtMs: sample.occurredAtMs,\n lastProducerId: sample.producerId,\n lastSequence: sample.sequence,\n };\n }\n\n /**\n * Raw retention is purely time-based, matching the native collector: every\n * expired row goes in one set-based statement per level band. No page size,\n * no row cap, and no rollup-completion gate — metric samples are extracted at\n * ingest and retained on their own clock, so dropping a raw row costs no\n * metric fidelity, and no row can outlive its window waiting on a rollup.\n */\n private createRawEventRetentionStep(nowMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('rawEvents');\n const levelMs = this.options.retention.levelMs ?? {};\n const levels = Object.keys(levelMs);\n const removeByLevel = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND lower(coalesce(level, '')) = ? AND occurred_at_ms < ?`,\n );\n const fallbackPlaceholders = levels.map(() => '?').join(', ');\n const removeFallback = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?` +\n (levels.length === 0\n ? ''\n : ` AND lower(coalesce(level, '')) NOT IN (${fallbackPlaceholders})`),\n );\n let done = false;\n return (): RetentionStepOutcome => {\n if (done) {\n return { deleted: 0, done: true };\n }\n done = true;\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const level of levels) {\n const retainMs = levelMs[level];\n if (retainMs === undefined) {\n continue;\n }\n deleted += removeByLevel.run(this.options.targetId, level, nowMs - retainMs).changes;\n }\n deleted += removeFallback.run(\n this.options.targetId,\n nowMs - this.options.retention.rawMs,\n ...levels,\n ).changes;\n return deleted;\n });\n return { deleted: transaction(), done: true };\n };\n }\n\n private rawEventHasRequiredRollups(envelope: TelemetryEnvelope): boolean {\n const applicable = [...this.definitions.values()].filter((definition) => {\n return this.definitionContract.matches(definition.selector, envelope.label);\n });\n return applicable.every((definition) => {\n if (!this.metricSampleExists(definition, envelope)) {\n return true;\n }\n return definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(envelope.occurredAtMs, resolutionMs),\n );\n });\n });\n }\n\n private metricSampleExists(definition: MetricDefinition, envelope: TelemetryEnvelope): boolean {\n const table = this.options.tableMap.quoted('metricSamples');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n )\n .get(\n this.options.targetId,\n definition.name,\n definition.version,\n envelope.producerId,\n envelope.sequence,\n );\n return row !== undefined;\n }\n\n private createSampleRetentionStep(nowMs: number): RetentionStep {\n const cutoffMs = nowMs - this.options.retention.samplesMs;\n const table = this.options.tableMap.quoted('metricSamples');\n const readFirstPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const readNextPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n AND (\n occurred_at_ms, metric_name, definition_version, producer_id, sequence\n ) > (?, ?, ?, ?, ?)\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n );\n let cursor: SampleRetentionCursor | null = null;\n return (): RetentionStepOutcome => {\n const rows: unknown[] = cursor === null\n ? readFirstPage.all(this.options.targetId, cutoffMs)\n : readNextPage.all(\n this.options.targetId,\n cutoffMs,\n cursor.occurredAtMs,\n cursor.metricName,\n cursor.definitionVersion,\n cursor.producerId,\n cursor.sequence,\n );\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const samples: MetricSampleRow[] = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const sample of samples) {\n const definition = this.definitions.get(\n this.definitionKey(sample.metric_name, sample.definition_version),\n );\n if (!definition) {\n continue;\n }\n const complete = definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(sample.occurred_at_ms, resolutionMs),\n );\n });\n if (complete) {\n deleted += remove.run(\n this.options.targetId,\n sample.metric_name,\n sample.definition_version,\n sample.producer_id,\n sample.sequence,\n ).changes;\n }\n }\n return deleted;\n });\n const deleted = transaction();\n const last = samples[samples.length - 1];\n if (last === undefined || rows.length < RETENTION_PAGE_SIZE) {\n return { deleted, done: true };\n }\n cursor = {\n occurredAtMs: last.occurred_at_ms,\n metricName: last.metric_name,\n definitionVersion: last.definition_version,\n producerId: last.producer_id,\n sequence: last.sequence,\n };\n return { deleted, done: false };\n };\n }\n\n private createRollupRetentionSteps(nowMs: number): RetentionStep[] {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const steps: RetentionStep[] = [];\n for (const tier of this.options.retention.rollups) {\n const cutoffMs = nowMs - tier.retainMs;\n steps.push(this.createExpiredRollupStep(rollupTable, tier.resolutionMs, cutoffMs, false));\n steps.push(this.createExpiredRollupStep(completionTable, tier.resolutionMs, cutoffMs, true));\n }\n return steps;\n }\n\n private createExpiredRollupStep(\n table: string,\n resolutionMs: number,\n cutoffMs: number,\n completedOnly: boolean,\n ): RetentionStep {\n const statePredicate = completedOnly ? \" AND state = 'completed'\" : '';\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND resolution_ms = ? AND bucket_start_ms < ?${statePredicate}\n ORDER BY bucket_start_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, resolutionMs, cutoffMs).changes,\n );\n }\n\n private createPagedDeleteStep(deletePage: () => number): RetentionStep {\n return (): RetentionStepOutcome => {\n const changes = deletePage();\n return { deleted: changes, done: changes < RETENTION_PAGE_SIZE };\n };\n }\n\n private createAuxiliaryRetentionSteps(nowMs: number): RetentionStep[] {\n const acknowledgementCutoffMs = nowMs - this.acknowledgementRetentionMs();\n const ingestionCutoffMs = nowMs - this.longestRetentionMs();\n const extractionCutoffMs = nowMs - this.options.retention.samplesMs;\n return [\n this.createRowsBeforeStep('batchAcknowledgements', 'committed_at_ms', acknowledgementCutoffMs),\n this.createRowsBeforeStep('extractionFailures', 'recorded_at_ms', extractionCutoffMs),\n this.createFinishedMaintenanceRunStep(acknowledgementCutoffMs),\n ...this.createReaderLeaseSteps(nowMs),\n this.createStaleIngestWatermarkStep(ingestionCutoffMs),\n this.createUnreferencedMetricDefinitionStep(),\n ];\n }\n\n private createRowsBeforeStep(\n logicalTable: 'batchAcknowledgements' | 'extractionFailures',\n timestampColumn: 'committed_at_ms' | 'recorded_at_ms',\n cutoffMs: number,\n ): RetentionStep {\n const table = this.options.tableMap.quoted(logicalTable);\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND ${timestampColumn} < ?\n ORDER BY ${timestampColumn} ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createFinishedMaintenanceRunStep(cutoffMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('completed', 'failed')\n AND COALESCE(completed_at_ms, started_at_ms) < ?\n ORDER BY COALESCE(completed_at_ms, started_at_ms) ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createReaderLeaseSteps(nowMs: number): RetentionStep[] {\n const table = this.options.tableMap.quoted('readerLeases');\n const expire = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'expired'\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state = 'active' AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('released', 'expired')\n AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n return [\n this.createPagedDeleteStep(() => expire.run(this.options.targetId, nowMs).changes),\n this.createPagedDeleteStep(() => remove.run(this.options.targetId, nowMs).changes),\n ];\n }\n\n private createStaleIngestWatermarkStep(cutoffMs: number): RetentionStep {\n const watermarks = this.options.tableMap.quoted('ingestWatermarks');\n const acknowledgements = this.options.tableMap.quoted('batchAcknowledgements');\n const rawEvents = this.options.tableMap.quoted('rawEvents');\n const samples = this.options.tableMap.quoted('metricSamples');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${watermarks}\n WHERE rowid IN (\n SELECT watermark.rowid\n FROM ${watermarks} AS watermark\n WHERE watermark.target_id = ?\n AND watermark.last_occurred_at_ms < ?\n AND watermark.last_committed_at_ms < ?\n AND NOT EXISTS (\n SELECT 1 FROM ${acknowledgements} AS acknowledgement\n WHERE acknowledgement.target_id = watermark.target_id\n AND acknowledgement.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rawEvents} AS raw_event\n WHERE raw_event.target_id = watermark.target_id\n AND raw_event.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = watermark.target_id\n AND sample.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = watermark.target_id\n AND failure.producer_id = watermark.producer_id\n )\n ORDER BY watermark.last_committed_at_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs, cutoffMs).changes,\n );\n }\n\n private createUnreferencedMetricDefinitionStep(): RetentionStep {\n const definitions = this.options.tableMap.quoted('metricDefinitions');\n const samples = this.options.tableMap.quoted('metricSamples');\n const rollups = this.options.tableMap.quoted('metricRollups');\n const completions = this.options.tableMap.quoted('rollupCompletions');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const read = this.options.connection.prepare(\n `SELECT definition.metric_name, definition.definition_version\n FROM ${definitions} AS definition\n WHERE definition.target_id = ? AND definition.active = 0\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = definition.target_id\n AND sample.metric_name = definition.metric_name\n AND sample.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rollups} AS rollup\n WHERE rollup.target_id = definition.target_id\n AND rollup.metric_name = definition.metric_name\n AND rollup.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${completions} AS completion\n WHERE completion.target_id = definition.target_id\n AND completion.metric_name = definition.metric_name\n AND completion.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = definition.target_id\n AND failure.metric_name = definition.metric_name\n AND failure.definition_version = definition.definition_version\n )\n ORDER BY definition.registered_at_ms ASC\n LIMIT 500`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${definitions}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ? AND active = 0`,\n );\n return (): RetentionStepOutcome => {\n const rows = read.all(this.options.targetId).map((row) => ({\n metricName: this.readStringField(row, 'metric_name'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n }));\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const row of rows) {\n deleted += remove.run(\n this.options.targetId,\n row.metricName,\n row.definitionVersion,\n ).changes;\n }\n return deleted;\n });\n const deleted = transaction();\n for (const row of rows) {\n this.definitions.delete(this.definitionKey(row.metricName, row.definitionVersion));\n }\n return { deleted, done: deleted === 0 || rows.length < RETENTION_PAGE_SIZE };\n };\n }\n\n private acknowledgementRetentionMs(): number {\n return this.options.retention.rawMs + this.options.retention.lateArrivalMs;\n }\n\n private longestRetentionMs(): number {\n return Math.max(\n this.options.retention.rawMs,\n this.options.retention.samplesMs,\n ...this.options.retention.rollups.map((tier) => tier.retainMs),\n );\n }\n\n private hasCompletion(\n metricName: string,\n definitionVersion: number,\n resolutionMs: number,\n bucketStartMs: number,\n ): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?\n AND state = 'completed'`,\n )\n .get(this.options.targetId, metricName, definitionVersion, resolutionMs, bucketStartMs);\n return row !== undefined;\n }\n\n private metricDefinitions(metricName: string): MetricDefinition[] {\n return [...this.definitions.values()]\n .filter((definition) => definition.name === metricName)\n .sort((left, right) => left.version - right.version);\n }\n\n private validateMetricQuery(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): string | null {\n const dimensionSets = definitions.map((definition) => new Set(definition.groupBy));\n const invalidDimension = Object.keys(query.where).find((field) => {\n return dimensionSets.some((dimensions) => !dimensions.has(field));\n });\n if (invalidDimension) {\n return `Metric ${query.metric} does not declare dimension ${invalidDimension}`;\n }\n if (query.resolution !== 'auto') {\n const explicitResolution = query.resolution;\n const unavailable = definitions.every(\n (definition) => !definition.resolutionsMs.includes(explicitResolution),\n );\n if (unavailable) {\n return `Resolution ${query.resolution} is not configured for metric ${query.metric}`;\n }\n }\n const invalidMeasurement = query.measurements.find((measurement) => {\n return definitions.some((definition) =>\n !this.definitionHasMeasurement(definition, measurement),\n );\n });\n return invalidMeasurement\n ? `Metric ${query.metric} does not declare measurement ${invalidMeasurement}`\n : null;\n }\n\n private definitionHasMeasurement(definition: MetricDefinition, requested: string): boolean {\n if (requested === 'count') {\n return definition.measurements.some((measurement) => measurement.kind === 'count');\n }\n const [field, aggregate] = requested.split('.');\n if (!field || !aggregate) {\n return false;\n }\n return definition.measurements.some((measurement) => {\n return (\n measurement.kind === 'field' &&\n measurement.field === field &&\n ((aggregate === 'avg' && measurement.aggregates.includes('sum')) ||\n (this.isMetricAggregate(aggregate) && measurement.aggregates.includes(aggregate)))\n );\n });\n }\n\n private planCoverage(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): Readonly<{\n intervals: readonly RollupCoverageInterval[];\n gaps: readonly MetricQueryGap[];\n }> {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `SELECT definition_version, resolution_ms, bucket_start_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ?\n AND state = 'completed'\n AND bucket_start_ms < ?\n AND bucket_start_ms + resolution_ms > ?\n ORDER BY bucket_start_ms ASC, resolution_ms ASC, definition_version DESC`,\n )\n .all(this.options.targetId, query.metric, query.toMs, query.fromMs);\n const definitionVersions = new Set(definitions.map((definition) => definition.version));\n const available = rows\n .map((row) => ({\n fromMs: this.readNumberField(row, 'bucket_start_ms'),\n toMs:\n this.readNumberField(row, 'bucket_start_ms') +\n this.readNumberField(row, 'resolution_ms'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n resolutionMs: this.readNumberField(row, 'resolution_ms'),\n }))\n .filter((row) => {\n return (\n definitionVersions.has(row.definitionVersion) &&\n (query.resolution === 'auto' || row.resolutionMs === query.resolution)\n );\n });\n const intervals: RollupCoverageInterval[] = [];\n for (const definition of definitions) {\n const versionCandidates = available.filter(\n (candidate) => candidate.definitionVersion === definition.version,\n );\n intervals.push(...this.planDefinitionCoverage(query, versionCandidates));\n }\n const orderedIntervals = intervals.sort((left, right) => {\n return (\n left.fromMs - right.fromMs ||\n left.definitionVersion - right.definitionVersion ||\n left.resolutionMs - right.resolutionMs\n );\n });\n return {\n intervals: orderedIntervals,\n gaps: this.coverageGaps(query, orderedIntervals, available),\n };\n }\n\n private planDefinitionCoverage(\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): readonly RollupCoverageInterval[] {\n const contained = candidates.filter((candidate) => {\n return candidate.fromMs >= query.fromMs && candidate.toMs <= query.toMs;\n });\n const intervals: RollupCoverageInterval[] = [];\n let cursor = query.fromMs;\n while (cursor < query.toMs) {\n const starting = contained\n .filter((candidate) => candidate.fromMs === cursor)\n .sort((left, right) => left.resolutionMs - right.resolutionMs);\n const chosen = starting[0];\n if (chosen) {\n this.appendCoverageInterval(intervals, chosen);\n cursor = chosen.toMs;\n continue;\n }\n const nextStart = contained\n .map((candidate) => candidate.fromMs)\n .filter((startMs) => startMs > cursor)\n .sort((left, right) => left - right)[0];\n cursor = nextStart ?? query.toMs;\n }\n return intervals;\n }\n\n private appendCoverageInterval(\n intervals: RollupCoverageInterval[],\n candidate: RollupCoverageInterval,\n ): void {\n const previous = intervals[intervals.length - 1];\n const extendsPrevious =\n previous !== undefined &&\n previous.toMs === candidate.fromMs &&\n previous.resolutionMs === candidate.resolutionMs &&\n previous.definitionVersion === candidate.definitionVersion;\n if (extendsPrevious) {\n intervals[intervals.length - 1] = { ...previous, toMs: candidate.toMs };\n return;\n }\n intervals.push(candidate);\n }\n\n private coverageGaps(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n candidates: readonly RollupCoverageInterval[],\n ): readonly MetricQueryGap[] {\n const coverage = [...intervals].sort(\n (left, right) => left.fromMs - right.fromMs || right.toMs - left.toMs,\n );\n const gaps: MetricQueryGap[] = [];\n let cursor = query.fromMs;\n for (const interval of coverage) {\n if (interval.fromMs > cursor) {\n this.appendSplitCoverageGaps(gaps, cursor, interval.fromMs, query, candidates);\n }\n cursor = Math.max(cursor, interval.toMs);\n }\n if (cursor < query.toMs) {\n this.appendSplitCoverageGaps(gaps, cursor, query.toMs, query, candidates);\n }\n return Object.freeze(gaps);\n }\n\n private appendSplitCoverageGaps(\n gaps: MetricQueryGap[],\n fromMs: number,\n toMs: number,\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): void {\n const partialCandidates = candidates.filter((candidate) => {\n const outsideQuery = candidate.fromMs < query.fromMs || candidate.toMs > query.toMs;\n return outsideQuery && candidate.fromMs < toMs && candidate.toMs > fromMs;\n });\n const boundaries = new Set<number>([fromMs, toMs]);\n for (const candidate of partialCandidates) {\n boundaries.add(Math.max(fromMs, candidate.fromMs));\n boundaries.add(Math.min(toMs, candidate.toMs));\n }\n const ordered = [...boundaries].sort((left, right) => left - right);\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const gapStart = ordered[index];\n const gapEnd = ordered[index + 1];\n if (gapStart === undefined || gapEnd === undefined || gapStart >= gapEnd) {\n continue;\n }\n const isPartialBucket = partialCandidates.some((candidate) => {\n return candidate.fromMs < gapEnd && candidate.toMs > gapStart;\n });\n this.appendMetricGap(gaps, {\n fromMs: gapStart,\n toMs: gapEnd,\n reason: isPartialBucket ? 'partial-bucket' : 'not-materialized',\n });\n }\n }\n\n private appendMetricGap(gaps: MetricQueryGap[], gap: MetricQueryGap): void {\n const previous = gaps[gaps.length - 1];\n if (previous && previous.toMs === gap.fromMs && previous.reason === gap.reason) {\n gaps[gaps.length - 1] = { ...previous, toMs: gap.toMs };\n return;\n }\n gaps.push(gap);\n }\n\n private readRollupsForCoverage(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n ): Array<\n Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>\n > {\n const table = this.options.tableMap.quoted('metricRollups');\n const parsedRows = [];\n for (const interval of intervals) {\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, resolution_ms, bucket_start_ms,\n dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms >= ?\n AND bucket_start_ms + resolution_ms <= ?`,\n )\n .all(\n this.options.targetId,\n query.metric,\n interval.definitionVersion,\n interval.resolutionMs,\n interval.fromMs,\n interval.toMs,\n );\n for (const row of rows) {\n const parsed = this.rowParser.parseMetricRollup(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n const dimensions = this.rowParser.parseJsonObject(parsed.value.dimensions_json);\n const values = this.rowParser.parseRollupValues(parsed.value.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n parsedRows.push({\n bucket: {\n startMs: parsed.value.bucket_start_ms,\n endMs: parsed.value.bucket_start_ms + parsed.value.resolution_ms,\n dimensions: dimensions.value,\n values: this.rollupValuesToJson(values.value),\n },\n resolutionMs: parsed.value.resolution_ms,\n definitionVersion: parsed.value.definition_version,\n dimensionKey: parsed.value.dimension_key,\n });\n }\n }\n return parsedRows;\n }\n\n private rollupValuesToJson(values: MetricRollupValues): TelemetryJsonObject {\n const fields: Record<string, TelemetryJsonValue> = {};\n for (const [field, aggregate] of Object.entries(values.fields)) {\n fields[field] = {\n count: aggregate.count,\n sum: aggregate.sum,\n min: aggregate.min,\n max: aggregate.max,\n last: aggregate.last,\n avg: aggregate.count === 0 ? 0 : aggregate.sum / aggregate.count,\n };\n }\n return Object.freeze({ count: values.count, ...fields });\n }\n\n private selectMeasurements(\n values: TelemetryJsonObject,\n measurements: readonly string[],\n ): TelemetryJsonObject {\n const selected: Record<string, TelemetryJsonValue> = {};\n for (const measurement of measurements) {\n if (measurement === 'count') {\n selected.count = values.count ?? 0;\n continue;\n }\n const [field, aggregate] = measurement.split('.');\n const fieldValues = field ? values[field] : null;\n if (!field || !aggregate) {\n continue;\n }\n if (!this.isJsonObject(fieldValues)) {\n continue;\n }\n const existing = selected[field];\n const selectedField: Record<string, TelemetryJsonValue> = this.isJsonObject(existing)\n ? { ...existing }\n : {};\n const aggregateValue = fieldValues[aggregate];\n if (aggregateValue !== undefined) {\n selectedField[aggregate] = aggregateValue;\n }\n selected[field] = selectedField;\n }\n return Object.freeze(selected);\n }\n\n private matchesWhere(\n dimensions: TelemetryJsonObject,\n where: Readonly<Record<string, MetricDimensionFilter>>,\n ): boolean {\n return Object.entries(where).every(([field, expected]) => {\n const actual = dimensions[field];\n const candidates = Array.isArray(expected) ? expected : [expected];\n return candidates.some((candidate) => canonicalJson(candidate) === canonicalJson(actual));\n });\n }\n\n private compareParsedRollups(\n left: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n right: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): number {\n const direction = order === 'asc' ? 1 : -1;\n return (\n direction *\n this.compareRollupIdentity(\n left.bucket.startMs,\n left.resolutionMs,\n left.definitionVersion,\n left.dimensionKey,\n right.bucket.startMs,\n right.resolutionMs,\n right.definitionVersion,\n right.dimensionKey,\n )\n );\n }\n\n private isAfterMetricCursor(\n row: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n cursor: Readonly<{\n bucketStartMs: number;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): boolean {\n const comparison = this.compareRollupIdentity(\n row.bucket.startMs,\n row.resolutionMs,\n row.definitionVersion,\n row.dimensionKey,\n cursor.bucketStartMs,\n cursor.resolutionMs,\n cursor.definitionVersion,\n cursor.dimensionKey,\n );\n return order === 'asc' ? comparison > 0 : comparison < 0;\n }\n\n private compareRollupIdentity(\n leftStartMs: number,\n leftResolutionMs: number,\n leftDefinitionVersion: number,\n leftDimensionKey: string,\n rightStartMs: number,\n rightResolutionMs: number,\n rightDefinitionVersion: number,\n rightDimensionKey: string,\n ): number {\n return (\n leftStartMs - rightStartMs ||\n leftResolutionMs - rightResolutionMs ||\n leftDefinitionVersion - rightDefinitionVersion ||\n leftDimensionKey.localeCompare(rightDimensionKey)\n );\n }\n\n private rowsToSegments(\n intervals: readonly RollupCoverageInterval[],\n rows: readonly Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>[],\n ): readonly MetricQuerySegment[] {\n return Object.freeze(\n intervals.map((interval) => ({\n fromMs: interval.fromMs,\n toMs: interval.toMs,\n resolutionMs: interval.resolutionMs,\n isAggregated: true as const,\n definitionVersion: interval.definitionVersion,\n buckets: Object.freeze(\n rows\n .filter(\n (row) =>\n row.resolutionMs === interval.resolutionMs &&\n row.definitionVersion === interval.definitionVersion &&\n row.bucket.startMs >= interval.fromMs &&\n row.bucket.endMs <= interval.toMs,\n )\n .map((row) => row.bucket),\n ),\n })),\n );\n }\n\n private committedTargetState(attempts: number): TelemetryAcknowledgement['targetStates'][number] {\n return {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'committed',\n attempts,\n reason: null,\n };\n }\n\n private definitionKey(name: string, version: number): string {\n return `${name}:${version}`;\n }\n\n private normalizeDefinitions(\n definitions: readonly MetricDefinition[],\n ): readonly MetricDefinition[] {\n return definitions.map((definition) => {\n const normalized = this.definitionContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n return normalized.value;\n });\n }\n\n private bucketStart(occurredAtMs: number, resolutionMs: number): number {\n return Math.floor(occurredAtMs / resolutionMs) * resolutionMs;\n }\n\n private encodeCursor(cursor: object): string {\n return Buffer.from(canonicalJson(cursor), 'utf8').toString('base64url');\n }\n\n private readStringField(row: unknown, field: string): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'string') {\n throw new Error(`Expected string field ${field}`);\n }\n return value;\n }\n\n private readNumberField(row: unknown, field: string): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Expected numeric field ${field}`);\n }\n return value;\n }\n\n private parseCommittedDropCounter(row: unknown): TelemetryDropCounter {\n const reason = this.readStringField(row, 'reason');\n const priority = this.readStringField(row, 'priority');\n const count = this.readNumberField(row, 'count');\n if (!this.isDropReason(reason) || !this.isDropPriority(priority)) {\n throw new Error('Stored committed telemetry drop counter identity is invalid');\n }\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new Error('Stored committed telemetry drop counter value is invalid');\n }\n return Object.freeze({ reason, priority, count });\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n\n private isJsonObject(value: TelemetryJsonValue | undefined): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private isMetricAggregate(value: string): value is MetricAggregate {\n return value === 'sum' || value === 'min' || value === 'max' || value === 'last';\n }\n\n private isDropReason(value: string): value is TelemetryDropCounter['reason'] {\n return (\n value === 'capacity' ||\n value === 'sampled' ||\n value === 'stopped' ||\n value === 'invalid' ||\n value === 'transport'\n );\n }\n\n private isDropPriority(value: string): value is TelemetryDropCounter['priority'] {\n return value === 'low' || value === 'normal' || value === 'high';\n }\n}\n","import { z } from 'zod';\n\nconst integer = z.number().int();\n\nexport const RawTelemetryEventRowSchema = z\n .object({\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n event_id: z.string(),\n occurred_at_ms: integer,\n monotonic_ns: z.string().nullable(),\n source: z.string(),\n process_kind: z.string(),\n level: z.string(),\n label: z.string(),\n conversation_id: z.string().nullable(),\n conversation_id_kind: z.enum(['string', 'number']).nullable(),\n correlation_id: z.string().nullable(),\n metadata_json: z.string(),\n schema_version: integer.positive(),\n })\n .strict();\n\nexport type RawTelemetryEventRow = z.infer<typeof RawTelemetryEventRowSchema>;\n\nexport const BatchAcknowledgementRowSchema = z\n .object({\n idempotency_key: z.string(),\n producer_id: z.string(),\n sequence_start: integer.nonnegative(),\n sequence_end: integer.nonnegative(),\n schema_version: integer.positive(),\n checksum: z.string(),\n accepted_events: integer.nonnegative(),\n committed_at_ms: integer,\n })\n .strict();\n\nexport type BatchAcknowledgementRow = z.infer<typeof BatchAcknowledgementRowSchema>;\n\nexport const MetricSampleRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n occurred_at_ms: integer,\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricSampleRow = z.infer<typeof MetricSampleRowSchema>;\n\nexport const MetricRollupRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricRollupRow = z.infer<typeof MetricRollupRowSchema>;\n\nexport const RollupCompletionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n sample_count: integer.nonnegative(),\n sample_watermark_ms: integer,\n completed_at_ms: integer,\n state: z.enum(['completed', 'rejected']),\n detail: z.string().nullable(),\n })\n .strict();\n\nexport type RollupCompletionRow = z.infer<typeof RollupCompletionRowSchema>;\n\nexport const TimelineCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n occurredAtMs: integer,\n producerId: z.string(),\n sequence: integer.nonnegative(),\n })\n .strict();\n\nexport type TimelineCursor = z.infer<typeof TimelineCursorSchema>;\n\nexport const MetricCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n bucketStartMs: integer,\n resolutionMs: integer.positive(),\n definitionVersion: integer.positive(),\n dimensionKey: z.string(),\n })\n .strict();\n\nexport type MetricCursor = z.infer<typeof MetricCursorSchema>;\n\nexport const TelemetryJsonObjectSchema = z.record(z.string(), z.json());\nexport const NumericValuesSchema = z.record(z.string(), z.number().finite());\n\nconst StoredMetricMeasurementSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('count') }).strict(),\n z\n .object({\n kind: z.literal('field'),\n field: z.string().min(1),\n aggregates: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nexport const StoredMetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: integer.positive(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)),\n measurements: z.array(StoredMetricMeasurementSchema).min(1),\n cardinality: z.record(\n z.string(),\n z\n .object({\n maxValuesPerBucket: integer.positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict(),\n ),\n targetIds: z.array(z.string().min(1)),\n resolutionsMs: z.array(integer.positive()).min(1),\n missingField: z.enum(['skip', 'record-failure']),\n })\n .strict();\n\nexport const StoredMetricDefinitionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n definition_json: z.string(),\n definition_checksum: z.string(),\n active: integer.min(0).max(1),\n })\n .strict();\n\nexport const MetricRollupValuesSchema = z\n .object({\n count: integer.nonnegative(),\n fields: z.record(\n z.string(),\n z\n .object({\n count: integer.nonnegative(),\n sum: z.number().finite(),\n min: z.number().finite(),\n max: z.number().finite(),\n last: z.number().finite(),\n lastOccurredAtMs: integer,\n lastProducerId: z.string(),\n lastSequence: integer.nonnegative(),\n })\n .strict(),\n ),\n })\n .strict();\n","import type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject } from '../core/types/json.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n MetricCursorSchema,\n MetricRollupRowSchema,\n MetricRollupValuesSchema,\n MetricSampleRowSchema,\n NumericValuesSchema,\n RawTelemetryEventRowSchema,\n TelemetryJsonObjectSchema,\n TimelineCursorSchema,\n type MetricCursor,\n type MetricRollupRow,\n type MetricSampleRow,\n type TimelineCursor,\n} from './schema/telemetry_repository_rows.js';\nimport type { MetricRollupValues } from '../core/types/metric.types.js';\n\nexport class TelemetryRepositoryRowParser {\n parseRawEnvelope(input: unknown): TelemetryResult<TelemetryEnvelope, string> {\n const parsed = RawTelemetryEventRowSchema.safeParse(input);\n if (!parsed.success) {\n return { ok: false, error: parsed.error.message };\n }\n const metadata = this.parseJsonObject(parsed.data.metadata_json);\n if (!metadata.ok) {\n return metadata;\n }\n const conversationId = this.parseConversationId(\n parsed.data.conversation_id,\n parsed.data.conversation_id_kind,\n );\n if (!conversationId.ok) {\n return conversationId;\n }\n return {\n ok: true,\n value: Object.freeze({\n schemaVersion: parsed.data.schema_version,\n eventId: parsed.data.event_id,\n producerId: parsed.data.producer_id,\n sequence: parsed.data.sequence,\n occurredAtMs: parsed.data.occurred_at_ms,\n monotonicNs: parsed.data.monotonic_ns,\n source: parsed.data.source,\n processKind: parsed.data.process_kind,\n level: parsed.data.level,\n label: parsed.data.label,\n conversationId: conversationId.value,\n correlationId: parsed.data.correlation_id,\n metadata: metadata.value,\n }),\n };\n }\n\n parseMetricSample(input: unknown): TelemetryResult<MetricSampleRow, string> {\n const parsed = MetricSampleRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseMetricRollup(input: unknown): TelemetryResult<MetricRollupRow, string> {\n const parsed = MetricRollupRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseJsonObject(input: string): TelemetryResult<TelemetryJsonObject, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = TelemetryJsonObjectSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseNumericValues(input: string): TelemetryResult<Readonly<Record<string, number>>, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = NumericValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseRollupValues(input: string): TelemetryResult<MetricRollupValues, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = MetricRollupValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseTimelineCursor(input: string): TelemetryResult<TimelineCursor, string> {\n return this.parseCursor(input, TimelineCursorSchema);\n }\n\n parseMetricCursor(input: string): TelemetryResult<MetricCursor, string> {\n return this.parseCursor(input, MetricCursorSchema);\n }\n\n private parseCursor<T>(input: string, schema: { safeParse(value: unknown): { success: true; data: T } | { success: false; error: Error } }): TelemetryResult<T, string> {\n try {\n const decodedText = Buffer.from(input, 'base64url').toString('utf8');\n const decoded: unknown = JSON.parse(decodedText);\n const parsed = schema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n private parseConversationId(\n value: string | null,\n kind: 'string' | 'number' | null,\n ): TelemetryResult<string | number | null, string> {\n if (value === null) {\n return { ok: true, value: null };\n }\n if (kind === 'string') {\n return { ok: true, value };\n }\n if (kind === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric)\n ? { ok: true, value: numeric }\n : { ok: false, error: `Invalid numeric conversation id ${value}` };\n }\n return { ok: false, error: 'Conversation id kind is missing' };\n }\n}\n","import { z } from 'zod';\n\nexport const TelemetrySchemaManifestRowSchema = z.object({\n target_id: z.string(),\n format_version: z.number().int().positive(),\n mapping_json: z.string(),\n mapping_checksum: z.string(),\n state: z.enum(['ready', 'renaming']),\n pending_mapping_json: z.string().nullable(),\n updated_at_ms: z.number().int(),\n}).strict();\n\nexport type TelemetrySchemaManifestRow = z.infer<typeof TelemetrySchemaManifestRowSchema>;\n","export type ReadOnlySqlKind = 'select' | 'with' | 'explain-query-plan' | 'pragma';\n\nexport type ReadOnlySqlStatement = Readonly<{\n sql: string;\n kind: ReadOnlySqlKind;\n}>;\n\ntype SqlToken = Readonly<{ value: string; position: number }>;\n\nconst MUTATION_KEYWORDS = new Set([\n 'INSERT',\n 'UPDATE',\n 'DELETE',\n 'REPLACE',\n 'CREATE',\n 'ALTER',\n 'DROP',\n 'ATTACH',\n 'DETACH',\n 'VACUUM',\n 'REINDEX',\n 'ANALYZE',\n 'BEGIN',\n 'COMMIT',\n 'ROLLBACK',\n 'SAVEPOINT',\n 'RELEASE',\n 'END',\n]);\n\nconst READ_ONLY_PRAGMAS = new Set([\n 'TABLE_INFO',\n 'TABLE_XINFO',\n 'INDEX_LIST',\n 'INDEX_INFO',\n 'INDEX_XINFO',\n 'FOREIGN_KEY_LIST',\n 'DATABASE_LIST',\n 'COMPILE_OPTIONS',\n 'SCHEMA_VERSION',\n 'USER_VERSION',\n 'QUICK_CHECK',\n 'INTEGRITY_CHECK',\n]);\n\nconst PARAMETERIZED_READ_ONLY_PRAGMAS = new Set([\n 'TABLE_INFO',\n 'TABLE_XINFO',\n 'INDEX_LIST',\n 'INDEX_INFO',\n 'INDEX_XINFO',\n 'FOREIGN_KEY_LIST',\n 'QUICK_CHECK',\n 'INTEGRITY_CHECK',\n]);\n\nexport class ReadOnlySqlGuard {\n validate(source: string): ReadOnlySqlStatement {\n const { tokens, semicolons } = this.scan(source);\n if (tokens.length === 0) {\n throw new Error('Diagnostic SQL cannot be empty');\n }\n const sql = this.singleStatement(source, tokens, semicolons);\n const values = tokens.map((token) => token.value);\n const mutation = values.find((token) => MUTATION_KEYWORDS.has(token));\n if (mutation !== undefined) {\n throw new Error(`Diagnostic SQL cannot contain ${mutation}`);\n }\n const first = values[0];\n if (first === 'SELECT') {\n return Object.freeze({ sql, kind: 'select' });\n }\n if (first === 'WITH') {\n return Object.freeze({ sql, kind: 'with' });\n }\n if (\n first === 'EXPLAIN' &&\n values[1] === 'QUERY' &&\n values[2] === 'PLAN' &&\n (values[3] === 'SELECT' || values[3] === 'WITH')\n ) {\n return Object.freeze({ sql, kind: 'explain-query-plan' });\n }\n if (first === 'PRAGMA') {\n return this.validatePragma(sql, values);\n }\n throw new Error(\n 'Diagnostic SQL must be SELECT, read-only WITH, EXPLAIN QUERY PLAN, or an allowlisted PRAGMA',\n );\n }\n\n private validatePragma(sql: string, tokens: readonly string[]): ReadOnlySqlStatement {\n const pragma = tokens[1];\n if (pragma === undefined || !READ_ONLY_PRAGMAS.has(pragma)) {\n throw new Error(`PRAGMA ${pragma ?? '<missing>'} is not allowed`);\n }\n if (\n tokens.includes('=') ||\n (tokens.includes('(') && !PARAMETERIZED_READ_ONLY_PRAGMAS.has(pragma))\n ) {\n throw new Error('Diagnostic PRAGMA assignments are not allowed');\n }\n return Object.freeze({ sql, kind: 'pragma' });\n }\n\n private singleStatement(\n source: string,\n tokens: readonly SqlToken[],\n semicolons: readonly number[],\n ): string {\n if (semicolons.length > 1) {\n throw new Error('Diagnostic SQL accepts exactly one statement');\n }\n const semicolon = semicolons[0];\n if (semicolon === undefined) {\n return source.trim();\n }\n if (tokens.some((token) => token.position > semicolon)) {\n throw new Error('Diagnostic SQL accepts exactly one statement');\n }\n return source.slice(0, semicolon).trim();\n }\n\n private scan(source: string): Readonly<{\n tokens: readonly SqlToken[];\n semicolons: readonly number[];\n }> {\n const tokens: SqlToken[] = [];\n const semicolons: number[] = [];\n let index = 0;\n while (index < source.length) {\n const character = source[index] ?? '';\n const next = source[index + 1] ?? '';\n if (/\\s/.test(character)) {\n index += 1;\n } else if (character === '-' && next === '-') {\n index = this.skipLineComment(source, index + 2);\n } else if (character === '/' && next === '*') {\n index = this.skipBlockComment(source, index + 2);\n } else if (character === \"'\" || character === '\"' || character === '`') {\n index = this.skipQuoted(source, index, character);\n } else if (character === '[') {\n index = this.skipBracketIdentifier(source, index + 1);\n } else if (character === ';') {\n semicolons.push(index);\n index += 1;\n } else if (/[A-Za-z_]/.test(character)) {\n const start = index;\n index += 1;\n while (/[A-Za-z0-9_]/.test(source[index] ?? '')) {\n index += 1;\n }\n tokens.push({ value: source.slice(start, index).toUpperCase(), position: start });\n } else {\n tokens.push({ value: character, position: index });\n index += 1;\n }\n }\n return Object.freeze({\n tokens: Object.freeze(tokens),\n semicolons: Object.freeze(semicolons),\n });\n }\n\n private skipLineComment(source: string, index: number): number {\n const newline = source.indexOf('\\n', index);\n return newline < 0 ? source.length : newline + 1;\n }\n\n private skipBlockComment(source: string, index: number): number {\n const end = source.indexOf('*/', index);\n if (end < 0) {\n throw new Error('Diagnostic SQL has an unterminated block comment');\n }\n return end + 2;\n }\n\n private skipQuoted(source: string, opening: number, quote: string): number {\n let index = opening + 1;\n while (index < source.length) {\n if (source[index] === quote) {\n if (source[index + 1] === quote) {\n index += 2;\n continue;\n }\n return index + 1;\n }\n index += 1;\n }\n throw new Error('Diagnostic SQL has an unterminated quoted value');\n }\n\n private skipBracketIdentifier(source: string, index: number): number {\n const end = source.indexOf(']', index);\n if (end < 0) {\n throw new Error('Diagnostic SQL has an unterminated bracket identifier');\n }\n return end + 1;\n }\n}\n","export type TelemetryCliCommandKind =\n | 'help'\n | 'timeline-query'\n | 'metrics-query'\n | 'metrics-graph'\n | 'sqlite-query'\n | 'sqlite-migration-status'\n | 'sqlite-migration-up';\n\nexport type ParsedTelemetryCliCommand = Readonly<{\n kind: TelemetryCliCommandKind;\n options: ReadonlyMap<string, readonly string[]>;\n}>;\n\nconst COMMON_QUERY_OPTIONS = [\n 'config',\n 'target',\n 'from',\n 'to',\n 'order',\n 'limit',\n 'cursor',\n 'format',\n 'timezone',\n 'storage-base',\n] as const;\n\nconst ALLOWED_OPTIONS: Readonly<Record<TelemetryCliCommandKind, ReadonlySet<string>>> =\n Object.freeze({\n help: new Set<string>(),\n 'timeline-query': new Set([\n ...COMMON_QUERY_OPTIONS,\n 'label',\n 'conversation-id',\n 'source',\n 'level',\n 'producer-id',\n 'correlation-id',\n ]),\n 'metrics-query': new Set([\n ...COMMON_QUERY_OPTIONS,\n 'metric',\n 'where',\n 'measurement',\n 'resolution',\n ]),\n 'metrics-graph': new Set([\n ...COMMON_QUERY_OPTIONS,\n 'metric',\n 'where',\n 'measurement',\n 'resolution',\n 'type',\n 'output',\n 'width',\n 'height',\n 'max-series',\n 'max-points',\n ]),\n 'sqlite-query': new Set([\n 'config',\n 'target',\n 'storage-base',\n 'sql',\n 'param',\n 'format',\n 'limit',\n 'max-duration',\n ]),\n 'sqlite-migration-status': new Set(['config', 'target', 'storage-base', 'format']),\n 'sqlite-migration-up': new Set(['config', 'target', 'storage-base', 'format']),\n });\n\nconst REPEATABLE_OPTIONS = new Set(['where', 'measurement', 'param']);\n\nconst COMMANDS: readonly Readonly<{\n tokens: readonly string[];\n kind: TelemetryCliCommandKind;\n}>[] = Object.freeze([\n { tokens: ['timeline', 'query'], kind: 'timeline-query' },\n { tokens: ['metrics', 'query'], kind: 'metrics-query' },\n { tokens: ['metrics', 'graph'], kind: 'metrics-graph' },\n { tokens: ['sqlite', 'query'], kind: 'sqlite-query' },\n { tokens: ['sqlite', 'migration', 'status'], kind: 'sqlite-migration-status' },\n { tokens: ['sqlite', 'migration', 'up'], kind: 'sqlite-migration-up' },\n]);\n\nexport class TelemetryCliUsageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TelemetryCliUsageError';\n }\n}\n\nexport class TelemetryCliArguments {\n parse(argv: readonly string[]): ParsedTelemetryCliCommand {\n const { kind, optionStart } = this.command(argv);\n const options = this.options(argv.slice(optionStart), ALLOWED_OPTIONS[kind]);\n return Object.freeze({ kind, options });\n }\n\n private command(argv: readonly string[]): Readonly<{\n kind: TelemetryCliCommandKind;\n optionStart: number;\n }> {\n if (argv.length === 0 || argv[0] === 'help' || argv[0] === '--help') {\n return { kind: 'help', optionStart: argv.length };\n }\n const matched = COMMANDS.find((candidate) =>\n candidate.tokens.every((token, index) => argv[index] === token),\n );\n if (matched !== undefined) {\n return { kind: matched.kind, optionStart: matched.tokens.length };\n }\n if (argv.slice(0, 3).join(' ') === 'sqlite schema rename') {\n throw new TelemetryCliUsageError(\n 'sqlite schema rename is unavailable until manifest-backed recovery is implemented',\n );\n }\n throw new TelemetryCliUsageError(`Unknown telemetry command: ${argv.join(' ')}`);\n }\n\n private options(\n argv: readonly string[],\n allowed: ReadonlySet<string>,\n ): ReadonlyMap<string, readonly string[]> {\n const parsed = new Map<string, string[]>();\n for (let index = 0; index < argv.length; index += 2) {\n const token = argv[index];\n const value = argv[index + 1];\n if (token === undefined || !token.startsWith('--') || token.length === 2) {\n throw new TelemetryCliUsageError(\n `Expected a --named option, received ${token ?? '<missing>'}`,\n );\n }\n const name = token.slice(2);\n if (!allowed.has(name)) {\n throw new TelemetryCliUsageError(`Unknown option --${name}`);\n }\n if (value === undefined || value.startsWith('--')) {\n throw new TelemetryCliUsageError(`Option --${name} requires a value`);\n }\n const existing = parsed.get(name) ?? [];\n if (existing.length > 0 && !REPEATABLE_OPTIONS.has(name)) {\n throw new TelemetryCliUsageError(`Option --${name} may only be provided once`);\n }\n existing.push(value);\n parsed.set(name, existing);\n }\n return new Map([...parsed.entries()].map(([name, values]) => [name, Object.freeze(values)]));\n }\n}\n","import type { MetricQueryResponse, TimelineQueryResponse } from '../../core/types/query.types.js';\nimport type {\n TelemetryCliDiagnosticResult,\n TelemetryCliMigrationStatus,\n TelemetryCliStructuredFormat,\n} from '../types/telemetry_cli.types.js';\n\nexport class TelemetryCliFormatter {\n timeline(\n response: TimelineQueryResponse,\n format: TelemetryCliStructuredFormat,\n timezone: string,\n ): string {\n if (format === 'json') {\n return this.json(response);\n }\n if (format === 'jsonl') {\n const records = [\n ...response.events.map((event) => ({ kind: 'event', targetId: response.targetId, event })),\n ...response.gaps.map((gap) => ({ kind: 'gap', targetId: response.targetId, gap })),\n { kind: 'page', targetId: response.targetId, nextCursor: response.nextCursor },\n ];\n return this.jsonLines(records);\n }\n if (format === 'csv') {\n const rows = [\n ...response.events.map((event) => [\n 'event',\n response.targetId,\n event.occurredAtMs,\n '',\n event.producerId,\n event.sequence,\n event.level,\n event.label,\n event.conversationId ?? '',\n JSON.stringify(event.metadata),\n '',\n ]),\n ...response.gaps.map((gap) => [\n 'gap',\n response.targetId,\n gap.fromMs,\n gap.toMs,\n '',\n '',\n '',\n '',\n '',\n '',\n gap.reason,\n ]),\n ['page', response.targetId, '', '', '', '', '', '', '', '', response.nextCursor ?? ''],\n ];\n return this.csv(\n [\n 'kind',\n 'targetId',\n 'fromMs',\n 'toMs',\n 'producerId',\n 'sequence',\n 'level',\n 'label',\n 'conversationId',\n 'metadata',\n 'detail',\n ],\n rows,\n );\n }\n const lines = [\n `Target: ${response.targetId}`,\n 'occurredAt\\tlevel\\tlabel\\tconversationId\\tproducerId\\tsequence',\n ...response.events.map((event) =>\n [\n this.timestamp(event.occurredAtMs, timezone),\n event.level,\n event.label,\n event.conversationId ?? '',\n event.producerId,\n event.sequence,\n ].join('\\t'),\n ),\n ...response.gaps.map(\n (gap) =>\n `GAP\\t${this.timestamp(gap.fromMs, timezone)} -> ${this.timestamp(gap.toMs, timezone)}\\t${gap.reason}`,\n ),\n `Next cursor: ${response.nextCursor ?? 'none'}`,\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n metrics(\n response: MetricQueryResponse,\n format: TelemetryCliStructuredFormat,\n timezone: string,\n ): string {\n if (format === 'json') {\n return this.json(response);\n }\n const buckets = response.segments.flatMap((segment) =>\n segment.buckets.map((bucket) => ({\n targetId: response.targetId,\n metric: response.metric,\n definitionVersion: segment.definitionVersion,\n resolutionMs: segment.resolutionMs,\n bucket,\n })),\n );\n if (format === 'jsonl') {\n const records = [\n ...buckets.map((bucket) => ({ kind: 'bucket', ...bucket })),\n ...response.gaps.map((gap) => ({ kind: 'gap', targetId: response.targetId, gap })),\n ...response.partialFailures.map((failure) => ({ kind: 'partial-failure', failure })),\n { kind: 'page', targetId: response.targetId, nextCursor: response.nextCursor },\n ];\n return this.jsonLines(records);\n }\n if (format === 'csv') {\n return this.csv(\n [\n 'kind',\n 'targetId',\n 'metric',\n 'definitionVersion',\n 'resolutionMs',\n 'startMs',\n 'endMs',\n 'dimensions',\n 'values',\n 'detail',\n ],\n [\n ...buckets.map((entry) => [\n 'bucket',\n entry.targetId,\n entry.metric,\n entry.definitionVersion,\n entry.resolutionMs,\n entry.bucket.startMs,\n entry.bucket.endMs,\n JSON.stringify(entry.bucket.dimensions),\n JSON.stringify(entry.bucket.values),\n '',\n ]),\n ...response.gaps.map((gap) => [\n 'gap',\n response.targetId,\n response.metric,\n '',\n '',\n gap.fromMs,\n gap.toMs,\n '',\n '',\n gap.reason,\n ]),\n ...response.partialFailures.map((failure) => [\n 'partial-failure',\n failure.targetId,\n response.metric,\n '',\n '',\n '',\n '',\n '',\n '',\n failure.reason,\n ]),\n [\n 'page',\n response.targetId,\n response.metric,\n '',\n '',\n '',\n '',\n '',\n '',\n response.nextCursor ?? '',\n ],\n ],\n );\n }\n const lines = [\n `Target: ${response.targetId}`,\n `Metric: ${response.metric}`,\n 'start\\tend\\tresolutionMs\\tdefinition\\tdimensions\\tvalues',\n ...buckets.map((entry) =>\n [\n this.timestamp(entry.bucket.startMs, timezone),\n this.timestamp(entry.bucket.endMs, timezone),\n entry.resolutionMs,\n entry.definitionVersion,\n JSON.stringify(entry.bucket.dimensions),\n JSON.stringify(entry.bucket.values),\n ].join('\\t'),\n ),\n ...response.gaps.map(\n (gap) =>\n `GAP\\t${this.timestamp(gap.fromMs, timezone)} -> ${this.timestamp(gap.toMs, timezone)}\\t${gap.reason}`,\n ),\n ...response.partialFailures.map(\n (failure) => `PARTIAL\\t${failure.targetId}\\t${failure.reason}`,\n ),\n `Next cursor: ${response.nextCursor ?? 'none'}`,\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n diagnostic(result: TelemetryCliDiagnosticResult, format: TelemetryCliStructuredFormat): string {\n if (format === 'json') {\n return this.json(result);\n }\n if (format === 'jsonl') {\n return this.jsonLines(result.rows);\n }\n if (format === 'csv') {\n return this.csv(\n result.columns,\n result.rows.map((row) => result.columns.map((column) => row[column] ?? '')),\n );\n }\n const lines = [\n result.columns.join('\\t'),\n ...result.rows.map((row) =>\n result.columns.map((column) => this.cell(row[column])).join('\\t'),\n ),\n `Rows: ${result.rows.length}${result.truncated ? ' (truncated)' : ''}; elapsedMs=${result.elapsedMs}`,\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n migrations(result: TelemetryCliMigrationStatus, format: 'table' | 'json'): string {\n if (format === 'json') {\n return this.json(result);\n }\n return [\n `Target: ${result.targetId}`,\n `Completed (${result.completed.length}): ${result.completed.join(', ') || 'none'}`,\n `Pending (${result.pending.length}): ${result.pending.join(', ') || 'none'}`,\n '',\n ].join('\\n');\n }\n\n private json(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n }\n\n private jsonLines(values: readonly unknown[]): string {\n return values.length === 0\n ? ''\n : `${values.map((value) => JSON.stringify(value)).join('\\n')}\\n`;\n }\n\n private csv(columns: readonly string[], rows: readonly (readonly unknown[])[]): string {\n const lines = [\n columns.map((column) => this.csvCell(column)).join(','),\n ...rows.map((row) => row.map((value) => this.csvCell(value)).join(',')),\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n private csvCell(value: unknown): string {\n const text = this.cell(value);\n return `\"${text.replaceAll('\"', '\"\"')}\"`;\n }\n\n private cell(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value).replace(/[\\r\\n\\t]/g, ' ');\n }\n\n private timestamp(value: number, timezone: string): string {\n if (timezone === 'UTC') {\n return new Date(value).toISOString();\n }\n return new Intl.DateTimeFormat('en-CA', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23',\n timeZoneName: 'short',\n }).format(value);\n }\n}\n"],"mappings":"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","names":["import_node_fs","loadYaml","key","import_node_crypto","import_node_path","import_node_fs","import_node_path","import_zod","deleted","import_zod","BetterSqlite3"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/telemetry_cli.ts","../../src/platform/node/telemetry_configuration_parser.ts","../../src/core/metric_definition_contract.ts","../../src/core/helper/canonical_json.ts","../../src/storage/helper/sqlite_table_names.ts","../../src/storage/telemetry_table_map.ts","../../src/platform/node/helper/telemetry_duration_parser.ts","../../src/platform/node/schema/telemetry_configuration_schema.ts","../../src/cli/metric_graph_renderer.ts","../../src/cli/history_metric_reader.ts","../../src/cli/offline_sqlite_session.ts","../../src/storage/sqlite_ownership_lease.ts","../../src/storage/telemetry_proper_sql_runner.ts","../../src/storage/telemetry_repository.ts","../../src/storage/schema/telemetry_repository_rows.ts","../../src/storage/telemetry_repository_row_parser.ts","../../src/transports/schema/telemetry_schema_manifest.ts","../../src/cli/helper/read_only_sql_guard.ts","../../src/cli/helper/telemetry_cli_arguments.ts","../../src/cli/helper/telemetry_cli_formatter.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs';\nimport type {\n ResolvedTelemetryConfiguration,\n SqliteTargetConfiguration,\n} from '../core/types/configuration.types.js';\nimport type {\n MetricDimensionFilter,\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n NodeTelemetryConfigurationParser,\n TelemetryConfigurationError,\n} from '../platform/node/telemetry_configuration_parser.js';\nimport { TelemetryDurationParser } from '../platform/node/helper/telemetry_duration_parser.js';\nimport {\n MetricGraphRenderer,\n type MetricGraphFormat,\n type MetricGraphType,\n} from './metric_graph_renderer.js';\nimport { HistoryMetricReader, historyDatabasePath } from './history_metric_reader.js';\nimport { OfflineSqliteTelemetrySession } from './offline_sqlite_session.js';\nimport {\n TelemetryCliArguments,\n TelemetryCliUsageError,\n type ParsedTelemetryCliCommand,\n} from './helper/telemetry_cli_arguments.js';\nimport { TelemetryCliFormatter } from './helper/telemetry_cli_formatter.js';\nimport type {\n TelemetryCliOptions,\n TelemetryCliSession,\n TelemetryCliSessionFactory,\n TelemetryCliSessionMode,\n TelemetryCliStructuredFormat,\n} from './types/telemetry_cli.types.js';\n\nconst MAX_DIAGNOSTIC_DURATION_MS = 30_000;\n\n/** Answers one metric query from whichever store `--source` selected. */\ntype MetricRunner = (\n query: MetricQuery,\n) => Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>>;\n\nexport class TelemetryCli {\n private readonly configurationParser: NodeTelemetryConfigurationParser;\n private readonly argumentsParser = new TelemetryCliArguments();\n private readonly formatter = new TelemetryCliFormatter();\n private readonly graphRenderer = new MetricGraphRenderer();\n private readonly durations = new TelemetryDurationParser();\n private readonly createSession: TelemetryCliSessionFactory;\n private readonly stdout: (text: string) => void;\n private readonly stderr: (text: string) => void;\n private readonly writeOutputFile: (path: string, content: string) => void;\n private readonly now: () => number;\n private activeSession: TelemetryCliSession | null = null;\n\n constructor(options: TelemetryCliOptions = {}) {\n this.configurationParser =\n options.configurationParser ?? new NodeTelemetryConfigurationParser();\n this.stdout = options.stdout ?? ((text) => process.stdout.write(text));\n this.stderr = options.stderr ?? ((text) => process.stderr.write(text));\n this.writeOutputFile =\n options.writeOutputFile ?? ((path, content) => writeFileSync(path, content, 'utf8'));\n this.now = options.now ?? (() => Date.now());\n this.createSession =\n options.createSession ??\n ((configuration, target, mode) =>\n OfflineSqliteTelemetrySession.create(target, mode, configuration.metrics, this.now));\n }\n\n async run(argv: readonly string[]): Promise<number> {\n try {\n return await this.execute(argv);\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n this.stderr(`telemetry: ${message}\\n`);\n return cause instanceof TelemetryCliUsageError || cause instanceof TelemetryConfigurationError\n ? 2\n : 1;\n }\n }\n\n async shutdown(): Promise<void> {\n await this.activeSession?.close();\n this.activeSession = null;\n }\n\n private async execute(argv: readonly string[]): Promise<number> {\n const command = this.argumentsParser.parse(argv);\n if (command.kind === 'help') {\n this.stdout(this.help());\n return 0;\n }\n const configurationPath = this.requiredOption(command, 'config');\n const storageBaseDirectory = this.optionalOption(command, 'storage-base');\n const configuration = this.configurationParser.parseFile(\n configurationPath,\n storageBaseDirectory === null ? {} : { storageBaseDirectory },\n );\n const target = this.resolveTarget(configuration, this.optionalOption(command, 'target'));\n if (this.metricSource(command, target) === 'history') {\n await this.executeHistoryMetrics(command, target, configuration);\n return 0;\n }\n const mode = this.sessionMode(command);\n const session = await this.createSession(configuration, target, mode);\n this.activeSession = session;\n try {\n await this.executeCommand(command, target, session);\n return 0;\n } finally {\n await session.close();\n if (this.activeSession === session) {\n this.activeSession = null;\n }\n }\n }\n\n /**\n * Which store answers a metric command. `history` is the projector's\n * pre-aggregated buckets (history.db, current whenever the app runs with\n * ingest-time extraction off); `legacy` is the collector's own rollups in\n * telemetry.db. `auto` prefers history.db when it exists beside the target —\n * since ingestion moved to the projector the legacy rollups stopped\n * advancing, so answering from them silently reports stale gaps.\n */\n private metricSource(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): 'history' | 'legacy' {\n if (command.kind !== 'metrics-query' && command.kind !== 'metrics-graph') return 'legacy';\n const requested = this.optionalOption(command, 'source') ?? 'auto';\n if (requested === 'history' || requested === 'legacy') return requested;\n if (requested !== 'auto') {\n throw new TelemetryCliUsageError('--source must be auto, history, or legacy');\n }\n return HistoryMetricReader.exists(historyDatabasePath(target)) ? 'history' : 'legacy';\n }\n\n private async executeHistoryMetrics(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n configuration: ResolvedTelemetryConfiguration,\n ): Promise<void> {\n const databasePath = historyDatabasePath(target);\n if (!HistoryMetricReader.exists(databasePath)) {\n throw new TelemetryCliUsageError(`No projector history store at ${databasePath}`);\n }\n const reader = HistoryMetricReader.open(databasePath, configuration.metrics);\n try {\n const run = async (query: MetricQuery) => reader.metrics(query, target.targetId);\n if (command.kind === 'metrics-graph') {\n await this.metricGraph(command, target, run);\n } else {\n await this.metricQuery(command, target, run);\n }\n } finally {\n reader.close();\n }\n }\n\n private async executeCommand(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n if (command.kind === 'timeline-query') {\n await this.timelineQuery(command, target, session);\n return;\n }\n if (command.kind === 'metrics-query') {\n await this.metricQuery(command, target, (query) => session.metrics(query));\n return;\n }\n if (command.kind === 'metrics-graph') {\n await this.metricGraph(command, target, (query) => session.metrics(query));\n return;\n }\n if (command.kind === 'sqlite-query') {\n await this.sqliteQuery(command, target, session);\n return;\n }\n if (command.kind === 'sqlite-compact') {\n await this.sqliteCompact(command, target, session);\n return;\n }\n if (command.kind === 'sqlite-migration-status' || command.kind === 'sqlite-migration-up') {\n await this.sqliteMigration(command, target, session);\n return;\n }\n throw new TelemetryCliUsageError(`Unsupported telemetry command ${command.kind}`);\n }\n\n private async timelineQuery(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const query: TimelineQuery = Object.freeze({\n targetId: target.targetId,\n fromMs: this.timestampOption(command, 'from'),\n toMs: this.timestampOption(command, 'to'),\n conversationId: this.optionalOption(command, 'conversation-id'),\n source: this.optionalOption(command, 'source'),\n label: this.optionalOption(command, 'label'),\n level: this.optionalOption(command, 'level'),\n producerId: this.optionalOption(command, 'producer-id'),\n correlationId: this.optionalOption(command, 'correlation-id'),\n order: this.orderOption(command),\n limit: this.rowLimitOption(command, target),\n cursor: this.optionalOption(command, 'cursor'),\n });\n const result = await session.timeline(query);\n if (!result.ok) {\n throw new Error(`${result.error.kind}: ${result.error.message}`);\n }\n const format = this.structuredFormat(command);\n const output = this.formatter.timeline(result.value, format, this.timezoneOption(command));\n this.writeBounded(output, target.query.maxResponseBytes);\n }\n\n private async metricQuery(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n runMetrics: MetricRunner,\n ): Promise<void> {\n const result = await runMetrics(this.metricQueryInput(command, target));\n if (!result.ok) {\n throw new Error(`${result.error.kind}: ${result.error.message}`);\n }\n const output = this.formatter.metrics(\n result.value,\n this.structuredFormat(command),\n this.timezoneOption(command),\n );\n this.writeBounded(output, target.query.maxResponseBytes);\n }\n\n private async metricGraph(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n runMetrics: MetricRunner,\n ): Promise<void> {\n const measurements = this.options(command, 'measurement');\n if (measurements.length !== 1) {\n throw new TelemetryCliUsageError('metrics graph requires exactly one --measurement');\n }\n const result = await runMetrics(this.metricQueryInput(command, target));\n if (!result.ok) {\n throw new Error(`${result.error.kind}: ${result.error.message}`);\n }\n const output = this.graphRenderer.render(result.value, {\n type: this.graphType(command),\n format: this.graphFormat(command),\n measurement: measurements[0] ?? '',\n timezone: this.timezoneOption(command),\n width: this.positiveIntegerOption(command, 'width', 960),\n height: this.positiveIntegerOption(command, 'height', 560),\n maxSeries: this.positiveIntegerOption(command, 'max-series', 32),\n maxPoints: this.positiveIntegerOption(command, 'max-points', target.query.maxBuckets),\n maxOutputBytes: target.query.maxResponseBytes,\n });\n const outputPath = this.optionalOption(command, 'output');\n if (outputPath === null) {\n this.writeBounded(output, target.query.maxResponseBytes);\n } else {\n this.assertBytes(output, target.query.maxResponseBytes);\n this.writeOutputFile(outputPath, output);\n }\n }\n\n private async sqliteQuery(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const maxDurationMs = this.durations.parse(\n this.optionalOption(command, 'max-duration') ?? '2s',\n '--max-duration',\n );\n if (maxDurationMs > MAX_DIAGNOSTIC_DURATION_MS) {\n throw new TelemetryCliUsageError('--max-duration cannot exceed 30s');\n }\n const result = await session.diagnosticQuery(\n this.requiredOption(command, 'sql'),\n this.bindings(command),\n {\n maxRows: this.rowLimitOption(command, target),\n maxBytes: target.query.maxResponseBytes,\n maxDurationMs,\n },\n );\n const output = this.formatter.diagnostic(result, this.structuredFormat(command));\n this.writeBounded(output, target.query.maxResponseBytes);\n }\n\n private async sqliteMigration(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const result =\n command.kind === 'sqlite-migration-up'\n ? await session.migrateUp()\n : await session.migrationStatus();\n const format = this.optionalOption(command, 'format') ?? 'table';\n if (format !== 'table' && format !== 'json') {\n throw new TelemetryCliUsageError('Migration format must be table or json');\n }\n this.writeBounded(this.formatter.migrations(result, format), target.query.maxResponseBytes);\n }\n\n private async sqliteCompact(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n session: TelemetryCliSession,\n ): Promise<void> {\n const format = this.optionalOption(command, 'format') ?? 'table';\n if (format !== 'table' && format !== 'json') {\n throw new TelemetryCliUsageError('Compaction format must be table or json');\n }\n const result = await session.compact();\n this.writeBounded(this.formatter.compaction(result, format), target.query.maxResponseBytes);\n }\n\n private metricQueryInput(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): MetricQuery {\n const measurements = this.options(command, 'measurement');\n if (measurements.length === 0) {\n throw new TelemetryCliUsageError('Metric commands require --measurement');\n }\n return Object.freeze({\n targetId: target.targetId,\n metric: this.requiredOption(command, 'metric'),\n fromMs: this.timestampOption(command, 'from'),\n toMs: this.timestampOption(command, 'to'),\n resolution: this.resolutionOption(command),\n where: this.where(command),\n measurements: Object.freeze([...measurements]),\n order: this.orderOption(command),\n limit: this.bucketLimitOption(command, target),\n cursor: this.optionalOption(command, 'cursor'),\n });\n }\n\n private resolveTarget(\n configuration: ResolvedTelemetryConfiguration,\n requestedTargetId: string | null,\n ): SqliteTargetConfiguration {\n const resolvedId =\n requestedTargetId ??\n configuration.defaultTargetId ??\n (configuration.sqliteTargets.length === 1\n ? (configuration.sqliteTargets[0]?.targetId ?? null)\n : null);\n if (resolvedId === null) {\n throw new TelemetryCliUsageError(\n 'Multiple telemetry targets require --target or a configured defaultTarget',\n );\n }\n const target = configuration.sqliteTargets.find(\n (candidate) => candidate.targetId === resolvedId,\n );\n if (!target) {\n throw new TelemetryCliUsageError(`Unknown telemetry target ${resolvedId}`);\n }\n return target;\n }\n\n private sessionMode(command: ParsedTelemetryCliCommand): TelemetryCliSessionMode {\n return command.kind === 'sqlite-compact'\n || command.kind === 'sqlite-migration-status'\n || command.kind === 'sqlite-migration-up'\n ? 'maintenance'\n : 'query';\n }\n\n private structuredFormat(command: ParsedTelemetryCliCommand): TelemetryCliStructuredFormat {\n const value = this.optionalOption(command, 'format') ?? 'table';\n if (value === 'table' || value === 'json' || value === 'jsonl' || value === 'csv') {\n return value;\n }\n throw new TelemetryCliUsageError('Format must be table, json, jsonl, or csv');\n }\n\n private graphFormat(command: ParsedTelemetryCliCommand): MetricGraphFormat {\n const value = this.optionalOption(command, 'format') ?? 'terminal';\n if (value === 'terminal' || value === 'svg' || value === 'html') {\n return value;\n }\n throw new TelemetryCliUsageError('Graph format must be terminal, svg, or html');\n }\n\n private graphType(command: ParsedTelemetryCliCommand): MetricGraphType {\n const value = this.optionalOption(command, 'type') ?? 'line';\n if (value === 'line' || value === 'bar' || value === 'stacked-bar') {\n return value;\n }\n throw new TelemetryCliUsageError('Graph type must be line, bar, or stacked-bar');\n }\n\n private orderOption(command: ParsedTelemetryCliCommand): 'asc' | 'desc' {\n const value = this.optionalOption(command, 'order') ?? 'asc';\n if (value !== 'asc' && value !== 'desc') {\n throw new TelemetryCliUsageError('--order must be asc or desc');\n }\n return value;\n }\n\n private timezoneOption(command: ParsedTelemetryCliCommand): string {\n const timezone = this.optionalOption(command, 'timezone') ?? 'UTC';\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: timezone }).format(0);\n } catch {\n throw new TelemetryCliUsageError(`Invalid timezone ${timezone}`);\n }\n return timezone;\n }\n\n private resolutionOption(command: ParsedTelemetryCliCommand): number | 'auto' {\n const value = this.requiredOption(command, 'resolution');\n return value === 'auto' ? value : this.durations.parse(value, '--resolution');\n }\n\n private rowLimitOption(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): number {\n return this.limitOption(command, target.query.maxRows, 'maxRows');\n }\n\n private bucketLimitOption(\n command: ParsedTelemetryCliCommand,\n target: SqliteTargetConfiguration,\n ): number {\n return this.limitOption(command, target.query.maxBuckets, 'maxBuckets');\n }\n\n private limitOption(\n command: ParsedTelemetryCliCommand,\n maximum: number,\n configurationName: 'maxRows' | 'maxBuckets',\n ): number {\n const limit = this.positiveIntegerOption(command, 'limit', Math.min(500, maximum));\n if (limit > maximum) {\n throw new TelemetryCliUsageError(\n `--limit cannot exceed configured ${configurationName} ${maximum}`,\n );\n }\n return limit;\n }\n\n private positiveIntegerOption(\n command: ParsedTelemetryCliCommand,\n name: string,\n fallback: number,\n ): number {\n const raw = this.optionalOption(command, name);\n if (raw === null) {\n return fallback;\n }\n const value = Number(raw);\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TelemetryCliUsageError(`--${name} must be a positive integer`);\n }\n return value;\n }\n\n private timestampOption(command: ParsedTelemetryCliCommand, name: string): number {\n const source = this.requiredOption(command, name);\n const value = /^-?[0-9]+$/.test(source) ? Number(source) : Date.parse(source);\n if (!Number.isSafeInteger(value) || Number.isNaN(new Date(value).getTime())) {\n throw new TelemetryCliUsageError(`--${name} must be an ISO timestamp or epoch milliseconds`);\n }\n return value;\n }\n\n private where(\n command: ParsedTelemetryCliCommand,\n ): Readonly<Record<string, MetricDimensionFilter>> {\n const result: Record<string, MetricDimensionFilter> = {};\n for (const expression of this.options(command, 'where')) {\n const separator = expression.indexOf('=');\n if (separator <= 0) {\n throw new TelemetryCliUsageError('--where must use dimension=value');\n }\n const key = expression.slice(0, separator);\n const value = this.whereValue(expression.slice(separator + 1));\n const existing = result[key];\n result[key] =\n existing === undefined\n ? value\n : Object.freeze([\n ...(Array.isArray(existing) ? existing : [existing]),\n ...(Array.isArray(value) ? value : [value]),\n ]);\n }\n return Object.freeze(result);\n }\n\n private whereValue(source: string): MetricDimensionFilter {\n let parsed: unknown;\n try {\n parsed = JSON.parse(source);\n } catch {\n if (source.startsWith('[')) {\n throw new TelemetryCliUsageError('--where array values must be valid JSON');\n }\n return source;\n }\n if (Array.isArray(parsed)) {\n if (parsed.length === 0 || parsed.some((value) => !this.isJsonPrimitive(value))) {\n throw new TelemetryCliUsageError('--where arrays must contain JSON primitive values');\n }\n return Object.freeze(parsed);\n }\n if (!this.isJsonPrimitive(parsed)) {\n throw new TelemetryCliUsageError('--where values must be JSON primitives or arrays');\n }\n return parsed;\n }\n\n private bindings(command: ParsedTelemetryCliCommand): Readonly<Record<string, unknown>> {\n const bindings: Record<string, unknown> = {};\n for (const expression of this.options(command, 'param')) {\n const separator = expression.indexOf('=');\n const key = expression.slice(0, separator);\n if (separator <= 0 || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new TelemetryCliUsageError('--param must use name=value');\n }\n if (Object.hasOwn(bindings, key)) {\n throw new TelemetryCliUsageError(`Duplicate SQL parameter ${key}`);\n }\n bindings[key] = this.bindingValue(expression.slice(separator + 1));\n }\n return Object.freeze(bindings);\n }\n\n private bindingValue(source: string): string | number | boolean | null {\n try {\n const parsed: unknown = JSON.parse(source);\n return this.isJsonPrimitive(parsed) ? parsed : source;\n } catch {\n return source;\n }\n }\n\n private isJsonPrimitive(value: unknown): value is string | number | boolean | null {\n return (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean' ||\n (typeof value === 'number' && Number.isFinite(value))\n );\n }\n\n private requiredOption(command: ParsedTelemetryCliCommand, name: string): string {\n const value = this.optionalOption(command, name);\n if (value === null) {\n throw new TelemetryCliUsageError(`Missing required option --${name}`);\n }\n return value;\n }\n\n private optionalOption(command: ParsedTelemetryCliCommand, name: string): string | null {\n return command.options.get(name)?.[0] ?? null;\n }\n\n private options(command: ParsedTelemetryCliCommand, name: string): readonly string[] {\n return command.options.get(name) ?? [];\n }\n\n private writeBounded(output: string, maxBytes: number): void {\n this.assertBytes(output, maxBytes);\n this.stdout(output);\n }\n\n private assertBytes(output: string, maxBytes: number): void {\n const bytes = Buffer.byteLength(output, 'utf8');\n if (bytes > maxBytes) {\n throw new Error(`CLI output exceeds configured maxResponseBytes (${bytes} > ${maxBytes})`);\n }\n }\n\n private help(): string {\n return `Usage:\n telemetry timeline query --config FILE --from TIME --to TIME [filters] [--format table|json|jsonl|csv]\n telemetry metrics query --config FILE --metric NAME --measurement NAME --resolution DURATION|auto --from TIME --to TIME [--where KEY=VALUE] [--source auto|history|legacy]\n telemetry metrics graph --config FILE --metric NAME --measurement NAME --resolution DURATION|auto --from TIME --to TIME [--type line|bar|stacked-bar] [--format terminal|svg|html] [--source auto|history|legacy]\n telemetry sqlite query --config FILE --sql SQL [--param NAME=VALUE] [--format table|json|jsonl|csv]\n telemetry sqlite compact --config FILE [--format table|json]\n telemetry sqlite migration status --config FILE [--format table|json]\n telemetry sqlite migration up --config FILE [--format table|json]\n\nRead-only timeline, metric, graph, and guarded SQL queries support a live WAL target.\nMigration and maintenance commands acquire the exclusive lease and refuse a live target.\nUse --storage-base DIR when relative SQLite paths belong to an application data directory.\nSchema rename is intentionally unavailable until transactional manifest-backed recovery exists.\n`;\n }\n}\n\nexport async function runTelemetryCli(\n argv: readonly string[],\n options: TelemetryCliOptions = {},\n): Promise<number> {\n return new TelemetryCli(options).run(argv);\n}\n\nexport type {\n TelemetryCliCompactionResult,\n TelemetryCliDiagnosticResult,\n TelemetryCliMigrationStatus,\n TelemetryCliOptions,\n TelemetryCliSession,\n TelemetryCliSessionFactory,\n TelemetryCliSessionMode,\n TelemetryCliStructuredFormat,\n} from './types/telemetry_cli.types.js';\n","import { dirname, resolve } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { load as loadYaml } from 'js-yaml';\nimport { MetricDefinitionContract } from '../../core/metric_definition_contract.js';\nimport type {\n ResolvedTelemetryConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n} from '../../core/types/configuration.types.js';\nimport type { MetricDefinition, MetricMeasurement } from '../../core/types/metric.types.js';\nimport { TelemetryTableMap } from '../../storage/telemetry_table_map.js';\nimport { TelemetryDurationParser } from './helper/telemetry_duration_parser.js';\nimport {\n TelemetryConfigurationDocumentSchema,\n type SerializedMetricDefinition,\n type SerializedSqliteTarget,\n} from './schema/telemetry_configuration_schema.js';\nimport type { NodeTelemetryConfigurationParseOptions } from './types/telemetry_configuration_parser.types.js';\n\nconst DEFAULT_LEASE_EXPIRY = '30s';\nconst DEFAULT_QUERY_RANGE = '365d';\nconst DEFAULT_QUERY_ROWS = 10_000;\nconst DEFAULT_QUERY_BUCKETS = 10_000;\nconst DEFAULT_QUERY_BYTES = 5_000_000;\nconst DEFAULT_RECLAIM_PAGES = 100;\n\nexport class TelemetryConfigurationError extends Error {\n constructor(\n message: string,\n readonly source: string,\n ) {\n super(`${source}: ${message}`);\n this.name = 'TelemetryConfigurationError';\n }\n}\n\nexport class NodeTelemetryConfigurationParser {\n constructor(\n private readonly durations = new TelemetryDurationParser(),\n private readonly metricContract = new MetricDefinitionContract(),\n ) {}\n\n parseFile(\n configurationPath: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const absolutePath = resolve(configurationPath);\n let source: string;\n try {\n source = readFileSync(absolutePath, 'utf8');\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), absolutePath);\n }\n return this.parseYaml(source, {\n sourceName: options.sourceName ?? absolutePath,\n storageBaseDirectory: options.storageBaseDirectory ?? dirname(absolutePath),\n });\n }\n\n parseYaml(\n source: string,\n options: NodeTelemetryConfigurationParseOptions = {},\n ): ResolvedTelemetryConfiguration {\n const sourceName = options.sourceName ?? '<telemetry-configuration>';\n let document: unknown;\n try {\n document = loadYaml(source);\n } catch (cause) {\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n const parsed = TelemetryConfigurationDocumentSchema.safeParse(document);\n if (!parsed.success) {\n throw new TelemetryConfigurationError(parsed.error.message, sourceName);\n }\n try {\n const baseDirectory =\n options.storageBaseDirectory === undefined\n ? dirname(resolve(sourceName))\n : resolve(options.storageBaseDirectory);\n return this.resolveDocument(parsed.data, baseDirectory);\n } catch (cause) {\n if (cause instanceof TelemetryConfigurationError) {\n throw cause;\n }\n throw new TelemetryConfigurationError(this.errorMessage(cause), sourceName);\n }\n }\n\n private resolveDocument(\n document: ReturnType<typeof TelemetryConfigurationDocumentSchema.parse>,\n baseDirectory: string,\n ): ResolvedTelemetryConfiguration {\n const telemetry = document.telemetry;\n this.validateRole(telemetry.role, telemetry.trace);\n const serializedTargets = telemetry.trace.storage?.targets ?? [];\n const targets = serializedTargets.map((target, index) =>\n this.resolveTarget(target, baseDirectory, index),\n );\n this.validateTargets(telemetry.role, targets, telemetry.trace.storage?.defaultTarget ?? null);\n const metrics = (telemetry.metrics ?? []).map((metric, index) =>\n this.resolveMetric(metric, targets, index),\n );\n this.validateMetricIdentities(metrics);\n return Object.freeze({\n version: telemetry.version ?? 1,\n role: telemetry.role,\n ingestionTransport: telemetry.trace.ingestionTransport ?? null,\n logTransport: telemetry.logs?.transport ?? null,\n defaultTargetId: telemetry.trace.storage?.defaultTarget ?? null,\n sqliteTargets: Object.freeze(targets),\n metrics: Object.freeze(metrics),\n });\n }\n\n private validateRole(\n role: 'producer' | 'collector' | 'combined',\n trace: Readonly<{\n ingestionTransport?: string | undefined;\n storage?: unknown;\n }>,\n ): void {\n const hasIngestion = trace.ingestionTransport !== undefined;\n const hasStorage = trace.storage !== undefined;\n if (role === 'producer' && (!hasIngestion || hasStorage)) {\n throw new Error('Producer telemetry requires ingestionTransport and forbids storage');\n }\n if (role === 'collector' && !hasStorage) {\n throw new Error('Collector telemetry requires storage targets');\n }\n if (role === 'combined' && (!hasIngestion || !hasStorage)) {\n throw new Error('Combined telemetry requires ingestionTransport and storage targets');\n }\n }\n\n private resolveTarget(\n target: SerializedSqliteTarget,\n baseDirectory: string,\n index: number,\n ): SqliteTargetConfiguration {\n const field = `telemetry.trace.storage.targets[${index}]`;\n const rawMs = this.durations.parse(target.retention.raw, `${field}.retention.raw`);\n const lateArrivalMs = this.durations.parse(\n target.retention.lateArrival ?? '0ms',\n `${field}.retention.lateArrival`,\n true,\n );\n const samplesMs =\n target.retention.samples === undefined\n ? rawMs + lateArrivalMs\n : this.durations.parse(target.retention.samples, `${field}.retention.samples`);\n const levelMs = this.resolveLevelRetention(target.retention.levels, field);\n const rollups = target.retention.rollups.map((tier, tierIndex) =>\n Object.freeze({\n resolutionMs: this.durations.parse(\n tier.resolution,\n `${field}.retention.rollups[${tierIndex}].resolution`,\n ),\n retainMs: this.durations.parse(\n tier.retain,\n `${field}.retention.rollups[${tierIndex}].retain`,\n ),\n }),\n );\n const tables = Object.freeze(\n Object.fromEntries(\n Object.entries(target.schema?.tables ?? {}).filter((entry) => entry[1] !== undefined),\n ),\n ) as SqliteTableOverrides;\n const schema = Object.freeze({\n tablePrefix: target.schema?.tablePrefix ?? null,\n tables,\n });\n const tableMap = TelemetryTableMap.create(schema);\n if (!tableMap.ok) {\n throw new Error(`${field}.schema: ${tableMap.error}`);\n }\n const resolved = Object.freeze({\n targetId: target.id,\n path: resolve(baseDirectory, target.path),\n delivery: target.delivery,\n schema,\n retention: Object.freeze({\n rawMs,\n lateArrivalMs,\n samplesMs,\n levelMs,\n rollups: Object.freeze(rollups),\n }),\n maintenance: Object.freeze({\n intervalMs: this.durations.parse(\n target.maintenance.interval,\n `${field}.maintenance.interval`,\n ),\n maxWorkMs: target.maintenance.maxWorkMs,\n maxReclaimPages: target.maintenance.maxReclaimPages ?? DEFAULT_RECLAIM_PAGES,\n }),\n leaseExpiryMs: this.durations.parse(\n target.leaseExpiry ?? DEFAULT_LEASE_EXPIRY,\n `${field}.leaseExpiry`,\n ),\n query: Object.freeze({\n maxRangeMs: this.durations.parse(\n target.query?.maxRange ?? DEFAULT_QUERY_RANGE,\n `${field}.query.maxRange`,\n ),\n maxRows: target.query?.maxRows ?? DEFAULT_QUERY_ROWS,\n maxBuckets: target.query?.maxBuckets ?? DEFAULT_QUERY_BUCKETS,\n maxResponseBytes: target.query?.maxResponseBytes ?? DEFAULT_QUERY_BYTES,\n }),\n });\n this.validateRetention(resolved, field);\n if (resolved.leaseExpiryMs < 1_000) {\n throw new Error(`${field}.leaseExpiry must be at least 1s`);\n }\n return resolved;\n }\n\n private resolveLevelRetention(\n levels: Readonly<Record<string, string>> | undefined,\n field: string,\n ): Readonly<Record<string, number>> {\n if (levels === undefined) {\n return Object.freeze({});\n }\n const resolved: Record<string, number> = {};\n for (const [level, duration] of Object.entries(levels)) {\n const normalized = level.trim().toLowerCase();\n if (normalized.length === 0) {\n throw new Error(`${field}.retention.levels contains an empty level name`);\n }\n if (resolved[normalized] !== undefined) {\n throw new Error(`${field}.retention.levels declares \"${normalized}\" more than once`);\n }\n resolved[normalized] = this.durations.parse(\n duration,\n `${field}.retention.levels.${normalized}`,\n );\n }\n return Object.freeze(resolved);\n }\n\n private validateRetention(target: SqliteTargetConfiguration, field: string): void {\n const retention = target.retention;\n const requiredSamplesMs = retention.rawMs + retention.lateArrivalMs;\n if (!Number.isSafeInteger(requiredSamplesMs) || retention.samplesMs < requiredSamplesMs) {\n throw new Error(`${field}.retention.samples must cover raw plus lateArrival`);\n }\n for (let index = 0; index < retention.rollups.length; index += 1) {\n const tier = retention.rollups[index];\n const previous = retention.rollups[index - 1];\n if (!tier || tier.retainMs < retention.rawMs) {\n throw new Error(`${field}.retention rollup retention cannot be shorter than raw retention`);\n }\n if (\n previous &&\n (tier.resolutionMs <= previous.resolutionMs || tier.retainMs <= previous.retainMs)\n ) {\n throw new Error(\n `${field}.retention rollup tiers must increase by resolution and retention`,\n );\n }\n }\n }\n\n private validateTargets(\n role: 'producer' | 'collector' | 'combined',\n targets: readonly SqliteTargetConfiguration[],\n defaultTargetId: string | null,\n ): void {\n if (role === 'producer') {\n return;\n }\n const targetIds = targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error('Telemetry storage target ids must be unique');\n }\n if (!targets.some((target) => target.delivery === 'required')) {\n throw new Error('Telemetry storage requires at least one required durable target');\n }\n if (defaultTargetId !== null && !targetIds.includes(defaultTargetId)) {\n throw new Error(`Unknown default telemetry target ${defaultTargetId}`);\n }\n }\n\n private resolveMetric(\n metric: SerializedMetricDefinition,\n targets: readonly SqliteTargetConfiguration[],\n index: number,\n ): MetricDefinition {\n if (metric.selector.endsWith('[*]') && (metric.groupBy?.length ?? 0) > 0) {\n throw new Error(`telemetry.metrics[${index}] selector [*] cannot declare groupBy`);\n }\n const targetIds = metric.targets ?? targets.map((target) => target.targetId);\n if (new Set(targetIds).size !== targetIds.length) {\n throw new Error(`telemetry.metrics[${index}] has duplicate target ids`);\n }\n const unknownTarget = targetIds.find(\n (targetId) => !targets.some((target) => target.targetId === targetId),\n );\n if (unknownTarget !== undefined) {\n throw new Error(`telemetry.metrics[${index}] references unknown target ${unknownTarget}`);\n }\n const resolutionsMs =\n metric.resolutions?.map((resolution, resolutionIndex) =>\n this.durations.parse(\n resolution,\n `telemetry.metrics[${index}].resolutions[${resolutionIndex}]`,\n ),\n ) ?? this.metricResolutions(targets, targetIds);\n this.validateMetricResolutions(resolutionsMs, targets, targetIds, index);\n const cardinality = Object.freeze(\n Object.fromEntries(\n Object.entries(metric.cardinality ?? {}).map(([field, rule]) => [\n field,\n Object.freeze({ ...rule }),\n ]),\n ),\n );\n const definition: MetricDefinition = {\n name: metric.name,\n version: metric.version ?? 1,\n selector: metric.selector,\n groupBy: Object.freeze([...(metric.groupBy ?? [])]),\n measurements: Object.freeze(\n metric.measurements.map((measurement) => this.resolveMeasurement(measurement)),\n ),\n cardinality,\n targetIds: Object.freeze([...targetIds]),\n resolutionsMs: Object.freeze(resolutionsMs),\n missingField: metric.missingField ?? 'record-failure',\n };\n const normalized = this.metricContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(`telemetry.metrics[${index}]: ${normalized.error}`);\n }\n this.validateNormalizedMetric(normalized.value, index);\n return normalized.value;\n }\n\n private validateNormalizedMetric(definition: MetricDefinition, index: number): void {\n const segments = definition.selector.split('.');\n const invalidSelector = segments.some(\n (segment) =>\n segment !== '*' && segment !== '**' && !/^[A-Za-z0-9_:-][A-Za-z0-9_:\\-]*$/.test(segment),\n );\n if (invalidSelector) {\n throw new Error(`telemetry.metrics[${index}] has an invalid dotted selector`);\n }\n const invalidGroupBy = definition.groupBy.find((field) => !this.isFieldPath(field));\n if (\n invalidGroupBy !== undefined ||\n new Set(definition.groupBy).size !== definition.groupBy.length\n ) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate groupBy fields`);\n }\n const extraCardinality = Object.keys(definition.cardinality).find(\n (field) => !definition.groupBy.includes(field),\n );\n if (extraCardinality !== undefined) {\n throw new Error(\n `telemetry.metrics[${index}] cardinality policy ${extraCardinality} is not a declared dimension`,\n );\n }\n const measurementKeys = definition.measurements.map((measurement) =>\n measurement.kind === 'count' ? 'count' : `field:${measurement.field}`,\n );\n const invalidField = definition.measurements.find(\n (measurement) => measurement.kind === 'field' && !this.isFieldPath(measurement.field),\n );\n if (invalidField !== undefined || new Set(measurementKeys).size !== measurementKeys.length) {\n throw new Error(`telemetry.metrics[${index}] has invalid or duplicate measurements`);\n }\n }\n\n private isFieldPath(value: string): boolean {\n return value.split('.').every((segment) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(segment));\n }\n\n private resolveMeasurement(\n measurement: SerializedMetricDefinition['measurements'][number],\n ): MetricMeasurement {\n if (measurement === 'count') {\n return Object.freeze({ kind: 'count' });\n }\n if (new Set(measurement.aggregate).size !== measurement.aggregate.length) {\n throw new Error(`Metric field ${measurement.field} has duplicate aggregates`);\n }\n return Object.freeze({\n kind: 'field',\n field: measurement.field,\n aggregates: Object.freeze([...measurement.aggregate]),\n });\n }\n\n private metricResolutions(\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n ): number[] {\n const selected = targets.filter((target) => targetIds.includes(target.targetId));\n const first = selected[0]?.retention.rollups.map((tier) => tier.resolutionMs) ?? [];\n return first\n .filter((resolution) =>\n selected.every((target) =>\n target.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n ),\n )\n .sort((left, right) => left - right);\n }\n\n private validateMetricResolutions(\n resolutions: readonly number[],\n targets: readonly SqliteTargetConfiguration[],\n targetIds: readonly string[],\n metricIndex: number,\n ): void {\n for (const targetId of targetIds) {\n const target = targets.find((candidate) => candidate.targetId === targetId);\n const unavailable = resolutions.find(\n (resolution) => !target?.retention.rollups.some((tier) => tier.resolutionMs === resolution),\n );\n if (unavailable !== undefined) {\n throw new Error(\n `telemetry.metrics[${metricIndex}] resolution ${unavailable} is not configured for target ${targetId}`,\n );\n }\n }\n }\n\n private validateMetricIdentities(metrics: readonly MetricDefinition[]): void {\n const identities = metrics.map((metric) => `${metric.name}:${metric.version}`);\n if (new Set(identities).size !== identities.length) {\n throw new Error('Metric name/version identities must be unique');\n }\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type { MetricDefinition } from './types/metric.types.js';\nimport type { TelemetryResult } from './types/result.types.js';\n\nexport class MetricDefinitionContract {\n normalize(definition: MetricDefinition): TelemetryResult<MetricDefinition, string> {\n const parsedSelector = this.parseSelector(definition.selector);\n if (!parsedSelector.ok) {\n return parsedSelector;\n }\n\n const bracketGroupBy = parsedSelector.value.groupBy;\n const configuredGroupBy = definition.groupBy;\n const bothSpecifyDifferentGrouping = bracketGroupBy.length > 0\n && configuredGroupBy.length > 0\n && bracketGroupBy.join('.') !== configuredGroupBy.join('.');\n if (bothSpecifyDifferentGrouping) {\n return { ok: false, error: `Metric ${definition.name} has conflicting selector and groupBy declarations` };\n }\n const groupBy = configuredGroupBy.length > 0 ? configuredGroupBy : bracketGroupBy;\n\n const basicError = this.validateBasic(definition, parsedSelector.value.selector, groupBy);\n if (basicError !== null) {\n return { ok: false, error: basicError };\n }\n if (parsedSelector.value.wildcardUngrouped\n && definition.measurements.some((measurement) => measurement.kind !== 'count')) {\n return {\n ok: false,\n error: `Metric ${definition.name} uses [*] and may only declare count`,\n };\n }\n\n return {\n ok: true,\n value: Object.freeze({\n ...definition,\n selector: parsedSelector.value.selector,\n groupBy: Object.freeze([...groupBy]),\n resolutionsMs: Object.freeze([...definition.resolutionsMs].sort((left, right) => left - right)),\n measurements: Object.freeze([...definition.measurements]),\n targetIds: Object.freeze([...definition.targetIds]),\n cardinality: Object.freeze({ ...definition.cardinality }),\n }),\n };\n }\n\n matches(selector: string, label: string): boolean {\n const selectorSegments = selector.split('.');\n const labelSegments = label.split('.');\n return this.matchSegments(selectorSegments, labelSegments, 0, 0);\n }\n\n private parseSelector(selector: string): TelemetryResult<Readonly<{\n selector: string;\n groupBy: readonly string[];\n wildcardUngrouped: boolean;\n }>, string> {\n if (selector.startsWith('[')) {\n return { ok: false, error: 'A metric selector cannot omit its event label or glob' };\n }\n\n const bracketStart = selector.lastIndexOf('[');\n if (bracketStart < 0) {\n return { ok: true, value: { selector, groupBy: [], wildcardUngrouped: false } };\n }\n if (!selector.endsWith(']')) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n\n const eventSelector = selector.slice(0, bracketStart);\n const bracket = selector.slice(bracketStart + 1, -1).trim();\n if (!eventSelector || !bracket) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n // `[a, b]` groups by several bounded fields at once (e.g. routeKey and\n // visibility); each name is validated downstream like a `groupBy` entry.\n const groupBy = bracket === '*' ? [] : bracket.split(',').map((field) => field.trim());\n if (groupBy.some((field) => field.length === 0)) {\n return { ok: false, error: `Invalid metric selector ${selector}` };\n }\n return {\n ok: true,\n value: {\n selector: eventSelector,\n groupBy,\n wildcardUngrouped: bracket === '*',\n },\n };\n }\n\n private validateBasic(\n definition: MetricDefinition,\n selector: string,\n groupBy: readonly string[],\n ): string | null {\n if (!/^[A-Za-z0-9_*][A-Za-z0-9_.:*\\-]*$/.test(selector)) {\n return `Metric ${definition.name} has an invalid selector`;\n }\n if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(definition.name)) {\n return `Metric name ${definition.name} is invalid`;\n }\n if (!Number.isInteger(definition.version) || definition.version <= 0) {\n return `Metric ${definition.name} must have a positive integer version`;\n }\n if (definition.measurements.length === 0) {\n return `Metric ${definition.name} must declare at least one measurement`;\n }\n const invalidResolution = definition.resolutionsMs.some(\n (resolution) => !Number.isInteger(resolution) || resolution <= 0,\n );\n const duplicateResolution = new Set(definition.resolutionsMs).size !== definition.resolutionsMs.length;\n if (invalidResolution || duplicateResolution || definition.resolutionsMs.length === 0) {\n return `Metric ${definition.name} has invalid or duplicate resolutions`;\n }\n const missingCardinality = groupBy.find((field) => definition.cardinality[field] === undefined);\n if (missingCardinality) {\n return `Metric ${definition.name} is missing cardinality policy for ${missingCardinality}`;\n }\n const invalidCardinality = Object.values(definition.cardinality).some(\n (rule) => !Number.isInteger(rule.maxValuesPerBucket) || rule.maxValuesPerBucket <= 0,\n );\n if (invalidCardinality) {\n return `Metric ${definition.name} has an invalid cardinality limit`;\n }\n return null;\n }\n\n private matchSegments(\n selector: readonly string[],\n label: readonly string[],\n selectorIndex: number,\n labelIndex: number,\n ): boolean {\n if (selectorIndex === selector.length) {\n return labelIndex === label.length;\n }\n const segment = selector[selectorIndex];\n if (segment === '**') {\n if (selectorIndex === selector.length - 1) {\n return true;\n }\n for (let next = labelIndex; next <= label.length; next += 1) {\n if (this.matchSegments(selector, label, selectorIndex + 1, next)) {\n return true;\n }\n }\n return false;\n }\n if (labelIndex >= label.length) {\n return false;\n }\n const segmentMatches = segment === '*' || segment === label[labelIndex];\n return segmentMatches\n && this.matchSegments(selector, label, selectorIndex + 1, labelIndex + 1);\n }\n}\n","const UTF8_ENCODER = new TextEncoder();\n\n/**\n * Canonical key order is UTF-8 byte order. This must stay byte-identical to\n * the native Rust collector, whose serde_json BTreeMap serialization sorts\n * object keys the same way; locale-aware comparisons (localeCompare) depend\n * on the ICU build and diverge from the Rust side, which invalidates every\n * cross-language checksum.\n */\nexport function compareCanonicalKeys(left: string, right: string): number {\n if (left === right) return 0;\n // Code-unit comparison equals UTF-8 byte order for ASCII-only keys.\n // eslint-disable-next-line no-control-regex\n if (/^[\\x00-\\x7f]*$/.test(left) && /^[\\x00-\\x7f]*$/.test(right)) {\n return left < right ? -1 : 1;\n }\n const leftBytes = UTF8_ENCODER.encode(left);\n const rightBytes = UTF8_ENCODER.encode(right);\n const length = Math.min(leftBytes.length, rightBytes.length);\n for (let index = 0; index < length; index += 1) {\n const difference = (leftBytes[index] ?? 0) - (rightBytes[index] ?? 0);\n if (difference !== 0) return difference;\n }\n return leftBytes.length - rightBytes.length;\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new Error('Canonical telemetry JSON cannot encode a non-finite number');\n }\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((item) => canonicalJson(item));\n return `[${items.join(',')}]`;\n }\n\n if (typeof value !== 'object') {\n throw new Error(`Canonical telemetry JSON cannot encode ${typeof value}`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => compareCanonicalKeys(left, right));\n const properties = entries.map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`);\n return `{${properties.join(',')}}`;\n}\n\nexport function telemetryUtf8Length(value: string): number {\n return new TextEncoder().encode(value).byteLength;\n}\n\nexport function telemetryChecksum(value: unknown): string {\n const bytes = new TextEncoder().encode(canonicalJson(value));\n let hash = 0xcbf29ce484222325n;\n const prime = 0x100000001b3n;\n\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = BigInt.asUintN(64, hash * prime);\n }\n\n return hash.toString(16).padStart(16, '0');\n}\n","import type { SqliteTableOverrides } from '../../core/types/configuration.types.js';\n\nexport const SQLITE_LOGICAL_TABLE_NAMES = [\n 'rawEvents',\n 'batchAcknowledgements',\n 'ingestWatermarks',\n 'metricDefinitions',\n 'metricSamples',\n 'metricRollups',\n 'rollupCompletions',\n 'extractionFailures',\n 'maintenanceRuns',\n 'readerLeases',\n 'committedDropCounters',\n 'migrationHistory',\n] as const satisfies readonly (keyof SqliteTableOverrides)[];\n\nexport const SQLITE_DEFAULT_TABLE_NAMES: Readonly<Record<(typeof SQLITE_LOGICAL_TABLE_NAMES)[number], string>> =\n Object.freeze({\n rawEvents: 'raw_events',\n batchAcknowledgements: 'batch_acknowledgements',\n ingestWatermarks: 'ingest_watermarks',\n metricDefinitions: 'metric_definitions',\n metricSamples: 'metric_samples',\n metricRollups: 'metric_rollups',\n rollupCompletions: 'rollup_completions',\n extractionFailures: 'extraction_failures',\n maintenanceRuns: 'maintenance_runs',\n readerLeases: 'reader_leases',\n committedDropCounters: 'committed_drop_counters',\n migrationHistory: 'migration_history',\n });\n\nexport const SQLITE_SCHEMA_MANIFEST_TABLE = 'telemetry_schema_manifest';\n","import type { SqliteSchemaConfiguration } from '../core/types/configuration.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport { telemetryChecksum } from '../core/helper/canonical_json.js';\nimport {\n SQLITE_DEFAULT_TABLE_NAMES,\n SQLITE_LOGICAL_TABLE_NAMES,\n SQLITE_SCHEMA_MANIFEST_TABLE,\n} from './helper/sqlite_table_names.js';\nimport type {\n TelemetryLogicalTableName,\n TelemetryPhysicalTableMapping,\n} from './types/telemetry_table_map.types.js';\n\nexport class TelemetryTableMap {\n private readonly tokenMap: Readonly<Record<string, string>>;\n\n private constructor(\n private readonly mapping: TelemetryPhysicalTableMapping,\n readonly checksum: string,\n ) {\n this.tokenMap = Object.freeze({\n ...mapping,\n rawEventsOccurredIndex: this.indexName(mapping.rawEvents, 'occurred'),\n rawEventsConversationIndex: this.indexName(mapping.rawEvents, 'conversation'),\n rawEventsLabelIndex: this.indexName(mapping.rawEvents, 'label'),\n rawEventsLevelIndex: this.indexName(mapping.rawEvents, 'level'),\n metricSamplesTimeIndex: this.indexName(mapping.metricSamples, 'time'),\n metricSamplesEventIndex: this.indexName(mapping.metricSamples, 'event'),\n metricRollupsTimeIndex: this.indexName(mapping.metricRollups, 'time'),\n });\n }\n\n static create(configuration: SqliteSchemaConfiguration): TelemetryResult<TelemetryTableMap, string> {\n const prefixError = TelemetryTableMap.validateOptionalPrefix(configuration.tablePrefix);\n if (prefixError !== null) {\n return { ok: false, error: prefixError };\n }\n\n const entries = SQLITE_LOGICAL_TABLE_NAMES.map((logicalName) => {\n const override = configuration.tables[logicalName];\n const defaultName = SQLITE_DEFAULT_TABLE_NAMES[logicalName];\n const physicalName = override ?? (configuration.tablePrefix === null\n ? defaultName\n : `${configuration.tablePrefix}${defaultName}`);\n return [logicalName, physicalName] as const;\n });\n\n for (const [logicalName, physicalName] of entries) {\n const identifierError = TelemetryTableMap.validateIdentifier(physicalName);\n if (identifierError !== null) {\n return { ok: false, error: `${logicalName}: ${identifierError}` };\n }\n if (physicalName.toLowerCase() === SQLITE_SCHEMA_MANIFEST_TABLE) {\n return { ok: false, error: `${logicalName} cannot use the fixed schema manifest name` };\n }\n }\n\n const foldedNames = entries.map(([, physicalName]) => physicalName.toLowerCase());\n if (new Set(foldedNames).size !== foldedNames.length) {\n return { ok: false, error: 'Resolved telemetry table names must be unique after case folding' };\n }\n\n const mapping = Object.freeze(Object.fromEntries(entries)) as TelemetryPhysicalTableMapping;\n const checksum = telemetryChecksum(mapping);\n return { ok: true, value: new TelemetryTableMap(mapping, checksum) };\n }\n\n physical(logicalName: TelemetryLogicalTableName): string {\n return this.mapping[logicalName];\n }\n\n quoted(logicalName: TelemetryLogicalTableName): string {\n return this.quote(this.mapping[logicalName]);\n }\n\n manifestMapping(): TelemetryPhysicalTableMapping {\n return this.mapping;\n }\n\n substitute(sql: string): TelemetryResult<string, string> {\n const unknownTokens: string[] = [];\n const substituted = sql.replace(/\\{\\{([A-Za-z][A-Za-z0-9]*)\\}\\}/g, (_match, token: string) => {\n const identifier = this.tokenMap[token];\n if (identifier === undefined) {\n unknownTokens.push(token);\n return `{{${token}}}`;\n }\n return this.quote(identifier);\n });\n if (unknownTokens.length > 0 || substituted.includes('{{')) {\n return {\n ok: false,\n error: `Unknown telemetry migration identifier token(s): ${unknownTokens.join(', ') || 'malformed token'}`,\n };\n }\n return { ok: true, value: substituted };\n }\n\n private quote(identifier: string): string {\n return `\"${identifier.replaceAll('\"', '\"\"')}\"`;\n }\n\n private indexName(tableName: string, purpose: string): string {\n const raw = `${tableName}_${purpose}_idx`;\n if (raw.length <= 63) {\n return raw;\n }\n const suffix = telemetryChecksum(raw).slice(0, 8);\n return `${raw.slice(0, 54)}_${suffix}`;\n }\n\n private static validateOptionalPrefix(prefix: string | null): string | null {\n if (prefix === null) {\n return null;\n }\n return this.validateIdentifier(prefix);\n }\n\n private static validateIdentifier(identifier: string): string | null {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(identifier)) {\n return `Invalid SQLite identifier ${identifier}`;\n }\n if (identifier.length > 63) {\n return `SQLite identifier ${identifier} exceeds 63 characters`;\n }\n if (identifier.toLowerCase().startsWith('sqlite_')) {\n return `SQLite identifier ${identifier} uses the reserved sqlite_ prefix`;\n }\n return null;\n }\n}\n","export class TelemetryDurationParser {\n private static readonly MULTIPLIERS = Object.freeze({\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 60 * 60_000,\n d: 24 * 60 * 60_000,\n w: 7 * 24 * 60 * 60_000,\n y: 365 * 24 * 60 * 60_000,\n });\n\n parse(value: string, field: string, allowZero = false): number {\n const match = /^(0|[1-9][0-9]*)(ms|s|m|h|d|w|y)$/.exec(value);\n if (!match) {\n throw new Error(`${field} must be an integer duration using ms, s, m, h, d, w, or y`);\n }\n const amount = Number(match[1]);\n const unit = match[2] as keyof typeof TelemetryDurationParser.MULTIPLIERS;\n const milliseconds = amount * TelemetryDurationParser.MULTIPLIERS[unit];\n if (!Number.isSafeInteger(milliseconds) || (!allowZero && milliseconds <= 0)) {\n throw new Error(`${field} is outside the supported duration range`);\n }\n return milliseconds;\n }\n}\n","import { z } from 'zod';\n\nconst DurationSchema = z.string().min(1);\nconst NonEmptyStringSchema = z.string().trim().min(1);\nconst StableIdSchema = z.string().regex(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/);\n\nconst CardinalityRuleSchema = z\n .object({\n maxValuesPerBucket: z.number().int().positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict();\n\nconst MetricMeasurementSchema = z.union([\n z.literal('count'),\n z\n .object({\n field: z.string().min(1),\n aggregate: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nconst MetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: z.number().int().positive().optional(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)).optional(),\n measurements: z.array(MetricMeasurementSchema).min(1),\n cardinality: z.record(z.string(), CardinalityRuleSchema).optional(),\n targets: z.array(StableIdSchema).min(1).optional(),\n resolutions: z.array(DurationSchema).min(1).optional(),\n missingField: z.enum(['skip', 'record-failure']).optional(),\n })\n .strict();\n\nconst SqliteTablesSchema = z\n .object({\n rawEvents: NonEmptyStringSchema.optional(),\n batchAcknowledgements: NonEmptyStringSchema.optional(),\n ingestWatermarks: NonEmptyStringSchema.optional(),\n metricDefinitions: NonEmptyStringSchema.optional(),\n metricSamples: NonEmptyStringSchema.optional(),\n metricRollups: NonEmptyStringSchema.optional(),\n rollupCompletions: NonEmptyStringSchema.optional(),\n extractionFailures: NonEmptyStringSchema.optional(),\n maintenanceRuns: NonEmptyStringSchema.optional(),\n readerLeases: NonEmptyStringSchema.optional(),\n committedDropCounters: NonEmptyStringSchema.optional(),\n migrationHistory: NonEmptyStringSchema.optional(),\n })\n .strict();\n\nconst SqliteTargetSchema = z\n .object({\n id: StableIdSchema,\n transport: z.literal('sqlite'),\n delivery: z.enum(['required', 'best-effort']),\n path: z.string().min(1),\n schema: z\n .object({\n tablePrefix: NonEmptyStringSchema.nullable().optional(),\n tables: SqliteTablesSchema.optional(),\n })\n .strict()\n .optional(),\n retention: z\n .object({\n raw: DurationSchema,\n lateArrival: DurationSchema.optional(),\n samples: DurationSchema.optional(),\n levels: z.record(z.string().min(1), DurationSchema).optional(),\n rollups: z\n .array(\n z\n .object({\n resolution: DurationSchema,\n retain: DurationSchema,\n })\n .strict(),\n )\n .min(1),\n })\n .strict(),\n maintenance: z\n .object({\n interval: DurationSchema,\n maxWorkMs: z.number().int().positive(),\n reclaim: z.literal('incremental'),\n maxReclaimPages: z.number().int().positive().optional(),\n })\n .strict(),\n leaseExpiry: DurationSchema.optional(),\n query: z\n .object({\n maxRange: DurationSchema.optional(),\n maxRows: z.number().int().positive().optional(),\n maxBuckets: z.number().int().positive().optional(),\n maxResponseBytes: z.number().int().positive().optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nconst StorageSchema = z\n .object({\n defaultTarget: StableIdSchema.nullable().optional(),\n targets: z.array(SqliteTargetSchema).min(1),\n })\n .strict();\n\nconst TraceSchema = z\n .object({\n ingestionTransport: z.string().min(1).optional(),\n storage: StorageSchema.optional(),\n })\n .strict();\n\nexport const TelemetryConfigurationDocumentSchema = z\n .object({\n telemetry: z\n .object({\n version: z.literal(1).optional(),\n role: z.enum(['producer', 'collector', 'combined']),\n trace: TraceSchema,\n metrics: z.array(MetricDefinitionSchema).optional(),\n logs: z\n .object({\n transport: z.literal('console'),\n })\n .strict()\n .optional(),\n })\n .strict(),\n })\n .strict();\n\nexport type TelemetryConfigurationDocument = z.infer<typeof TelemetryConfigurationDocumentSchema>;\n\nexport type SerializedMetricDefinition = z.infer<typeof MetricDefinitionSchema>;\nexport type SerializedSqliteTarget = z.infer<typeof SqliteTargetSchema>;\n","import type { MetricQueryResponse } from '../core/types/query.types.js';\n\nexport type MetricGraphType = 'line' | 'bar' | 'stacked-bar';\n\nexport type MetricGraphFormat = 'terminal' | 'svg' | 'html';\n\nexport interface MetricGraphRenderOptions {\n type: MetricGraphType;\n format: MetricGraphFormat;\n measurement: string;\n timezone?: string;\n width?: number;\n height?: number;\n maxSeries?: number;\n maxPoints?: number;\n maxOutputBytes?: number;\n}\n\nexport type MetricGraphLimitCode = 'MAX_SERIES' | 'MAX_POINTS' | 'MAX_OUTPUT_BYTES';\n\nexport class MetricGraphRenderError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MetricGraphRenderError';\n }\n}\n\nexport class MetricGraphLimitError extends MetricGraphRenderError {\n constructor(\n public readonly code: MetricGraphLimitCode,\n public readonly limit: number,\n public readonly actual: number,\n ) {\n super(`Metric graph ${code} limit exceeded: ${actual} > ${limit}`);\n this.name = 'MetricGraphLimitError';\n }\n}\n\ninterface ResolvedGraphOptions {\n type: MetricGraphType;\n format: MetricGraphFormat;\n measurement: string;\n timezone: string;\n width: number;\n height: number;\n maxSeries: number;\n maxPoints: number;\n maxOutputBytes: number;\n}\n\ninterface GraphGap {\n fromMs: number;\n toMs: number;\n reason: string;\n}\n\ninterface GraphPartialFailure {\n targetId: string;\n reason: string;\n}\n\ninterface GraphDimensions {\n key: string;\n label: string;\n json: string;\n}\n\ninterface GraphPoint {\n startMs: number;\n endMs: number;\n value: number;\n seriesKey: string;\n seriesLabel: string;\n dimensionsJson: string;\n definitionVersion: number;\n resolutionMs: number;\n}\n\ninterface GraphSeries {\n key: string;\n label: string;\n dimensionsJson: string;\n points: GraphPoint[];\n}\n\ninterface GraphTimeline {\n fromMs: number;\n toMs: number;\n hasCoverage: boolean;\n}\n\ninterface GraphModel {\n targetId: string;\n metric: string;\n options: ResolvedGraphOptions;\n definitions: number[];\n resolutions: number[];\n series: GraphSeries[];\n points: GraphPoint[];\n gaps: GraphGap[];\n partialFailures: GraphPartialFailure[];\n hasNextPage: boolean;\n timeline: GraphTimeline;\n}\n\ninterface GraphScale {\n left: number;\n right: number;\n top: number;\n bottom: number;\n x: (value: number) => number;\n y: (value: number) => number;\n yMin: number;\n yMax: number;\n}\n\ninterface BucketGroup {\n startMs: number;\n endMs: number;\n points: GraphPoint[];\n}\n\nconst DEFAULT_WIDTH = 960;\nconst DEFAULT_HEIGHT = 560;\nconst DEFAULT_MAX_SERIES = 32;\nconst DEFAULT_MAX_POINTS = 10_000;\nconst DEFAULT_MAX_OUTPUT_BYTES = 8 * 1024 * 1024;\nconst MIN_WIDTH = 320;\nconst MAX_WIDTH = 4_096;\nconst MIN_HEIGHT = 280;\nconst MAX_HEIGHT = 4_096;\nconst TERMINAL_BAR_WIDTH = 24;\nconst SVG_COLORS = [\n '#2563eb',\n '#dc2626',\n '#16a34a',\n '#9333ea',\n '#ea580c',\n '#0891b2',\n '#4f46e5',\n '#be123c',\n '#65a30d',\n '#7c3aed',\n '#c2410c',\n '#0f766e',\n '#1d4ed8',\n '#b91c1c',\n '#15803d',\n '#7e22ce',\n '#d97706',\n '#0e7490',\n '#4338ca',\n '#a21caf',\n] as const;\n\n/**\n * Pure renderer for already queried metric buckets.\n *\n * It deliberately has no query or storage dependency: every input bucket is\n * represented in the output or the render fails a configured hard limit.\n */\nexport class MetricGraphRenderer {\n render(response: MetricQueryResponse, options: MetricGraphRenderOptions): string {\n const model = this.buildModel(response, options);\n const output = this.renderFormat(model);\n const outputBytes = this.utf8ByteLength(output);\n\n if (outputBytes > model.options.maxOutputBytes) {\n throw new MetricGraphLimitError(\n 'MAX_OUTPUT_BYTES',\n model.options.maxOutputBytes,\n outputBytes,\n );\n }\n\n return output;\n }\n\n private buildModel(response: MetricQueryResponse, options: MetricGraphRenderOptions): GraphModel {\n const resolvedOptions = this.resolveOptions(options);\n const gaps = this.normalizeGaps(response.gaps ?? []);\n const partialFailures = this.normalizePartialFailures(response.partialFailures ?? []);\n const points = this.normalizePoints(response, resolvedOptions.measurement);\n const series = this.groupSeries(points);\n\n this.enforceCollectionLimits(series.length, points.length, resolvedOptions);\n\n return {\n targetId: this.requireText(response.targetId, 'response.targetId'),\n metric: this.requireText(response.metric, 'response.metric'),\n options: resolvedOptions,\n definitions: this.sortedUniqueNumbers(\n response.segments.map((segment) => segment.definitionVersion),\n ),\n resolutions: this.sortedUniqueNumbers(\n response.segments.map((segment) => segment.resolutionMs),\n ),\n series,\n points,\n gaps,\n partialFailures,\n hasNextPage: response.nextCursor !== null,\n timeline: this.resolveTimeline(response, gaps, points),\n };\n }\n\n private resolveOptions(options: MetricGraphRenderOptions): ResolvedGraphOptions {\n const measurement = this.requireText(options.measurement, 'measurement');\n const timezone = options.timezone ?? 'UTC';\n this.validateTimezone(timezone);\n\n return {\n type: this.requireGraphType(options.type),\n format: this.requireGraphFormat(options.format),\n measurement,\n timezone,\n width: this.requireIntegerInRange(\n options.width ?? DEFAULT_WIDTH,\n MIN_WIDTH,\n MAX_WIDTH,\n 'width',\n ),\n height: this.requireIntegerInRange(\n options.height ?? DEFAULT_HEIGHT,\n MIN_HEIGHT,\n MAX_HEIGHT,\n 'height',\n ),\n maxSeries: this.requirePositiveInteger(options.maxSeries ?? DEFAULT_MAX_SERIES, 'maxSeries'),\n maxPoints: this.requirePositiveInteger(options.maxPoints ?? DEFAULT_MAX_POINTS, 'maxPoints'),\n maxOutputBytes: this.requirePositiveInteger(\n options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES,\n 'maxOutputBytes',\n ),\n };\n }\n\n private requireGraphType(value: MetricGraphType): MetricGraphType {\n if (value === 'line' || value === 'bar' || value === 'stacked-bar') {\n return value;\n }\n throw new MetricGraphRenderError(`Unsupported metric graph type: ${String(value)}`);\n }\n\n private requireGraphFormat(value: MetricGraphFormat): MetricGraphFormat {\n if (value === 'terminal' || value === 'svg' || value === 'html') {\n return value;\n }\n throw new MetricGraphRenderError(`Unsupported metric graph format: ${String(value)}`);\n }\n\n private validateTimezone(timezone: string): void {\n try {\n new Intl.DateTimeFormat('en-US', { timeZone: timezone }).format(0);\n } catch {\n throw new MetricGraphRenderError(`Invalid display timezone: ${timezone}`);\n }\n }\n\n private requireText(value: string, field: string): string {\n if (typeof value !== 'string' || value.length === 0) {\n throw new MetricGraphRenderError(`${field} must be a non-empty string`);\n }\n return value;\n }\n\n private requirePositiveInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new MetricGraphRenderError(`${field} must be a positive safe integer`);\n }\n return value;\n }\n\n private requireIntegerInRange(\n value: number,\n minimum: number,\n maximum: number,\n field: string,\n ): number {\n if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {\n throw new MetricGraphRenderError(\n `${field} must be an integer between ${minimum} and ${maximum}`,\n );\n }\n return value;\n }\n\n private enforceCollectionLimits(\n seriesCount: number,\n pointCount: number,\n options: ResolvedGraphOptions,\n ): void {\n if (seriesCount > options.maxSeries) {\n throw new MetricGraphLimitError('MAX_SERIES', options.maxSeries, seriesCount);\n }\n if (pointCount > options.maxPoints) {\n throw new MetricGraphLimitError('MAX_POINTS', options.maxPoints, pointCount);\n }\n }\n\n private normalizeGaps(source: MetricQueryResponse['gaps']): GraphGap[] {\n return source\n .map((gap, index) => {\n this.requireInterval(gap.fromMs, gap.toMs, `gaps[${index}]`);\n return {\n fromMs: gap.fromMs,\n toMs: gap.toMs,\n reason: this.requireText(gap.reason, `gaps[${index}].reason`),\n };\n })\n .sort((left, right) =>\n this.compareTuple(\n [left.fromMs, left.toMs, left.reason],\n [right.fromMs, right.toMs, right.reason],\n ),\n );\n }\n\n private normalizePartialFailures(\n source: MetricQueryResponse['partialFailures'],\n ): GraphPartialFailure[] {\n return source\n .map((failure, index) => ({\n targetId: this.requireText(failure.targetId, `partialFailures[${index}].targetId`),\n reason: this.requireText(failure.reason, `partialFailures[${index}].reason`),\n }))\n .sort((left, right) =>\n this.compareTuple([left.targetId, left.reason], [right.targetId, right.reason]),\n );\n }\n\n private normalizePoints(response: MetricQueryResponse, measurement: string): GraphPoint[] {\n const points: GraphPoint[] = [];\n\n response.segments.forEach((segment, segmentIndex) => {\n this.requireInterval(segment.fromMs, segment.toMs, `segments[${segmentIndex}]`);\n this.requirePositiveInteger(segment.resolutionMs, `segments[${segmentIndex}].resolutionMs`);\n this.requirePositiveInteger(\n segment.definitionVersion,\n `segments[${segmentIndex}].definitionVersion`,\n );\n\n segment.buckets.forEach((bucket, bucketIndex) => {\n const path = `segments[${segmentIndex}].buckets[${bucketIndex}]`;\n this.requireInterval(bucket.startMs, bucket.endMs, path);\n this.requireBucketInsideSegment(\n bucket.startMs,\n bucket.endMs,\n segment.fromMs,\n segment.toMs,\n path,\n );\n const dimensions = this.normalizeDimensions(bucket.dimensions, path);\n const baseLabel = dimensions.label || measurement;\n const versionLabel = `definition=v${segment.definitionVersion}, resolution=${segment.resolutionMs}ms`;\n points.push({\n startMs: bucket.startMs,\n endMs: bucket.endMs,\n value: this.readMeasurement(bucket.values, measurement, path),\n seriesKey: JSON.stringify([\n dimensions.key,\n segment.definitionVersion,\n segment.resolutionMs,\n ]),\n seriesLabel: `${baseLabel} [${versionLabel}]`,\n dimensionsJson: dimensions.json,\n definitionVersion: segment.definitionVersion,\n resolutionMs: segment.resolutionMs,\n });\n });\n });\n\n return points.sort((left, right) => this.comparePoints(left, right));\n }\n\n private requireInterval(fromMs: number, toMs: number, field: string): void {\n if (!this.isValidTimestamp(fromMs) || !this.isValidTimestamp(toMs) || fromMs >= toMs) {\n throw new MetricGraphRenderError(\n `${field} must have valid millisecond timestamps in ascending order`,\n );\n }\n }\n\n private requireBucketInsideSegment(\n startMs: number,\n endMs: number,\n segmentFromMs: number,\n segmentToMs: number,\n field: string,\n ): void {\n if (startMs < segmentFromMs || endMs > segmentToMs) {\n throw new MetricGraphRenderError(`${field} falls outside its query segment`);\n }\n }\n\n private normalizeDimensions(value: unknown, field: string): GraphDimensions {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new MetricGraphRenderError(`${field}.dimensions must be an object`);\n }\n\n const entries = Object.entries(value).sort(([left], [right]) => this.compareText(left, right));\n const normalized = entries.map(([key, entryValue]) => ({\n key,\n value: this.requireDimensionValue(entryValue, `${field}.dimensions.${key}`),\n }));\n const key = JSON.stringify(\n normalized.map((entry) => [entry.key, this.dimensionIdentity(entry.value)]),\n );\n const label = normalized\n .map((entry) => `${entry.key}=${this.dimensionLabel(entry.value)}`)\n .join(', ');\n const json = JSON.stringify(\n Object.fromEntries(normalized.map((entry) => [entry.key, entry.value])),\n );\n\n return { key, label, json };\n }\n\n private requireDimensionValue(value: unknown, field: string): string | number | boolean | null {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n throw new MetricGraphRenderError(`${field} must be a finite number, string, boolean, or null`);\n }\n\n private dimensionIdentity(value: string | number | boolean | null): string {\n if (value === null) {\n return 'null:null';\n }\n if (typeof value === 'number') {\n return `number:${this.exactNumber(value)}`;\n }\n return `${typeof value}:${String(value)}`;\n }\n\n private dimensionLabel(value: string | number | boolean | null): string {\n if (typeof value === 'string') {\n return /^[A-Za-z0-9_.:@/+-]+$/.test(value) ? value : JSON.stringify(value);\n }\n return value === null ? 'null' : String(value);\n }\n\n private readMeasurement(values: unknown, path: string, field: string): number {\n const parts = path.split('.');\n if (parts.some((part) => part.length === 0)) {\n throw new MetricGraphRenderError(`Invalid measurement path: ${path}`);\n }\n\n let current: unknown = values;\n for (const part of parts) {\n if (\n current === null ||\n typeof current !== 'object' ||\n !Object.prototype.hasOwnProperty.call(current, part)\n ) {\n throw new MetricGraphRenderError(\n `${field}.values does not contain numeric measurement ${path}`,\n );\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n if (typeof current !== 'number' || !Number.isFinite(current)) {\n throw new MetricGraphRenderError(\n `${field}.values measurement ${path} must be a finite number`,\n );\n }\n return current;\n }\n\n private comparePoints(left: GraphPoint, right: GraphPoint): number {\n return this.compareTuple(\n [\n left.startMs,\n left.endMs,\n left.seriesKey,\n left.definitionVersion,\n left.resolutionMs,\n this.exactNumber(left.value),\n ],\n [\n right.startMs,\n right.endMs,\n right.seriesKey,\n right.definitionVersion,\n right.resolutionMs,\n this.exactNumber(right.value),\n ],\n );\n }\n\n private groupSeries(points: GraphPoint[]): GraphSeries[] {\n const byKey = new Map<string, GraphSeries>();\n\n for (const point of points) {\n const existing = byKey.get(point.seriesKey);\n if (existing) {\n existing.points.push(point);\n continue;\n }\n byKey.set(point.seriesKey, {\n key: point.seriesKey,\n label: point.seriesLabel,\n dimensionsJson: point.dimensionsJson,\n points: [point],\n });\n }\n\n return [...byKey.values()].sort((left, right) =>\n this.compareTuple([left.label, left.key], [right.label, right.key]),\n );\n }\n\n private resolveTimeline(\n response: MetricQueryResponse,\n gaps: GraphGap[],\n points: GraphPoint[],\n ): GraphTimeline {\n const starts = [\n ...response.segments.map((segment) => segment.fromMs),\n ...gaps.map((gap) => gap.fromMs),\n ...points.map((point) => point.startMs),\n ].filter(Number.isFinite);\n const ends = [\n ...response.segments.map((segment) => segment.toMs),\n ...gaps.map((gap) => gap.toMs),\n ...points.map((point) => point.endMs),\n ].filter(Number.isFinite);\n\n if (starts.length === 0 || ends.length === 0) {\n return { fromMs: 0, toMs: 1, hasCoverage: false };\n }\n\n const fromMs = Math.min(...starts);\n const rawToMs = Math.max(...ends);\n return {\n fromMs,\n toMs: rawToMs > fromMs ? rawToMs : fromMs + 1,\n hasCoverage: true,\n };\n }\n\n private sortedUniqueNumbers(values: number[]): number[] {\n for (const value of values) {\n if (!Number.isFinite(value)) {\n throw new MetricGraphRenderError('Graph metadata contains a non-finite number');\n }\n }\n return [...new Set(values)].sort((left, right) => left - right);\n }\n\n private renderFormat(model: GraphModel): string {\n if (model.options.format === 'terminal') {\n return this.renderTerminal(model);\n }\n if (model.options.format === 'svg') {\n return this.renderSvg(model);\n }\n return this.renderHtml(model);\n }\n\n private renderTerminal(model: GraphModel): string {\n const lines = this.renderTerminalHeader(model);\n lines.push('', 'Series:');\n lines.push(...this.renderTerminalSeries(model));\n lines.push('', 'Plot:');\n lines.push(...this.renderTerminalPlot(model));\n lines.push('', 'Points (start -> end | series | value):');\n lines.push(...this.renderTerminalPoints(model));\n lines.push('', 'Gaps:');\n lines.push(...this.renderTerminalGaps(model));\n lines.push('', 'Partial failures:');\n lines.push(...this.renderTerminalPartialFailures(model));\n if (model.hasNextPage) {\n lines.push('', 'Pagination: incomplete (next cursor present)');\n }\n return `${lines.join('\\n')}\\n`;\n }\n\n private renderTerminalHeader(model: GraphModel): string[] {\n const coverage = model.timeline.hasCoverage\n ? `${this.formatTimestamp(model.timeline.fromMs, model.options.timezone)} -> ${this.formatTimestamp(model.timeline.toMs, model.options.timezone)}`\n : 'no coverage';\n return [\n 'Telemetry metric graph',\n `Type: ${model.options.type}`,\n `Target: ${this.terminalText(model.targetId)}`,\n `Metric: ${this.terminalText(model.metric)}`,\n `Measurement: ${this.terminalText(model.options.measurement)}`,\n `Definitions: ${model.definitions.join(', ') || 'none'}`,\n `Resolutions: ${model.resolutions.map((value) => `${value}ms`).join(', ') || 'none'}`,\n `Timezone: ${this.terminalText(model.options.timezone)}`,\n `Coverage: ${coverage}`,\n `Status: gaps=${model.gaps.length}; partialFailures=${model.partialFailures.length}; morePages=${model.hasNextPage ? 'yes' : 'no'}`,\n ];\n }\n\n private renderTerminalSeries(model: GraphModel): string[] {\n if (model.series.length === 0) {\n return [' (none)'];\n }\n return model.series.map(\n (series, index) => ` [${index + 1}] ${this.terminalText(series.label)}`,\n );\n }\n\n private renderTerminalPlot(model: GraphModel): string[] {\n if (model.points.length === 0) {\n return [' (no points)'];\n }\n if (model.options.type === 'line') {\n return this.renderTerminalLinePlot(model);\n }\n if (model.options.type === 'bar') {\n return this.renderTerminalBarPlot(model);\n }\n return this.renderTerminalStackedPlot(model);\n }\n\n private renderTerminalLinePlot(model: GraphModel): string[] {\n const values = model.points.map((point) => point.value);\n const minimum = Math.min(...values);\n const maximum = Math.max(...values);\n return model.series.map((series, index) => {\n const glyphs = series.points\n .map((point) => this.lineGlyph(point.value, minimum, maximum))\n .join('');\n const exactValues = series.points.map((point) => this.exactNumber(point.value)).join(', ');\n return ` [${index + 1}] ${glyphs} (${exactValues})`;\n });\n }\n\n private renderTerminalBarPlot(model: GraphModel): string[] {\n const maximum = Math.max(...model.points.map((point) => Math.abs(point.value)), 0);\n return model.points.map((point) => {\n const seriesIndex = this.seriesIndex(model, point.seriesKey);\n const glyph = this.barGlyph(point.value, maximum);\n return ` ${this.formatTimestamp(point.startMs, model.options.timezone)} [${seriesIndex + 1}] ${glyph} ${this.exactNumber(point.value)}`;\n });\n }\n\n private renderTerminalStackedPlot(model: GraphModel): string[] {\n const groups = this.groupBuckets(model.points);\n const maximum = Math.max(\n ...groups.map((group) =>\n Math.max(\n this.sumValues(\n group.points.filter((point) => point.value > 0).map((point) => point.value),\n ),\n Math.abs(\n this.sumValues(\n group.points.filter((point) => point.value < 0).map((point) => point.value),\n ),\n ),\n ),\n ),\n 0,\n );\n return groups.map((group) => {\n const components = group.points\n .map((point) => {\n const index = this.seriesIndex(model, point.seriesKey);\n return `[${index + 1}]=${this.exactNumber(point.value)}`;\n })\n .join(' ');\n const total = this.sumValues(group.points.map((point) => point.value));\n return ` ${this.formatTimestamp(group.startMs, model.options.timezone)} ${this.barGlyph(total, maximum)} ${components}`;\n });\n }\n\n private renderTerminalPoints(model: GraphModel): string[] {\n if (model.points.length === 0) {\n return [' (none)'];\n }\n return model.points.map((point) => {\n const start = this.formatTimestamp(point.startMs, model.options.timezone);\n const end = this.formatTimestamp(point.endMs, model.options.timezone);\n return ` ${start} -> ${end} | ${this.terminalText(point.seriesLabel)} | ${this.exactNumber(point.value)}`;\n });\n }\n\n private renderTerminalGaps(model: GraphModel): string[] {\n if (model.gaps.length === 0) {\n return [' (none)'];\n }\n return model.gaps.map(\n (gap) =>\n ` GAP ${this.formatTimestamp(gap.fromMs, model.options.timezone)} -> ${this.formatTimestamp(gap.toMs, model.options.timezone)} | ${this.terminalText(gap.reason)}`,\n );\n }\n\n private renderTerminalPartialFailures(model: GraphModel): string[] {\n if (model.partialFailures.length === 0) {\n return [' (none)'];\n }\n return model.partialFailures.map(\n (failure) =>\n ` PARTIAL ${this.terminalText(failure.targetId)} | ${this.terminalText(failure.reason)}`,\n );\n }\n\n private lineGlyph(value: number, minimum: number, maximum: number): string {\n const glyphs = '▁▂▃▄▅▆▇█';\n if (minimum === maximum) {\n return glyphs[3] ?? '▄';\n }\n const normalized = this.normalizedFraction(value, minimum, maximum);\n const index = Math.round(normalized * (glyphs.length - 1));\n return glyphs[index] ?? '▄';\n }\n\n private barGlyph(value: number, maximum: number): string {\n if (value === 0 || maximum === 0) {\n return '·';\n }\n const size = Math.max(1, Math.round((Math.abs(value) / maximum) * TERMINAL_BAR_WIDTH));\n const bar = '█'.repeat(size);\n return value < 0 ? `◀${bar}` : bar;\n }\n\n private renderSvg(model: GraphModel): string {\n const scale = this.createScale(model);\n const title = `${model.metric} — ${model.options.measurement}`;\n const parts = [\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${model.options.width}\" height=\"${model.options.height}\" viewBox=\"0 0 ${model.options.width} ${model.options.height}\" role=\"img\" aria-labelledby=\"telemetry-graph-title telemetry-graph-desc\">`,\n `<title id=\"telemetry-graph-title\">${this.escapeMarkup(title)}</title>`,\n `<desc id=\"telemetry-graph-desc\">${this.escapeMarkup(this.svgDescription(model))}</desc>`,\n '<defs><pattern id=\"telemetry-gap-pattern\" width=\"8\" height=\"8\" patternUnits=\"userSpaceOnUse\" patternTransform=\"rotate(45)\"><line x1=\"0\" y1=\"0\" x2=\"0\" y2=\"8\" stroke=\"#dc2626\" stroke-width=\"3\" opacity=\"0.35\"/></pattern></defs>',\n '<style>.bg{fill:#fff}.axis{stroke:#64748b;stroke-width:1}.grid{stroke:#e2e8f0;stroke-width:1}.label{font:12px ui-monospace,SFMono-Regular,Menlo,monospace;fill:#334155}.title{font:600 18px system-ui,sans-serif;fill:#0f172a}.meta{font:12px system-ui,sans-serif;fill:#475569}.warning{font:600 12px system-ui,sans-serif;fill:#b91c1c}.gap{fill:url(#telemetry-gap-pattern);stroke:#dc2626;stroke-width:1}.point{stroke:#fff;stroke-width:1.5}.bar{stroke:#fff;stroke-width:.75}</style>',\n `<rect class=\"bg\" x=\"0\" y=\"0\" width=\"${model.options.width}\" height=\"${model.options.height}\"/>`,\n `<text class=\"title\" x=\"24\" y=\"28\">${this.escapeMarkup(title)}</text>`,\n `<text class=\"meta\" x=\"24\" y=\"50\">${this.escapeMarkup(this.svgMetadata(model))}</text>`,\n `<text class=\"${this.hasWarnings(model) ? 'warning' : 'meta'}\" x=\"24\" y=\"72\">${this.escapeMarkup(this.svgStatus(model))}</text>`,\n ...this.renderSvgAxes(model, scale),\n ...this.renderSvgData(model, scale),\n ...this.renderSvgGaps(model, scale),\n ...this.renderSvgLegend(model, scale),\n '</svg>',\n ];\n return `${parts.join('\\n')}\\n`;\n }\n\n private svgDescription(model: GraphModel): string {\n const partial = model.partialFailures\n .map((failure) => `${failure.targetId}: ${failure.reason}`)\n .join('; ');\n const gaps = model.gaps.map((gap) => `${gap.fromMs}-${gap.toMs}: ${gap.reason}`).join('; ');\n const coverage = model.timeline.hasCoverage\n ? `${model.timeline.fromMs}-${model.timeline.toMs}`\n : 'none';\n return `Target ${model.targetId}; metric ${model.metric}; measurement ${model.options.measurement}; type ${model.options.type}; timezone ${model.options.timezone}; coverage ${coverage}; gaps ${gaps || 'none'}; partial failures ${partial || 'none'}; next page ${model.hasNextPage ? 'present' : 'absent'}`;\n }\n\n private svgMetadata(model: GraphModel): string {\n const definitions = model.definitions.join(',') || 'none';\n const resolutions = model.resolutions.map((value) => `${value}ms`).join(',') || 'none';\n const coverage = model.timeline.hasCoverage\n ? `${this.formatTimestamp(model.timeline.fromMs, model.options.timezone)}–${this.formatTimestamp(model.timeline.toMs, model.options.timezone)}`\n : 'none';\n return `target=${model.targetId} · definitions=${definitions} · resolutions=${resolutions} · timezone=${model.options.timezone} · coverage=${coverage}`;\n }\n\n private svgStatus(model: GraphModel): string {\n const failureText = model.partialFailures\n .map((failure) => `${failure.targetId}: ${failure.reason}`)\n .join(' | ');\n const parts = [\n `gaps=${model.gaps.length}`,\n `partialFailures=${model.partialFailures.length}`,\n `morePages=${model.hasNextPage ? 'yes' : 'no'}`,\n ];\n if (failureText) {\n parts.push(`PARTIAL: ${failureText}`);\n }\n return parts.join(' · ');\n }\n\n private hasWarnings(model: GraphModel): boolean {\n return model.gaps.length > 0 || model.partialFailures.length > 0 || model.hasNextPage;\n }\n\n private createScale(model: GraphModel): GraphScale {\n const left = 76;\n const right = model.options.width - 28;\n const legendColumns = this.legendColumns(model.options.width);\n const legendRows = Math.ceil(model.series.length / legendColumns);\n const top = 104;\n const bottom = model.options.height - 62 - legendRows * 19;\n if (bottom - top < 80) {\n throw new MetricGraphRenderError('Graph height is too small for the selected series legend');\n }\n\n const [yMin, yMax] = this.valueDomain(model);\n const xSpan = model.timeline.toMs - model.timeline.fromMs;\n const yFactor = Math.max(Math.abs(yMin), Math.abs(yMax), 1);\n const normalizedYMin = yMin / yFactor;\n const normalizedYSpan = yMax / yFactor - normalizedYMin;\n return {\n left,\n right,\n top,\n bottom,\n x: (value) => left + ((value - model.timeline.fromMs) / xSpan) * (right - left),\n y: (value) =>\n bottom - ((value / yFactor - normalizedYMin) / normalizedYSpan) * (bottom - top),\n yMin,\n yMax,\n };\n }\n\n private valueDomain(model: GraphModel): [number, number] {\n if (model.points.length === 0) {\n return [0, 1];\n }\n if (model.options.type === 'stacked-bar') {\n return this.stackedValueDomain(model.points);\n }\n const values = model.points.map((point) => point.value);\n const minimum = Math.min(0, ...values);\n const maximum = Math.max(0, ...values);\n return this.nonZeroDomain(minimum, maximum);\n }\n\n private stackedValueDomain(points: GraphPoint[]): [number, number] {\n const totals = this.groupBuckets(points).map((group) => ({\n negative: this.sumValues(\n group.points.filter((point) => point.value < 0).map((point) => point.value),\n ),\n positive: this.sumValues(\n group.points.filter((point) => point.value >= 0).map((point) => point.value),\n ),\n }));\n return this.nonZeroDomain(\n Math.min(0, ...totals.map((total) => total.negative)),\n Math.max(0, ...totals.map((total) => total.positive)),\n );\n }\n\n private nonZeroDomain(minimum: number, maximum: number): [number, number] {\n if (minimum === maximum) {\n return minimum === 0 ? [0, 1] : [minimum, minimum + 1];\n }\n return [minimum, maximum];\n }\n\n private renderSvgAxes(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n const tickCount = 5;\n for (let index = 0; index < tickCount; index += 1) {\n const fraction = index / (tickCount - 1);\n const value = this.interpolate(scale.yMax, scale.yMin, fraction);\n const y = scale.y(value);\n lines.push(\n `<line class=\"grid\" x1=\"${this.coordinate(scale.left)}\" y1=\"${this.coordinate(y)}\" x2=\"${this.coordinate(scale.right)}\" y2=\"${this.coordinate(y)}\"/>`,\n `<text class=\"label\" x=\"${this.coordinate(scale.left - 8)}\" y=\"${this.coordinate(y + 4)}\" text-anchor=\"end\">${this.escapeMarkup(this.axisNumber(value))}</text>`,\n );\n }\n lines.push(\n `<line class=\"axis\" x1=\"${scale.left}\" y1=\"${scale.top}\" x2=\"${scale.left}\" y2=\"${scale.bottom}\"/>`,\n `<line class=\"axis\" x1=\"${scale.left}\" y1=\"${scale.bottom}\" x2=\"${scale.right}\" y2=\"${scale.bottom}\"/>`,\n `<text class=\"label\" x=\"${scale.left}\" y=\"${scale.bottom + 20}\" text-anchor=\"start\">${this.escapeMarkup(this.timelineLabel(model, model.timeline.fromMs))}</text>`,\n `<text class=\"label\" x=\"${scale.right}\" y=\"${scale.bottom + 20}\" text-anchor=\"end\">${this.escapeMarkup(this.timelineLabel(model, model.timeline.toMs))}</text>`,\n );\n return lines;\n }\n\n private renderSvgData(model: GraphModel, scale: GraphScale): string[] {\n if (model.options.type === 'line') {\n return this.renderSvgLines(model, scale);\n }\n if (model.options.type === 'bar') {\n return this.renderSvgBars(model, scale);\n }\n return this.renderSvgStackedBars(model, scale);\n }\n\n private renderSvgLines(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n model.series.forEach((series, seriesIndex) => {\n const color = this.seriesColor(seriesIndex);\n const runs = this.splitLineRuns(series.points, model.gaps);\n for (const run of runs) {\n if (run.length > 1) {\n const points = run\n .map(\n (point) =>\n `${this.coordinate(scale.x(this.pointCenter(point)))},${this.coordinate(scale.y(point.value))}`,\n )\n .join(' ');\n lines.push(\n `<polyline fill=\"none\" stroke=\"${color}\" stroke-width=\"2\" points=\"${points}\"/>`,\n );\n }\n }\n for (const point of series.points) {\n lines.push(\n `<circle class=\"point\" fill=\"${color}\" cx=\"${this.coordinate(scale.x(this.pointCenter(point)))}\" cy=\"${this.coordinate(scale.y(point.value))}\" r=\"4\" ${this.svgPointAttributes(point)}><title>${this.escapeMarkup(this.pointTitle(point, model.options.timezone))}</title></circle>`,\n );\n }\n });\n return lines;\n }\n\n private splitLineRuns(points: GraphPoint[], gaps: GraphGap[]): GraphPoint[][] {\n const runs: GraphPoint[][] = [];\n let current: GraphPoint[] = [];\n for (const point of points) {\n const previous = current[current.length - 1];\n if (previous && this.hasGapBetween(previous, point, gaps)) {\n runs.push(current);\n current = [];\n }\n current.push(point);\n }\n if (current.length > 0) {\n runs.push(current);\n }\n return runs;\n }\n\n private hasGapBetween(previous: GraphPoint, next: GraphPoint, gaps: GraphGap[]): boolean {\n const previousCenter = this.pointCenter(previous);\n const nextCenter = this.pointCenter(next);\n return gaps.some((gap) => gap.fromMs < nextCenter && gap.toMs > previousCenter);\n }\n\n private renderSvgBars(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n const seriesCount = Math.max(1, model.series.length);\n for (const point of model.points) {\n const seriesIndex = this.seriesIndex(model, point.seriesKey);\n const bucketLeft = scale.x(point.startMs);\n const bucketRight = scale.x(point.endMs);\n const availableWidth = Math.max(1, bucketRight - bucketLeft) * 0.82;\n const barWidth = Math.max(0.5, availableWidth / seriesCount);\n const x =\n bucketLeft + (bucketRight - bucketLeft - availableWidth) / 2 + seriesIndex * barWidth;\n const zeroY = scale.y(0);\n const valueY = scale.y(point.value);\n lines.push(\n `<rect class=\"bar\" fill=\"${this.seriesColor(seriesIndex)}\" x=\"${this.coordinate(x)}\" y=\"${this.coordinate(Math.min(zeroY, valueY))}\" width=\"${this.coordinate(barWidth)}\" height=\"${this.coordinate(Math.max(1, Math.abs(zeroY - valueY)))}\" ${this.svgPointAttributes(point)}><title>${this.escapeMarkup(this.pointTitle(point, model.options.timezone))}</title></rect>`,\n );\n }\n return lines;\n }\n\n private renderSvgStackedBars(model: GraphModel, scale: GraphScale): string[] {\n const lines: string[] = [];\n for (const group of this.groupBuckets(model.points)) {\n const bucketLeft = scale.x(group.startMs);\n const bucketRight = scale.x(group.endMs);\n const width = Math.max(0.5, (bucketRight - bucketLeft) * 0.72);\n const x = bucketLeft + (bucketRight - bucketLeft - width) / 2;\n let positiveBase = 0;\n let negativeBase = 0;\n\n for (const point of group.points) {\n const seriesIndex = this.seriesIndex(model, point.seriesKey);\n const base = point.value >= 0 ? positiveBase : negativeBase;\n const next = base + point.value;\n const baseY = scale.y(base);\n const nextY = scale.y(next);\n lines.push(\n `<rect class=\"bar\" fill=\"${this.seriesColor(seriesIndex)}\" x=\"${this.coordinate(x)}\" y=\"${this.coordinate(Math.min(baseY, nextY))}\" width=\"${this.coordinate(width)}\" height=\"${this.coordinate(Math.max(1, Math.abs(baseY - nextY)))}\" data-stack-base=\"${this.escapeMarkup(this.exactNumber(base))}\" ${this.svgPointAttributes(point)}><title>${this.escapeMarkup(this.pointTitle(point, model.options.timezone))}</title></rect>`,\n );\n if (point.value >= 0) {\n positiveBase = next;\n } else {\n negativeBase = next;\n }\n }\n }\n return lines;\n }\n\n private renderSvgGaps(model: GraphModel, scale: GraphScale): string[] {\n return model.gaps.map((gap) => {\n const start = Math.max(model.timeline.fromMs, gap.fromMs);\n const end = Math.min(model.timeline.toMs, gap.toMs);\n const x = scale.x(start);\n const width = Math.max(2, scale.x(end) - x);\n const title = `GAP ${this.formatTimestamp(gap.fromMs, model.options.timezone)} to ${this.formatTimestamp(gap.toMs, model.options.timezone)}: ${gap.reason}`;\n return `<rect class=\"gap\" x=\"${this.coordinate(x)}\" y=\"${scale.top}\" width=\"${this.coordinate(width)}\" height=\"${this.coordinate(scale.bottom - scale.top)}\" data-gap-from-ms=\"${gap.fromMs}\" data-gap-to-ms=\"${gap.toMs}\" data-gap-reason=\"${this.escapeMarkup(this.terminalText(gap.reason))}\"><title>${this.escapeMarkup(title)}</title></rect>`;\n });\n }\n\n private renderSvgLegend(model: GraphModel, scale: GraphScale): string[] {\n if (model.series.length === 0) {\n return [\n `<text class=\"meta\" x=\"${scale.left}\" y=\"${scale.bottom + 48}\">No metric points returned.</text>`,\n ];\n }\n const columns = this.legendColumns(model.options.width);\n const columnWidth = (scale.right - scale.left) / columns;\n return model.series.map((series, index) => {\n const column = index % columns;\n const row = Math.floor(index / columns);\n const x = scale.left + column * columnWidth;\n const y = scale.bottom + 48 + row * 19;\n return `<g class=\"legend-item\" data-series=\"${this.escapeMarkup(this.terminalText(series.label))}\"><circle cx=\"${this.coordinate(x)}\" cy=\"${this.coordinate(y - 4)}\" r=\"5\" fill=\"${this.seriesColor(index)}\"/><text class=\"label\" x=\"${this.coordinate(x + 10)}\" y=\"${this.coordinate(y)}\">${this.escapeMarkup(series.label)}</text></g>`;\n });\n }\n\n private legendColumns(width: number): number {\n return Math.max(1, Math.min(4, Math.floor((width - 100) / 220)));\n }\n\n private svgPointAttributes(point: GraphPoint): string {\n return [\n `data-start-ms=\"${point.startMs}\"`,\n `data-end-ms=\"${point.endMs}\"`,\n `data-series=\"${this.escapeMarkup(this.terminalText(point.seriesLabel))}\"`,\n `data-dimensions=\"${this.escapeMarkup(this.terminalText(point.dimensionsJson))}\"`,\n `data-value=\"${this.escapeMarkup(this.exactNumber(point.value))}\"`,\n `data-definition-version=\"${point.definitionVersion}\"`,\n `data-resolution-ms=\"${point.resolutionMs}\"`,\n ].join(' ');\n }\n\n private pointTitle(point: GraphPoint, timezone: string): string {\n return `${point.seriesLabel}: ${this.exactNumber(point.value)} (${this.formatTimestamp(point.startMs, timezone)} to ${this.formatTimestamp(point.endMs, timezone)})`;\n }\n\n private renderHtml(model: GraphModel): string {\n const title = `${model.metric} — ${model.options.measurement}`;\n const parts = [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head>',\n '<meta charset=\"utf-8\">',\n '<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">',\n '<meta http-equiv=\"Content-Security-Policy\" content=\"default-src \\'none\\'; style-src \\'unsafe-inline\\'\">',\n `<title>${this.escapeMarkup(title)}</title>`,\n '<style>body{margin:0;padding:24px;background:#f8fafc;color:#0f172a;font:14px system-ui,sans-serif}main{max-width:1200px;margin:auto}.panel{background:#fff;border:1px solid #cbd5e1;border-radius:10px;padding:18px;margin-bottom:18px;overflow:auto}h1,h2{margin:0 0 12px}.meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:8px}.warning{border-left:5px solid #dc2626;background:#fef2f2}table{border-collapse:collapse;width:100%;font:12px ui-monospace,SFMono-Regular,Menlo,monospace}th,td{border-bottom:1px solid #e2e8f0;padding:7px;text-align:left;vertical-align:top;white-space:nowrap}th{background:#f1f5f9}code{white-space:pre-wrap;overflow-wrap:anywhere}svg{max-width:100%;height:auto}</style>',\n '</head>',\n '<body>',\n '<main>',\n `<section class=\"panel\"><h1>${this.escapeMarkup(title)}</h1><div class=\"meta\">${this.renderHtmlMetadata(model)}</div></section>`,\n ...(this.hasWarnings(model) ? [this.renderHtmlWarnings(model)] : []),\n `<section class=\"panel\" aria-label=\"Metric graph\">${this.renderSvg(model)}</section>`,\n this.renderHtmlPoints(model),\n this.renderHtmlGaps(model),\n this.renderHtmlPartialFailures(model),\n '</main>',\n '</body>',\n '</html>',\n ];\n return `${parts.join('\\n')}\\n`;\n }\n\n private renderHtmlMetadata(model: GraphModel): string {\n const coverage = model.timeline.hasCoverage\n ? `${this.formatTimestamp(model.timeline.fromMs, model.options.timezone)} → ${this.formatTimestamp(model.timeline.toMs, model.options.timezone)}`\n : 'No coverage';\n const entries = [\n ['Target', model.targetId],\n ['Metric', model.metric],\n ['Measurement', model.options.measurement],\n ['Graph type', model.options.type],\n ['Definition versions', model.definitions.join(', ') || 'none'],\n ['Resolutions', model.resolutions.map((value) => `${value}ms`).join(', ') || 'none'],\n ['Timezone', model.options.timezone],\n ['Coverage', coverage],\n ];\n return entries\n .map(\n ([label, value]) =>\n `<div><strong>${this.escapeMarkup(label ?? '')}</strong><br><code>${this.escapeMarkup(value ?? '')}</code></div>`,\n )\n .join('');\n }\n\n private renderHtmlWarnings(model: GraphModel): string {\n const warnings = [\n ...(model.gaps.length > 0\n ? [`${model.gaps.length} coverage gap(s) are marked on the graph.`]\n : []),\n ...(model.partialFailures.length > 0\n ? [`${model.partialFailures.length} storage target(s) reported partial failure.`]\n : []),\n ...(model.hasNextPage\n ? ['The query has another page; this graph is explicitly incomplete.']\n : []),\n ];\n return `<section class=\"panel warning\" role=\"alert\"><h2>Incomplete coverage</h2><ul>${warnings.map((warning) => `<li>${this.escapeMarkup(warning)}</li>`).join('')}</ul></section>`;\n }\n\n private renderHtmlPoints(model: GraphModel): string {\n const rows = model.points\n .map(\n (point) =>\n `<tr><td>${this.escapeMarkup(this.formatTimestamp(point.startMs, model.options.timezone))}</td><td>${this.escapeMarkup(this.formatTimestamp(point.endMs, model.options.timezone))}</td><td>${this.escapeMarkup(point.seriesLabel)}</td><td><code>${this.escapeMarkup(point.dimensionsJson)}</code></td><td>${this.escapeMarkup(this.exactNumber(point.value))}</td><td>${point.definitionVersion}</td><td>${point.resolutionMs}</td></tr>`,\n )\n .join('');\n const body = rows || '<tr><td colspan=\"7\">No metric points returned.</td></tr>';\n return `<section class=\"panel\"><h2>Exact bucket values</h2><table><thead><tr><th>Start</th><th>End</th><th>Series</th><th>Dimensions</th><th>Value</th><th>Definition</th><th>Resolution (ms)</th></tr></thead><tbody>${body}</tbody></table></section>`;\n }\n\n private renderHtmlGaps(model: GraphModel): string {\n const rows = model.gaps\n .map(\n (gap) =>\n `<tr><td>${this.escapeMarkup(this.formatTimestamp(gap.fromMs, model.options.timezone))}</td><td>${this.escapeMarkup(this.formatTimestamp(gap.toMs, model.options.timezone))}</td><td>${this.escapeMarkup(gap.reason)}</td></tr>`,\n )\n .join('');\n const body = rows || '<tr><td colspan=\"3\">No coverage gaps.</td></tr>';\n return `<section class=\"panel\"><h2>Coverage gaps</h2><table><thead><tr><th>From</th><th>To</th><th>Reason</th></tr></thead><tbody>${body}</tbody></table></section>`;\n }\n\n private renderHtmlPartialFailures(model: GraphModel): string {\n const rows = model.partialFailures\n .map(\n (failure) =>\n `<tr><td>${this.escapeMarkup(failure.targetId)}</td><td>${this.escapeMarkup(failure.reason)}</td></tr>`,\n )\n .join('');\n const body = rows || '<tr><td colspan=\"2\">No partial target failures.</td></tr>';\n return `<section class=\"panel\"><h2>Partial target failures</h2><table><thead><tr><th>Target</th><th>Reason</th></tr></thead><tbody>${body}</tbody></table></section>`;\n }\n\n private groupBuckets(points: GraphPoint[]): BucketGroup[] {\n const byInterval = new Map<string, BucketGroup>();\n for (const point of points) {\n const key = `${point.startMs}:${point.endMs}`;\n const existing = byInterval.get(key);\n if (existing) {\n existing.points.push(point);\n } else {\n byInterval.set(key, {\n startMs: point.startMs,\n endMs: point.endMs,\n points: [point],\n });\n }\n }\n return [...byInterval.values()]\n .map((group) => ({\n ...group,\n points: [...group.points].sort((left, right) =>\n this.compareTuple(\n [left.seriesKey, this.exactNumber(left.value)],\n [right.seriesKey, this.exactNumber(right.value)],\n ),\n ),\n }))\n .sort((left, right) =>\n this.compareTuple([left.startMs, left.endMs], [right.startMs, right.endMs]),\n );\n }\n\n private seriesIndex(model: GraphModel, seriesKey: string): number {\n const index = model.series.findIndex((series) => series.key === seriesKey);\n if (index < 0) {\n throw new MetricGraphRenderError(`Series is missing from graph model: ${seriesKey}`);\n }\n return index;\n }\n\n private seriesColor(index: number): string {\n return SVG_COLORS[index % SVG_COLORS.length] ?? SVG_COLORS[0];\n }\n\n private pointCenter(point: GraphPoint): number {\n return point.startMs + (point.endMs - point.startMs) / 2;\n }\n\n private timelineLabel(model: GraphModel, value: number): string {\n return model.timeline.hasCoverage\n ? this.formatTimestamp(value, model.options.timezone)\n : 'no coverage';\n }\n\n private formatTimestamp(value: number, timezone: string): string {\n const date = new Date(value);\n const formatter = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23',\n timeZoneName: 'short',\n });\n const parts = Object.fromEntries(\n formatter\n .formatToParts(date)\n .filter((part) => part.type !== 'literal')\n .map((part) => [part.type, part.value]),\n );\n const milliseconds = String(date.getUTCMilliseconds()).padStart(3, '0');\n return `${parts.year}-${parts.month}-${parts.day} ${parts.hour}:${parts.minute}:${parts.second}.${milliseconds} ${parts.timeZoneName}`;\n }\n\n private exactNumber(value: number): string {\n return Object.is(value, -0) ? '-0' : String(value);\n }\n\n private axisNumber(value: number): string {\n return this.exactNumber(Number(value.toPrecision(6)));\n }\n\n private coordinate(value: number): string {\n return this.exactNumber(Number(value.toFixed(2)));\n }\n\n private isValidTimestamp(value: number): boolean {\n return Number.isSafeInteger(value) && !Number.isNaN(new Date(value).getTime());\n }\n\n private normalizedFraction(value: number, minimum: number, maximum: number): number {\n const factor = Math.max(Math.abs(minimum), Math.abs(maximum), 1);\n const normalizedMinimum = minimum / factor;\n return (value / factor - normalizedMinimum) / (maximum / factor - normalizedMinimum);\n }\n\n private interpolate(from: number, to: number, fraction: number): number {\n const factor = Math.max(Math.abs(from), Math.abs(to), 1);\n return (from / factor + (to / factor - from / factor) * fraction) * factor;\n }\n\n private sumValues(values: number[]): number {\n const total = values.reduce((sum, value) => sum + value, 0);\n if (!Number.isFinite(total)) {\n throw new MetricGraphRenderError('Stacked metric values exceed the finite numeric range');\n }\n return total;\n }\n\n private terminalText(value: string): string {\n return value.replace(\n /[\\u0000-\\u001f\\u007f-\\u009f]/g,\n (character) => `\\\\u${character.charCodeAt(0).toString(16).padStart(4, '0')}`,\n );\n }\n\n private escapeMarkup(value: string): string {\n return this.terminalText(value)\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n private compareText(left: string, right: string): number {\n if (left === right) {\n return 0;\n }\n return left < right ? -1 : 1;\n }\n\n private compareTuple(left: Array<number | string>, right: Array<number | string>): number {\n const length = Math.min(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const leftValue = left[index];\n const rightValue = right[index];\n if (leftValue === rightValue) {\n continue;\n }\n if (leftValue === undefined || rightValue === undefined) {\n return leftValue === undefined ? -1 : 1;\n }\n return leftValue < rightValue ? -1 : 1;\n }\n return left.length - right.length;\n }\n\n private utf8ByteLength(value: string): number {\n let bytes = 0;\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint <= 0x7f) {\n bytes += 1;\n } else if (codePoint <= 0x7ff) {\n bytes += 2;\n } else if (codePoint <= 0xffff) {\n bytes += 3;\n } else {\n bytes += 4;\n }\n }\n return bytes;\n }\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport BetterSqlite3 from 'better-sqlite3';\nimport type { SqliteTargetConfiguration } from '../core/types/configuration.types.js';\nimport type { TelemetryJsonObject } from '../core/types/json.types.js';\nimport type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricBucket,\n MetricDimensionFilter,\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\n\n/** Projector destination written beside the raw trace store by run-trace-projector (spec 05 §4.1). */\nexport const HISTORY_DATABASE_NAME = 'history.db';\n\nconst AGGREGATES = new Set(['count', 'sum', 'min', 'max', 'last', 'avg']);\n\ntype MeasurementState = { count: number; sum: number; min: number; max: number; last: number };\n\ntype BucketRow = {\n projection_version: number;\n bucket_start_ms: number;\n dimensions_json: string;\n count: number;\n values_json: string;\n};\n\n/**\n * Where the projector's history store lives for a configured target: the\n * `history.db` sibling of the target's `telemetry.db`.\n */\nexport function historyDatabasePath(target: SqliteTargetConfiguration): string {\n return join(dirname(target.path), HISTORY_DATABASE_NAME);\n}\n\n/**\n * Metric queries over the projector's pre-aggregated buckets\n * (`trace_metric_buckets` in history.db), answering the same MetricQuery the\n * legacy rollup reader does so `metrics query` / `metrics graph` output and\n * charts are unchanged.\n *\n * Buckets are already collapsed per (metric, version, resolution, minute,\n * dimensions), so a query is one indexed range scan — no re-aggregation at\n * read time. Measurements are `count` (events in the bucket) or\n * `<field>.<sum|min|max|last|count|avg>` over the projected numeric field.\n * Multiple registered versions of a metric are never merged: the highest\n * version with buckets in range is returned, and the rest are reported as\n * partial failures so a version boundary is visible rather than silent.\n */\nexport class HistoryMetricReader {\n private constructor(\n private readonly db: BetterSqlite3.Database,\n private readonly definitions: readonly MetricDefinition[],\n ) {}\n\n static open(databasePath: string, definitions: readonly MetricDefinition[]): HistoryMetricReader {\n const db = new BetterSqlite3(databasePath, { readonly: true, fileMustExist: true });\n db.pragma('busy_timeout = 1000');\n db.pragma('query_only = ON');\n return new HistoryMetricReader(db, definitions);\n }\n\n static exists(databasePath: string): boolean {\n return existsSync(databasePath);\n }\n\n metrics(query: MetricQuery, targetId: string): TelemetryResult<MetricQueryResponse, TelemetryQueryError> {\n if (query.toMs <= query.fromMs) {\n return { ok: false, error: { kind: 'invalid-query', message: '--to must be after --from' } };\n }\n const invalidMeasurement = query.measurements.find((measurement) => !isMeasurement(measurement));\n if (invalidMeasurement !== undefined) {\n return {\n ok: false,\n error: {\n kind: 'invalid-query',\n message: `Unknown measurement ${invalidMeasurement}; use count or <field>.<sum|min|max|last|count|avg>`,\n },\n };\n }\n const versions = this.registeredVersions(query.metric);\n if (versions.length === 0) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: `Metric ${query.metric} has no projection in history.db` },\n };\n }\n const resolutionMs = this.resolveResolution(query, versions);\n if (resolutionMs === null) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: `Metric ${query.metric} is not projected at the requested resolution` },\n };\n }\n\n // Newest version first: the current definition is what the caller means.\n for (let index = versions.length - 1; index >= 0; index -= 1) {\n const version = versions[index]!;\n const buckets = this.readBuckets(query, version, resolutionMs);\n if (buckets.length === 0) continue;\n const olderVersions = versions.slice(0, index);\n return {\n ok: true,\n value: Object.freeze({\n targetId,\n metric: query.metric,\n segments: [Object.freeze({\n fromMs: query.fromMs,\n toMs: query.toMs,\n resolutionMs,\n isAggregated: true as const,\n definitionVersion: version,\n buckets,\n })],\n gaps: [],\n nextCursor: null,\n partialFailures: olderVersions.map((older) => Object.freeze({\n targetId,\n reason: `version ${older} buckets omitted; only version ${version} returned`,\n })),\n }),\n };\n }\n return {\n ok: true,\n value: Object.freeze({\n targetId,\n metric: query.metric,\n segments: [],\n gaps: [Object.freeze({ fromMs: query.fromMs, toMs: query.toMs, reason: 'not-materialized' as const })],\n nextCursor: null,\n partialFailures: [],\n }),\n };\n }\n\n close(): void {\n if (this.db.open) this.db.close();\n }\n\n private registeredVersions(metric: string): number[] {\n const rows = this.db.prepare(\n 'SELECT projection_version FROM trace_projection_definitions WHERE projection_name = ? ORDER BY projection_version',\n ).all(metric) as Array<{ projection_version: number }>;\n return rows.map((row) => row.projection_version);\n }\n\n private resolveResolution(query: MetricQuery, versions: readonly number[]): number | null {\n const available = this.definitions\n .filter((definition) => definition.name === query.metric && versions.includes(definition.version))\n .flatMap((definition) => [...definition.resolutionsMs]);\n const resolutions = [...new Set(available.length > 0 ? available : this.storedResolutions(query.metric))]\n .sort((a, b) => a - b);\n if (resolutions.length === 0) return null;\n if (query.resolution !== 'auto') {\n return resolutions.includes(query.resolution) ? query.resolution : null;\n }\n // Finest resolution whose bucket count fits the limit; else the coarsest.\n const span = query.toMs - query.fromMs;\n return resolutions.find((resolution) => Math.ceil(span / resolution) <= query.limit)\n ?? resolutions[resolutions.length - 1]!;\n }\n\n private storedResolutions(metric: string): number[] {\n const rows = this.db.prepare(\n 'SELECT DISTINCT resolution_ms FROM trace_metric_buckets WHERE projection_name = ?',\n ).all(metric) as Array<{ resolution_ms: number }>;\n return rows.map((row) => row.resolution_ms);\n }\n\n private readBuckets(query: MetricQuery, version: number, resolutionMs: number): MetricBucket[] {\n const rows = this.db.prepare(`\n SELECT projection_version, bucket_start_ms, dimensions_json, count, values_json\n FROM trace_metric_buckets\n WHERE projection_name = ? AND projection_version = ? AND resolution_ms = ?\n AND bucket_start_ms >= ? AND bucket_start_ms < ?\n ORDER BY bucket_start_ms ${query.order === 'desc' ? 'DESC' : 'ASC'}, dimension_key\n `).all(query.metric, version, resolutionMs, query.fromMs, query.toMs) as BucketRow[];\n\n const buckets: MetricBucket[] = [];\n for (const row of rows) {\n const dimensions = JSON.parse(row.dimensions_json) as Record<string, string>;\n if (!matchesWhere(dimensions, query.where)) continue;\n const values = JSON.parse(row.values_json) as Record<string, MeasurementState>;\n buckets.push(Object.freeze({\n startMs: row.bucket_start_ms,\n endMs: row.bucket_start_ms + resolutionMs,\n dimensions: dimensions as TelemetryJsonObject,\n values: selectMeasurements(query.measurements, row.count, values),\n }));\n if (buckets.length >= query.limit) break;\n }\n return buckets;\n }\n}\n\nfunction isMeasurement(measurement: string): boolean {\n if (measurement === 'count') return true;\n const dot = measurement.lastIndexOf('.');\n return dot > 0 && AGGREGATES.has(measurement.slice(dot + 1));\n}\n\n/**\n * Same shape the legacy rollup reader returns — `count` at the top and each\n * field as `{ aggregate: value }` — so the formatter and graph renderer read\n * both stores identically (`--measurement toolCount.sum` → `values.toolCount.sum`).\n * A field the projector never recorded for this bucket is omitted rather than\n * written as zero.\n */\nfunction selectMeasurements(\n measurements: readonly string[],\n bucketCount: number,\n values: Record<string, MeasurementState>,\n): TelemetryJsonObject {\n const selected: Record<string, number | Record<string, number>> = {};\n for (const measurement of measurements) {\n if (measurement === 'count') {\n selected.count = bucketCount;\n continue;\n }\n const dot = measurement.lastIndexOf('.');\n const field = measurement.slice(0, dot);\n const aggregate = measurement.slice(dot + 1);\n const state = values[field];\n if (state === undefined) continue;\n const value = aggregate === 'avg'\n ? (state.count > 0 ? state.sum / state.count : 0)\n : state[aggregate as keyof MeasurementState];\n if (!Number.isFinite(value)) continue;\n const existing = selected[field];\n selected[field] = { ...(typeof existing === 'object' ? existing : {}), [aggregate]: value };\n }\n return Object.freeze(selected) as TelemetryJsonObject;\n}\n\nfunction matchesWhere(\n dimensions: Record<string, string>,\n where: Readonly<Record<string, MetricDimensionFilter>>,\n): boolean {\n for (const [key, filter] of Object.entries(where)) {\n const actual = dimensions[key];\n if (actual === undefined) return false;\n const accepted = Array.isArray(filter) ? filter : [filter];\n // Bucket dimensions are stored as strings; compare the caller's JSON value by its string form.\n if (!accepted.some((candidate) => String(candidate) === actual)) return false;\n }\n return true;\n}\n","import { randomUUID } from 'node:crypto';\nimport { existsSync, statfsSync, statSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { MigrationRunnerFactory } from '@noego/proper';\nimport BetterSqlite3 from 'better-sqlite3';\nimport { createSqliteDb } from 'sqlstack/adapters';\nimport { telemetryChecksum } from '../core/helper/canonical_json.js';\nimport type { SqliteTargetConfiguration } from '../core/types/configuration.types.js';\nimport type { MetricDefinition } from '../core/types/metric.types.js';\nimport type {\n MetricQuery,\n MetricQueryResponse,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n SQLITE_LOGICAL_TABLE_NAMES,\n SQLITE_SCHEMA_MANIFEST_TABLE,\n} from '../storage/helper/sqlite_table_names.js';\nimport { SqliteOwnershipLease } from '../storage/sqlite_ownership_lease.js';\nimport { TelemetryProperSqlRunner } from '../storage/telemetry_proper_sql_runner.js';\nimport { TelemetryRepository } from '../storage/telemetry_repository.js';\nimport { TelemetryTableMap } from '../storage/telemetry_table_map.js';\nimport { TelemetrySchemaManifestRowSchema } from '../transports/schema/telemetry_schema_manifest.js';\nimport { ReadOnlySqlGuard } from './helper/read_only_sql_guard.js';\nimport type {\n TelemetryCliCompactionResult,\n TelemetryCliDiagnosticResult,\n TelemetryCliMigrationStatus,\n TelemetryCliSession,\n TelemetryCliSessionMode,\n} from './types/telemetry_cli.types.js';\n\nconst MIGRATIONS_DIRECTORY =\n typeof __dirname === 'string'\n ? resolve(__dirname, '../../migrations')\n : fileURLToPath(new URL('../../migrations/', import.meta.url));\n\nexport class OfflineSqliteTelemetrySession implements TelemetryCliSession {\n private connection: BetterSqlite3.Database | null = null;\n private repository: TelemetryRepository | null = null;\n private lease: SqliteOwnershipLease | null = null;\n private tableMap: TelemetryTableMap | null = null;\n private legacyManifest = false;\n\n private constructor(\n private readonly target: SqliteTargetConfiguration,\n private readonly mode: TelemetryCliSessionMode,\n private readonly definitions: readonly MetricDefinition[],\n private readonly now: () => number,\n private readonly sqlGuard: ReadOnlySqlGuard,\n ) {}\n\n static async create(\n target: SqliteTargetConfiguration,\n mode: TelemetryCliSessionMode,\n definitions: readonly MetricDefinition[],\n now: () => number = () => Date.now(),\n ): Promise<OfflineSqliteTelemetrySession> {\n const session = new OfflineSqliteTelemetrySession(\n target,\n mode,\n definitions,\n now,\n new ReadOnlySqlGuard(),\n );\n try {\n await session.open();\n return session;\n } catch (cause) {\n await session.close();\n throw cause;\n }\n }\n\n async timeline(\n query: TimelineQuery,\n ): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n this.requireQueryMode();\n const validation = this.validateQueryRange(\n query.targetId,\n query.fromMs,\n query.toMs,\n query.limit,\n );\n if (validation !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validation } };\n }\n return this.requireRepository().timeline(query, this.now() - this.target.retention.rawMs);\n }\n\n async metrics(\n query: MetricQuery,\n ): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n this.requireQueryMode();\n const validation = this.validateQueryRange(\n query.targetId,\n query.fromMs,\n query.toMs,\n query.limit,\n );\n if (validation !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validation } };\n }\n if (query.limit > this.target.query.maxBuckets) {\n return {\n ok: false,\n error: {\n kind: 'invalid-query',\n message: 'Metric query limit exceeds the configured bucket maximum',\n },\n };\n }\n const result = this.requireRepository().metrics(query);\n if (!result.ok) {\n return result;\n }\n const bucketCount = result.value.segments.reduce(\n (count, segment) => count + segment.buckets.length,\n 0,\n );\n if (bucketCount > this.target.query.maxBuckets) {\n return {\n ok: false,\n error: {\n kind: 'invalid-query',\n message: 'Metric query exceeds the configured bucket limit',\n },\n };\n }\n return result;\n }\n\n async diagnosticQuery(\n sql: string,\n bindings: Readonly<Record<string, unknown>>,\n limits: Readonly<{ maxRows: number; maxBytes: number; maxDurationMs: number }>,\n ): Promise<TelemetryCliDiagnosticResult> {\n this.requireQueryMode();\n const statement = this.sqlGuard.validate(sql);\n const prepared = this.requireConnection().prepare(statement.sql);\n if (!prepared.reader) {\n throw new Error('SQLite rejected diagnostic SQL as non-read-only');\n }\n const startedAt = this.now();\n const rows: Readonly<Record<string, unknown>>[] = [];\n let bytes = 0;\n let truncated = false;\n const iterator =\n Object.keys(bindings).length === 0 ? prepared.iterate() : prepared.iterate(bindings);\n for (const rawRow of iterator) {\n const row = this.requireRecord(rawRow);\n bytes += Buffer.byteLength(JSON.stringify(row), 'utf8');\n if (bytes > limits.maxBytes) {\n throw new Error('Diagnostic SQL response exceeds the configured byte limit');\n }\n if (this.now() - startedAt > limits.maxDurationMs) {\n throw new Error('Diagnostic SQL exceeded the configured time limit');\n }\n if (rows.length === limits.maxRows) {\n truncated = true;\n break;\n }\n rows.push(Object.freeze({ ...row }));\n }\n return Object.freeze({\n columns: Object.freeze(prepared.columns().map((column) => column.name)),\n rows: Object.freeze(rows),\n truncated,\n elapsedMs: this.now() - startedAt,\n });\n }\n\n async migrationStatus(): Promise<TelemetryCliMigrationStatus> {\n this.requireMaintenanceMode();\n const runner = await this.createMigrationRunner();\n const completed = await runner.getCompletedMigrations();\n const pending = await runner.getPendingMigrations();\n return this.migrationStatusResult(\n completed.map((migration) => migration.name),\n pending.map((migration) => migration.name),\n );\n }\n\n async migrateUp(): Promise<TelemetryCliMigrationStatus> {\n this.requireMaintenanceMode();\n const runner = await this.createMigrationRunner();\n const pending = await runner.getPendingMigrations();\n await runner.migrate(pending, true);\n if (this.legacyManifest) {\n this.upgradeLegacyManifest();\n }\n this.verifySchema();\n return this.migrationStatus();\n }\n\n async compact(): Promise<TelemetryCliCompactionResult> {\n this.requireMaintenanceMode();\n const connection = this.requireConnection();\n const maintenanceTable = this.requireTableMap().physical('maintenanceRuns');\n const runId = randomUUID();\n const startedAtMs = this.now();\n connection.prepare(\n `INSERT INTO \"${maintenanceTable}\" (\n target_id, run_id, state, stage, started_at_ms,\n completed_at_ms, affected_rows, affected_pages, detail\n ) VALUES (?, ?, 'started', 'compaction', ?, NULL, 0, 0, ?)`,\n ).run(this.target.targetId, runId, startedAtMs, 'offline-cli; outcome=started');\n try {\n const before = this.compactionSnapshot();\n connection.pragma('wal_checkpoint(TRUNCATE)');\n const checkpointed = this.compactionSnapshot();\n this.assertCompactionSpace(checkpointed);\n connection.pragma('auto_vacuum = INCREMENTAL');\n connection.exec('VACUUM');\n connection.pragma('wal_checkpoint(TRUNCATE)');\n const after = this.compactionSnapshot();\n if (after.autoVacuum !== 2) {\n throw new Error('Telemetry compaction did not enable auto_vacuum=INCREMENTAL');\n }\n const completedAtMs = this.now();\n const result = Object.freeze({\n targetId: this.target.targetId,\n autoVacuum: 'incremental' as const,\n pageSize: checkpointed.pageSize,\n pagesBefore: checkpointed.pageCount,\n pagesAfter: after.pageCount,\n freePagesBefore: checkpointed.freePages,\n freePagesAfter: after.freePages,\n reclaimedPages: Math.max(0, checkpointed.pageCount - after.pageCount),\n databaseBytesBefore: before.databaseBytes,\n databaseBytesAfter: after.databaseBytes,\n walBytesBefore: before.walBytes,\n walBytesAfter: after.walBytes,\n reclaimedBytes: Math.max(\n 0,\n before.databaseBytes + before.walBytes - after.databaseBytes - after.walBytes,\n ),\n elapsedMs: completedAtMs - startedAtMs,\n });\n connection.prepare(\n `UPDATE \"${maintenanceTable}\"\n SET state = 'completed', completed_at_ms = ?, affected_pages = ?, detail = ?\n WHERE target_id = ? AND run_id = ? AND stage = 'compaction'`,\n ).run(\n completedAtMs,\n result.reclaimedPages,\n JSON.stringify({\n mode: 'offline-cli',\n outcome: 'completed',\n reclaimedBytes: result.reclaimedBytes,\n walBytesBefore: result.walBytesBefore,\n walBytesAfter: result.walBytesAfter,\n autoVacuum: result.autoVacuum,\n }),\n this.target.targetId,\n runId,\n );\n return result;\n } catch (cause) {\n const message = cause instanceof Error ? cause.message : String(cause);\n try {\n connection.prepare(\n `UPDATE \"${maintenanceTable}\"\n SET state = 'failed', completed_at_ms = ?, detail = ?\n WHERE target_id = ? AND run_id = ? AND stage = 'compaction'`,\n ).run(\n this.now(),\n JSON.stringify({ mode: 'offline-cli', outcome: 'failed', error: message }),\n this.target.targetId,\n runId,\n );\n } catch {\n // Preserve the compaction failure when the database cannot persist its failure marker.\n }\n throw cause;\n }\n }\n\n async close(): Promise<void> {\n try {\n if (this.connection?.open) {\n this.connection.close();\n }\n } finally {\n this.connection = null;\n this.repository = null;\n this.tableMap = null;\n this.lease?.release();\n this.lease = null;\n }\n }\n\n private async open(): Promise<void> {\n const tableMap = TelemetryTableMap.create(this.target.schema);\n if (!tableMap.ok) {\n throw new Error(tableMap.error);\n }\n this.tableMap = tableMap.value;\n if (this.mode === 'maintenance') {\n this.lease = new SqliteOwnershipLease({\n targetId: this.target.targetId,\n databasePath: this.target.path,\n mode: 'offline-maintenance',\n expiryMs: this.target.leaseExpiryMs,\n processToken: randomUUID(),\n now: this.now,\n });\n const acquired = this.lease.acquire();\n if (!acquired.ok) {\n throw new Error(acquired.error);\n }\n }\n const connection = new BetterSqlite3(this.target.path, {\n readonly: this.mode === 'query',\n fileMustExist: true,\n });\n this.connection = connection;\n connection.pragma('foreign_keys = ON');\n connection.pragma('busy_timeout = 1000');\n if (this.mode === 'query') {\n connection.pragma('query_only = ON');\n }\n this.verifyManifest();\n if (this.mode === 'query') {\n const stackDatabase = await createSqliteDb(connection);\n this.repository = new TelemetryRepository({\n targetId: this.target.targetId,\n connection,\n stackDatabase,\n tableMap: tableMap.value,\n retention: this.target.retention,\n now: this.now,\n });\n const loaded = this.repository.loadDefinitionsReadOnly(this.definitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n }\n }\n\n private compactionSnapshot(): Readonly<{\n pageSize: number;\n pageCount: number;\n freePages: number;\n autoVacuum: number;\n databaseBytes: number;\n walBytes: number;\n }> {\n const connection = this.requireConnection();\n return Object.freeze({\n pageSize: Number(connection.pragma('page_size', { simple: true })),\n pageCount: Number(connection.pragma('page_count', { simple: true })),\n freePages: Number(connection.pragma('freelist_count', { simple: true })),\n autoVacuum: Number(connection.pragma('auto_vacuum', { simple: true })),\n databaseBytes: this.fileBytes(this.target.path),\n walBytes: this.fileBytes(`${this.target.path}-wal`),\n });\n }\n\n private assertCompactionSpace(snapshot: Readonly<{\n pageSize: number;\n pageCount: number;\n freePages: number;\n }>): void {\n const liveBytes = Math.max(0, snapshot.pageCount - snapshot.freePages) * snapshot.pageSize;\n const reserveBytes = Math.max(64 * 1024 * 1024, Math.ceil(liveBytes * 0.05));\n const filesystem = statfsSync(dirname(this.target.path));\n const availableBytes = Number(filesystem.bavail) * Number(filesystem.bsize);\n const requiredBytes = liveBytes + reserveBytes;\n if (availableBytes < requiredBytes) {\n throw new Error(\n `Telemetry compaction requires at least ${requiredBytes} free bytes; only ${availableBytes} are available`,\n );\n }\n }\n\n private fileBytes(path: string): number {\n return existsSync(path) ? statSync(path).size : 0;\n }\n\n private verifyManifest(): void {\n const rows = this.requireConnection()\n .prepare(\n `SELECT target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n FROM \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"`,\n )\n .all();\n if (rows.length !== 1) {\n throw new Error('Telemetry schema manifest must contain exactly one target mapping');\n }\n const parsed = TelemetrySchemaManifestRowSchema.safeParse(rows[0]);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n if (parsed.data.format_version !== 1 && parsed.data.format_version !== 2) {\n throw new Error(`Unsupported telemetry schema format ${parsed.data.format_version}`);\n }\n if (parsed.data.target_id !== this.target.targetId) {\n throw new Error(\n `Telemetry database belongs to target ${parsed.data.target_id}, not ${this.target.targetId}`,\n );\n }\n if (parsed.data.state !== 'ready') {\n throw new Error('Telemetry schema rename recovery is required before offline access');\n }\n if (parsed.data.mapping_checksum === this.requireTableMap().checksum) {\n return;\n }\n if (\n this.mode === 'maintenance' &&\n parsed.data.format_version === 1 &&\n this.isLegacyManifestMapping(parsed.data.mapping_json, parsed.data.mapping_checksum)\n ) {\n this.legacyManifest = true;\n return;\n }\n throw new Error('Telemetry table mapping differs from the schema manifest');\n }\n\n private isLegacyManifestMapping(mappingJson: string, mappingChecksum: string): boolean {\n const parsed: unknown = JSON.parse(mappingJson);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return false;\n }\n if (telemetryChecksum(parsed) !== mappingChecksum) {\n return false;\n }\n const expected = this.requireTableMap().manifestMapping();\n const legacyEntries = Object.entries(expected).filter(\n ([logicalName]) => logicalName !== 'committedDropCounters',\n );\n return (\n Object.keys(parsed).length === legacyEntries.length &&\n legacyEntries.every(([logicalName, physicalName]) => {\n return Reflect.get(parsed, logicalName) === physicalName;\n })\n );\n }\n\n private upgradeLegacyManifest(): void {\n const tableMap = this.requireTableMap();\n this.requireConnection()\n .prepare(\n `UPDATE \"${SQLITE_SCHEMA_MANIFEST_TABLE}\"\n SET format_version = 2, mapping_json = ?, mapping_checksum = ?, updated_at_ms = ?\n WHERE target_id = ?`,\n )\n .run(\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.now(),\n this.target.targetId,\n );\n this.legacyManifest = false;\n }\n\n private async createMigrationRunner() {\n return new MigrationRunnerFactory().create(\n {\n migration_folder: MIGRATIONS_DIRECTORY,\n migration_table: this.requireTableMap().quoted('migrationHistory'),\n database: 'sqlite',\n sqlite: { database: this.target.path },\n },\n new TelemetryProperSqlRunner(this.requireConnection(), this.requireTableMap()),\n );\n }\n\n private verifySchema(): void {\n const rows = this.requireConnection()\n .prepare(`SELECT name FROM sqlite_master WHERE type = 'table'`)\n .all();\n const names = new Set(\n rows.map((row) => {\n const record = this.requireRecord(row);\n const name = record.name;\n if (typeof name !== 'string') {\n throw new Error('SQLite schema returned an invalid table name');\n }\n return name;\n }),\n );\n const missing = SQLITE_LOGICAL_TABLE_NAMES.map((logicalName) =>\n this.requireTableMap().physical(logicalName),\n ).filter((name) => !names.has(name));\n if (missing.length > 0) {\n throw new Error(`Telemetry schema is missing table(s): ${missing.join(', ')}`);\n }\n }\n\n private validateQueryRange(\n targetId: string | null,\n fromMs: number,\n toMs: number,\n limit: number,\n ): string | null {\n if (targetId !== null && targetId !== this.target.targetId) {\n return `Query target ${targetId} does not match ${this.target.targetId}`;\n }\n if (!Number.isSafeInteger(fromMs) || !Number.isSafeInteger(toMs) || fromMs >= toMs) {\n return 'Query time range must use ascending millisecond timestamps';\n }\n if (toMs - fromMs > this.target.query.maxRangeMs) {\n return 'Query time range exceeds the configured maximum';\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > this.target.query.maxRows) {\n return 'Query row limit is outside the configured bounds';\n }\n return null;\n }\n\n private migrationStatusResult(\n completed: readonly string[],\n pending: readonly string[],\n ): TelemetryCliMigrationStatus {\n return Object.freeze({\n targetId: this.target.targetId,\n completed: Object.freeze([...completed].sort()),\n pending: Object.freeze([...pending].sort()),\n });\n }\n\n private requireQueryMode(): void {\n if (this.mode !== 'query') {\n throw new Error('This telemetry session is not open for queries');\n }\n }\n\n private requireMaintenanceMode(): void {\n if (this.mode !== 'maintenance') {\n throw new Error('This telemetry session is not open for migrations');\n }\n }\n\n private requireConnection(): BetterSqlite3.Database {\n if (this.connection === null) {\n throw new Error('Offline telemetry SQLite connection is closed');\n }\n return this.connection;\n }\n\n private requireRepository(): TelemetryRepository {\n if (this.repository === null) {\n throw new Error('Offline telemetry query repository is not initialized');\n }\n return this.repository;\n }\n\n private requireTableMap(): TelemetryTableMap {\n if (this.tableMap === null) {\n throw new Error('Offline telemetry table mapping is not initialized');\n }\n return this.tableMap;\n }\n\n private requireRecord(value: unknown): Readonly<Record<string, unknown>> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error('SQLite returned an invalid diagnostic row');\n }\n const record: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n record[key] = Reflect.get(value, key);\n }\n return Object.freeze(record);\n }\n}\n","import {\n closeSync,\n existsSync,\n mkdirSync,\n openSync,\n readFileSync,\n realpathSync,\n renameSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { dirname, resolve } from 'node:path';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n SqliteOwnershipLeaseOptions,\n SqliteOwnershipLeaseRecord,\n} from './types/sqlite_ownership_lease.types.js';\n\nexport class SqliteOwnershipLease {\n private readonly canonicalDatabasePath: string;\n private readonly leasePath: string;\n private held = false;\n\n constructor(private readonly options: SqliteOwnershipLeaseOptions) {\n mkdirSync(dirname(options.databasePath), { recursive: true });\n const canonicalDirectory = realpathSync(dirname(resolve(options.databasePath)));\n const databaseName = resolve(options.databasePath).slice(dirname(resolve(options.databasePath)).length + 1);\n this.canonicalDatabasePath = resolve(canonicalDirectory, databaseName);\n this.leasePath = `${this.canonicalDatabasePath}.telemetry-owner.json`;\n }\n\n acquire(): TelemetryResult<void, string> {\n const firstAttempt = this.writeExclusive(this.createRecord());\n if (firstAttempt.ok) {\n this.held = true;\n return firstAttempt;\n }\n\n const recovered = this.recoverStaleLease();\n if (!recovered.ok) {\n return recovered;\n }\n const secondAttempt = this.writeExclusive(this.createRecord());\n if (secondAttempt.ok) {\n this.held = true;\n }\n return secondAttempt;\n }\n\n heartbeat(): TelemetryResult<void, string> {\n if (!this.held) {\n return { ok: false, error: 'Cannot heartbeat a telemetry lease that is not held' };\n }\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n if (current.value.processToken !== this.options.processToken) {\n this.held = false;\n return { ok: false, error: 'Telemetry ownership lease was replaced by another owner' };\n }\n const now = this.options.now();\n return this.writeReplace({\n ...current.value,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n });\n }\n\n release(): void {\n if (!this.held || !existsSync(this.leasePath)) {\n this.held = false;\n return;\n }\n const current = this.readRecord();\n if (current.ok && current.value.processToken === this.options.processToken) {\n try {\n rmSync(this.leasePath, { force: true });\n } catch {\n // The lease will expire and can be recovered by a later owner.\n }\n }\n this.held = false;\n }\n\n isHeld(): boolean {\n return this.held;\n }\n\n path(): string {\n return this.leasePath;\n }\n\n private createRecord(): SqliteOwnershipLeaseRecord {\n const now = this.options.now();\n return {\n formatVersion: 1,\n targetId: this.options.targetId,\n databasePath: this.canonicalDatabasePath,\n mode: this.options.mode,\n pid: process.pid,\n processToken: this.options.processToken,\n acquiredAtMs: now,\n heartbeatAtMs: now,\n expiresAtMs: now + this.options.expiryMs,\n };\n }\n\n private writeExclusive(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n let descriptor: number | null = null;\n try {\n descriptor = openSync(this.leasePath, 'wx', 0o600);\n writeFileSync(descriptor, JSON.stringify(record), { encoding: 'utf8' });\n closeSync(descriptor);\n return { ok: true, value: undefined };\n } catch (cause) {\n if (descriptor !== null) {\n try {\n closeSync(descriptor);\n } catch {\n // Preserve the original lease acquisition error.\n }\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private writeReplace(record: SqliteOwnershipLeaseRecord): TelemetryResult<void, string> {\n const temporaryPath = `${this.leasePath}.${this.options.processToken}.tmp`;\n try {\n writeFileSync(temporaryPath, JSON.stringify(record), { encoding: 'utf8', mode: 0o600 });\n renameSync(temporaryPath, this.leasePath);\n return { ok: true, value: undefined };\n } catch (cause) {\n try {\n rmSync(temporaryPath, { force: true });\n } catch {\n // Preserve the original heartbeat write error.\n }\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private readRecord(): TelemetryResult<SqliteOwnershipLeaseRecord, string> {\n try {\n const parsed: unknown = JSON.parse(readFileSync(this.leasePath, 'utf8'));\n if (!this.isLeaseRecord(parsed)) {\n return { ok: false, error: `Invalid telemetry ownership lease at ${this.leasePath}` };\n }\n return { ok: true, value: parsed };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private recoverStaleLease(): TelemetryResult<void, string> {\n const current = this.readRecord();\n if (!current.ok) {\n return current;\n }\n const expired = current.value.expiresAtMs < this.options.now();\n const processAlive = this.isProcessAlive(current.value.pid);\n if (!expired || processAlive) {\n return {\n ok: false,\n error: `Telemetry target ${this.options.targetId} is owned by pid ${current.value.pid} (${current.value.mode})`,\n };\n }\n try {\n const stalePath = `${this.leasePath}.stale.${current.value.processToken}`;\n renameSync(this.leasePath, stalePath);\n rmSync(stalePath, { force: true });\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (cause) {\n const code = typeof cause === 'object' && cause !== null && 'code' in cause\n ? Reflect.get(cause, 'code')\n : null;\n return code === 'EPERM';\n }\n }\n\n private isLeaseRecord(value: unknown): value is SqliteOwnershipLeaseRecord {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return false;\n }\n return Reflect.get(value, 'formatVersion') === 1\n && typeof Reflect.get(value, 'targetId') === 'string'\n && typeof Reflect.get(value, 'databasePath') === 'string'\n && (Reflect.get(value, 'mode') === 'writer' || Reflect.get(value, 'mode') === 'offline-maintenance')\n && Number.isInteger(Reflect.get(value, 'pid'))\n && typeof Reflect.get(value, 'processToken') === 'string'\n && typeof Reflect.get(value, 'acquiredAtMs') === 'number'\n && typeof Reflect.get(value, 'heartbeatAtMs') === 'number'\n && typeof Reflect.get(value, 'expiresAtMs') === 'number';\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n}\n","import type Database from 'better-sqlite3';\nimport type { ISQLRunner } from '@noego/proper/runners';\nimport { TelemetryTableMap } from './telemetry_table_map.js';\n\nexport class TelemetryProperSqlRunner implements ISQLRunner {\n constructor(\n private readonly connection: Database.Database,\n private readonly tableMap: TelemetryTableMap,\n ) {}\n\n async query(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n const normalized = this.leadingKeyword(substituted);\n if (normalized === 'SELECT' || normalized === 'WITH' || normalized === 'PRAGMA' || normalized === 'EXPLAIN') {\n return [this.connection.prepare(substituted).all(...params), undefined];\n }\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async execute(sql: string, params: unknown[] = []): Promise<unknown> {\n const substituted = this.substitute(sql);\n if (params.length > 0) {\n return [this.connection.prepare(substituted).run(...params), undefined];\n }\n this.connection.exec(substituted);\n return [{ changes: 0 }, undefined];\n }\n\n async end(): Promise<void> {\n // Proper shares the SQLite target's connection and must not close it.\n }\n\n private substitute(sql: string): string {\n const substituted = this.tableMap.substitute(sql);\n if (!substituted.ok) {\n throw new Error(substituted.error);\n }\n return substituted.value;\n }\n\n private leadingKeyword(sql: string): string {\n const withoutComments = sql\n .replace(/--.*$/gm, '')\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .trimStart();\n return withoutComments.split(/\\s+/, 1)[0]?.toUpperCase() ?? '';\n }\n}\n","import { createHash } from 'node:crypto';\nimport { canonicalJson, telemetryChecksum } from '../core/helper/canonical_json.js';\nimport { MetricDefinitionContract } from '../core/metric_definition_contract.js';\nimport type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject, TelemetryJsonValue } from '../core/types/json.types.js';\nimport type {\n MetricAggregate,\n MetricDefinition,\n MetricMeasurement,\n MetricRollupValues,\n} from '../core/types/metric.types.js';\nimport type {\n MetricBucket,\n MetricDimensionFilter,\n MetricQuery,\n MetricQueryGap,\n MetricQueryResponse,\n MetricQuerySegment,\n TelemetryQueryError,\n TimelineQuery,\n TimelineQueryResponse,\n} from '../core/types/query.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n RetentionDrain,\n RetentionDrainBatchResult,\n StoragePersistRequest,\n} from '../core/types/storage.types.js';\nimport type {\n TelemetryAcknowledgement,\n TelemetryBatch,\n TelemetryDropCounter,\n} from '../core/types/transport.types.js';\nimport {\n BatchAcknowledgementRowSchema,\n type MetricSampleRow,\n StoredMetricDefinitionRowSchema,\n StoredMetricDefinitionSchema,\n} from './schema/telemetry_repository_rows.js';\nimport { TelemetryRepositoryRowParser } from './telemetry_repository_row_parser.js';\nimport type {\n MetricBucketWork,\n MutableMaterializedMetricGroup,\n MutableMetricFieldAggregate,\n NormalizedMetricSample,\n RepositoryPersistOutcome,\n RollupCoverageInterval,\n TelemetryRepositoryOptions,\n} from './types/telemetry_repository.types.js';\n\nconst RETENTION_PAGE_SIZE = 500;\n\ntype RawRetentionCursor = Readonly<{\n occurredAtMs: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype SampleRetentionCursor = Readonly<{\n occurredAtMs: number;\n metricName: string;\n definitionVersion: number;\n producerId: string;\n sequence: number;\n}>;\n\ntype RetentionStepOutcome = Readonly<{ deleted: number; done: boolean }>;\n\ntype RetentionStep = () => RetentionStepOutcome;\n\nclass MetricCardinalityRejectionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'MetricCardinalityRejectionError';\n }\n}\n\nexport class TelemetryRepository {\n private readonly rowParser = new TelemetryRepositoryRowParser();\n private readonly definitionContract = new MetricDefinitionContract();\n private readonly definitions = new Map<string, MetricDefinition>();\n\n constructor(private readonly options: TelemetryRepositoryOptions) {}\n\n registerDefinitions(definitions: readonly MetricDefinition[]): TelemetryResult<void, string> {\n try {\n const normalizedDefinitions = this.normalizeDefinitions(definitions);\n const registeredAtMs = this.options.now();\n const byName = new Map<string, MetricDefinition[]>();\n for (const definition of normalizedDefinitions) {\n const versions = byName.get(definition.name) ?? [];\n versions.push(definition);\n byName.set(definition.name, versions);\n }\n\n const transaction = this.options.connection.transaction(() => {\n const table = this.options.tableMap.quoted('metricDefinitions');\n const deactivate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 0 WHERE target_id = ? AND metric_name = ?`,\n );\n const existing = this.options.connection.prepare(\n `SELECT definition_checksum FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, metric_name, definition_version, definition_json,\n definition_checksum, active, registered_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n const activate = this.options.connection.prepare(\n `UPDATE ${table} SET active = 1\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?`,\n );\n\n for (const [metricName, versions] of byName) {\n deactivate.run(this.options.targetId, metricName);\n const latestVersion = Math.max(...versions.map((definition) => definition.version));\n for (const definition of versions) {\n const definitionJson = canonicalJson(definition);\n const definitionChecksum = telemetryChecksum(definition);\n const prior = existing.get(this.options.targetId, definition.name, definition.version);\n if (prior !== undefined) {\n const priorChecksum = this.readStringField(prior, 'definition_checksum');\n if (priorChecksum !== definitionChecksum) {\n throw new Error(\n `Metric ${definition.name} version ${definition.version} changed without a version bump`,\n );\n }\n } else {\n insert.run(\n this.options.targetId,\n definition.name,\n definition.version,\n definitionJson,\n definitionChecksum,\n definition.version === latestVersion ? 1 : 0,\n registeredAtMs,\n );\n }\n }\n activate.run(this.options.targetId, metricName, latestVersion);\n }\n });\n transaction();\n const loaded = this.loadDefinitionsReadOnly(normalizedDefinitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n loadDefinitionsReadOnly(\n expectedDefinitions: readonly MetricDefinition[],\n ): TelemetryResult<void, string> {\n try {\n const normalizedExpectedDefinitions = this.normalizeDefinitions(expectedDefinitions);\n const table = this.options.tableMap.quoted('metricDefinitions');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, definition_json, definition_checksum, active\n FROM ${table} WHERE target_id = ?`,\n )\n .all(this.options.targetId);\n const loaded = new Map<string, MetricDefinition>();\n for (const rawRow of rows) {\n const row = StoredMetricDefinitionRowSchema.parse(rawRow);\n const parsedJson: unknown = JSON.parse(row.definition_json);\n const parsedDefinition = StoredMetricDefinitionSchema.parse(parsedJson);\n const normalized = this.definitionContract.normalize(parsedDefinition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n const definition = normalized.value;\n const identityMatches =\n definition.name === row.metric_name && definition.version === row.definition_version;\n if (!identityMatches) {\n throw new Error('Stored metric definition identity does not match its row');\n }\n const checksum = telemetryChecksum(definition);\n const canonicalRowMatches =\n checksum === row.definition_checksum &&\n canonicalJson(definition) === row.definition_json;\n // Rows written before the shared canonical-json/fnv1a64 contract used\n // sha256 over the writer's own serialization. Their integrity is still\n // verifiable against their stored checksum, and registration rewrites\n // them in the canonical format on the next collector start.\n const legacyRowMatches =\n !canonicalRowMatches &&\n createHash('sha256').update(row.definition_json, 'utf8').digest('hex') ===\n row.definition_checksum;\n if (!canonicalRowMatches && !legacyRowMatches) {\n // Stale inactive rows are not load-bearing; an unreadable legacy\n // format must not wedge readers.\n if (row.active !== 1) {\n continue;\n }\n throw new Error(\n `Stored metric ${definition.name} version ${definition.version} checksum is invalid`,\n );\n }\n loaded.set(this.definitionKey(definition.name, definition.version), definition);\n }\n for (const expected of normalizedExpectedDefinitions) {\n const stored = loaded.get(this.definitionKey(expected.name, expected.version));\n if (stored === undefined || telemetryChecksum(stored) !== telemetryChecksum(expected)) {\n throw new Error(\n `Configured metric ${expected.name} version ${expected.version} is not registered in target ${this.options.targetId}`,\n );\n }\n }\n this.definitions.clear();\n for (const [identity, definition] of loaded) {\n this.definitions.set(identity, definition);\n }\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n persist(request: StoragePersistRequest): RepositoryPersistOutcome {\n try {\n const outsideHorizon = this.outsideIngestionHorizon(request.batch);\n if (outsideHorizon !== null) {\n return { kind: 'acknowledged', acknowledgement: outsideHorizon };\n }\n const replay = this.findReplay(request.batch);\n if (replay !== null) {\n return { kind: 'acknowledged', acknowledgement: replay };\n }\n const acknowledgement = this.persistTransaction(request);\n return { kind: 'acknowledged', acknowledgement };\n } catch (cause) {\n return { kind: 'failed', reason: this.errorMessage(cause) };\n }\n }\n\n timeline(\n query: TimelineQuery,\n rawRetentionCutoffMs: number,\n ): TelemetryResult<TimelineQueryResponse, TelemetryQueryError> {\n try {\n const cursor =\n query.cursor === null ? null : this.rowParser.parseTimelineCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Timeline cursor order changed' },\n };\n }\n\n const availableFromMs = Math.max(query.fromMs, rawRetentionCutoffMs);\n const clauses = ['target_id = ?', 'occurred_at_ms >= ?', 'occurred_at_ms < ?'];\n const params: unknown[] = [this.options.targetId, availableFromMs, query.toMs];\n this.addTimelineFilters(query, clauses, params);\n if (cursor?.ok) {\n this.addTimelineCursor(cursor.value, query.order, clauses, params);\n }\n const direction = query.order === 'asc' ? 'ASC' : 'DESC';\n const table = this.options.tableMap.quoted('rawEvents');\n const sql = `SELECT\n producer_id, sequence, event_id, occurred_at_ms, monotonic_ns,\n source, process_kind, level, label, conversation_id,\n conversation_id_kind, correlation_id, metadata_json, schema_version\n FROM ${table}\n WHERE ${clauses.join(' AND ')}\n ORDER BY occurred_at_ms ${direction}, producer_id ${direction}, sequence ${direction}\n LIMIT ?`;\n params.push(query.limit + 1);\n const rows = this.options.connection.prepare(sql).all(...params);\n const hasNextPage = rows.length > query.limit;\n const pageRows = hasNextPage ? rows.slice(0, query.limit) : rows;\n const events: TelemetryEnvelope[] = [];\n for (const row of pageRows) {\n const parsed = this.rowParser.parseRawEnvelope(row);\n if (!parsed.ok) {\n return { ok: false, error: { kind: 'storage-failure', message: parsed.error } };\n }\n events.push(parsed.value);\n }\n const last = events[events.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n occurredAtMs: last.occurredAtMs,\n producerId: last.producerId,\n sequence: last.sequence,\n })\n : null;\n const unavailableEnd = Math.min(query.toMs, rawRetentionCutoffMs);\n const gaps =\n query.fromMs < unavailableEnd\n ? [{ fromMs: query.fromMs, toMs: unavailableEnd, reason: 'raw-retention' as const }]\n : [];\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n events: Object.freeze(events),\n gaps: Object.freeze(gaps),\n nextCursor,\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n metrics(query: MetricQuery): TelemetryResult<MetricQueryResponse, TelemetryQueryError> {\n try {\n const definitions = this.metricDefinitions(query.metric);\n if (definitions.length === 0) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: `Unknown metric ${query.metric}` },\n };\n }\n const validationError = this.validateMetricQuery(query, definitions);\n if (validationError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: validationError } };\n }\n const cursor = query.cursor === null ? null : this.rowParser.parseMetricCursor(query.cursor);\n if (cursor !== null && !cursor.ok) {\n return { ok: false, error: { kind: 'invalid-query', message: cursor.error } };\n }\n if (cursor !== null && cursor.value.order !== query.order) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric cursor order changed' },\n };\n }\n\n const coverage = this.planCoverage(query, definitions);\n const rows = this.readRollupsForCoverage(query, coverage.intervals);\n const filtered = rows.filter((row) => this.matchesWhere(row.bucket.dimensions, query.where));\n const ordered = filtered.sort((left, right) =>\n this.compareParsedRollups(left, right, query.order),\n );\n const afterCursor = cursor?.ok\n ? ordered.filter((row) => this.isAfterMetricCursor(row, cursor.value, query.order))\n : ordered;\n const hasNextPage = afterCursor.length > query.limit;\n const page = hasNextPage ? afterCursor.slice(0, query.limit) : afterCursor;\n const projected = page.map((row) => ({\n ...row,\n bucket: {\n ...row.bucket,\n values: this.selectMeasurements(row.bucket.values, query.measurements),\n },\n }));\n const segments = this.rowsToSegments(coverage.intervals, projected);\n const last = page[page.length - 1];\n const nextCursor =\n hasNextPage && last\n ? this.encodeCursor({\n version: 1,\n order: query.order,\n bucketStartMs: last.bucket.startMs,\n resolutionMs: last.resolutionMs,\n definitionVersion: last.definitionVersion,\n dimensionKey: last.dimensionKey,\n })\n : null;\n return {\n ok: true,\n value: {\n targetId: this.options.targetId,\n metric: query.metric,\n segments,\n gaps: coverage.gaps,\n nextCursor,\n partialFailures: [],\n },\n };\n } catch (cause) {\n return { ok: false, error: { kind: 'storage-failure', message: this.errorMessage(cause) } };\n }\n }\n\n materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n let affectedRows = 0;\n let rejectedBucketCount = 0;\n const rejectedBucketExamples: string[] = [];\n try {\n for (const definition of this.definitions.values()) {\n for (const resolutionMs of definition.resolutionsMs) {\n const dueBeforeMs = nowMs - this.options.retention.lateArrivalMs;\n const bucketStarts = this.findDueBucketStarts(definition, resolutionMs, dueBeforeMs);\n for (const bucketStartMs of bucketStarts) {\n if (this.options.now() - startedAt >= maxWorkMs) {\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n true,\n ),\n },\n };\n }\n const work = this.loadBucketWork(definition, resolutionMs, bucketStartMs);\n if (this.bucketIsCurrent(work)) {\n continue;\n }\n try {\n affectedRows += this.materializeBucket(work, nowMs);\n } catch (cause) {\n if (!(cause instanceof MetricCardinalityRejectionError)) {\n throw cause;\n }\n this.recordRejectedBucket(work, nowMs, cause.message);\n rejectedBucketCount += 1;\n if (rejectedBucketExamples.length < 3) {\n rejectedBucketExamples.push(\n `${definition.name}:${definition.version}:${resolutionMs}:${bucketStartMs}: ${cause.message}`,\n );\n }\n }\n }\n }\n }\n return {\n ok: true,\n value: {\n stage: 'rollup',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: this.rollupStageDetail(\n rejectedBucketCount,\n rejectedBucketExamples,\n false,\n ),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n beginRetentionDrain(nowMs: number): RetentionDrain {\n const steps: RetentionStep[] = [\n this.createRawEventRetentionStep(nowMs),\n this.createSampleRetentionStep(nowMs),\n ...this.createRollupRetentionSteps(nowMs),\n ...this.createAuxiliaryRetentionSteps(nowMs),\n ];\n let index = 0;\n return {\n nextBatch: (): TelemetryResult<RetentionDrainBatchResult, string> => {\n try {\n if (steps.length === 0) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n if (index >= steps.length) {\n index = 0;\n }\n const step = steps[index];\n if (step === undefined) {\n return { ok: true, value: { deletedRows: 0, hasMore: false } };\n }\n const outcome = step();\n if (outcome.done) {\n steps.splice(index, 1);\n } else {\n index += 1;\n }\n return {\n ok: true,\n value: { deletedRows: outcome.deleted, hasMore: steps.length > 0 },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n },\n };\n }\n\n checkpoint(): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const rows = this.options.connection.pragma('wal_checkpoint(PASSIVE)');\n return {\n ok: true,\n value: {\n stage: 'checkpoint',\n affectedRows: Array.isArray(rows) ? rows.length : 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n reclaim(maxPages: number): TelemetryResult<MaintenanceStageResult, string> {\n const startedAt = this.options.now();\n try {\n const before = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n this.options.connection.pragma(`incremental_vacuum(${Math.max(0, Math.floor(maxPages))})`);\n const after = Number(this.options.connection.pragma('freelist_count', { simple: true }));\n return {\n ok: true,\n value: {\n stage: 'reclaim',\n affectedRows: 0,\n affectedPages: Math.max(0, before - after),\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n pageStats(): TelemetryResult<\n Readonly<{ pageCount: number; freePages: number; pageSize: number }>,\n string\n > {\n try {\n return {\n ok: true,\n value: {\n pageCount: Number(this.options.connection.pragma('page_count', { simple: true })),\n freePages: Number(this.options.connection.pragma('freelist_count', { simple: true })),\n pageSize: Number(this.options.connection.pragma('page_size', { simple: true })),\n },\n };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recordMaintenance(record: MaintenanceRunRecord): TelemetryResult<void, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const affectedRows = record.stages.reduce((sum, stage) => sum + stage.affectedRows, 0);\n const affectedPages = record.stages.reduce((sum, stage) => sum + stage.affectedPages, 0);\n const detail = canonicalJson({\n stages: record.stages,\n failedStage: record.failedStage,\n error: record.error,\n });\n this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, run_id, state, stage, started_at_ms, completed_at_ms,\n affected_rows, affected_pages, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, run_id, stage) DO UPDATE SET\n state = excluded.state,\n completed_at_ms = excluded.completed_at_ms,\n affected_rows = excluded.affected_rows,\n affected_pages = excluded.affected_pages,\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n record.runId,\n record.state,\n record.kind,\n record.startedAtMs,\n record.completedAtMs,\n affectedRows,\n affectedPages,\n detail,\n );\n return { ok: true, value: undefined };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n recoverInterruptedMaintenance(nowMs: number): TelemetryResult<number, string> {\n try {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const detail = canonicalJson({\n stages: [],\n failedStage: null,\n error: 'interrupted-before-restart',\n });\n const result = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'failed', completed_at_ms = ?, detail = ?\n WHERE target_id = ? AND state = 'started'`,\n ).run(nowMs, detail, this.options.targetId);\n return { ok: true, value: result.changes };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n committedDropCounters(): TelemetryResult<readonly TelemetryDropCounter[], string> {\n try {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const rows = this.options.connection\n .prepare(\n `SELECT reason, priority, count\n FROM ${table}\n WHERE target_id = ?\n ORDER BY reason ASC, priority ASC`,\n )\n .all(this.options.targetId);\n const counters = rows.map((row) => this.parseCommittedDropCounter(row));\n return { ok: true, value: Object.freeze(counters) };\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private findReplay(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n const rows = this.options.connection\n .prepare(\n `SELECT idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?\n AND sequence_start <= ? AND sequence_end >= ?`,\n )\n .all(this.options.targetId, batch.producerId, batch.sequenceEnd, batch.sequenceStart);\n if (rows.length === 0) {\n return this.findPrunedReplayConflict(batch);\n }\n for (const row of rows) {\n const parsed = BatchAcknowledgementRowSchema.safeParse(row);\n if (!parsed.success) {\n throw new Error(parsed.error.message);\n }\n const identical =\n parsed.data.idempotency_key === batch.idempotencyKey &&\n parsed.data.checksum === batch.checksum &&\n parsed.data.sequence_start === batch.sequenceStart &&\n parsed.data.sequence_end === batch.sequenceEnd;\n if (identical) {\n return {\n kind: 'committed',\n idempotencyKey: batch.idempotencyKey,\n committedAtMs: parsed.data.committed_at_ms,\n acceptedEvents: parsed.data.accepted_events,\n duplicate: true,\n targetStates: [this.committedTargetState(0)],\n };\n }\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range overlaps a different committed batch',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-range-conflict',\n },\n ],\n };\n }\n\n private outsideIngestionHorizon(\n batch: TelemetryBatch,\n ): TelemetryAcknowledgement | null {\n const cutoffMs = this.options.now() - this.longestRetentionMs();\n const containsExpiredEvent = batch.envelopes.some(\n (envelope) => envelope.occurredAtMs < cutoffMs,\n );\n if (!containsExpiredEvent) {\n return null;\n }\n return {\n kind: 'rejected',\n idempotencyKey: batch.idempotencyKey,\n code: 'invalid-batch',\n reason: 'Telemetry batch is older than the configured ingestion horizon',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'batch-outside-ingestion-horizon',\n },\n ],\n };\n }\n\n private findPrunedReplayConflict(batch: TelemetryBatch): TelemetryAcknowledgement | null {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const row = this.options.connection\n .prepare(\n `SELECT highest_sequence\n FROM ${table}\n WHERE target_id = ? AND producer_id = ?`,\n )\n .get(this.options.targetId, batch.producerId);\n if (row === undefined) {\n return null;\n }\n const highestSequence = this.readNumberField(row, 'highest_sequence');\n if (batch.sequenceStart > highestSequence) {\n return null;\n }\n return {\n kind: 'conflict',\n idempotencyKey: batch.idempotencyKey,\n reason: 'Producer sequence range is at or below the durable ingest watermark',\n targetStates: [\n {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'failed',\n attempts: 1,\n reason: 'sequence-at-or-below-watermark',\n },\n ],\n };\n }\n\n private persistTransaction(request: StoragePersistRequest): TelemetryAcknowledgement {\n const committedAtMs = this.options.now();\n const transaction = this.options.connection.transaction(() => {\n this.insertRawEvents(request, committedAtMs);\n this.insertMetricSamples(request, committedAtMs);\n this.insertExtractionFailures(request, committedAtMs);\n this.upsertCommittedDropCounters(request.batch, committedAtMs);\n this.insertBatchAcknowledgement(request.batch, committedAtMs);\n this.updateIngestWatermark(request.batch, committedAtMs);\n });\n transaction();\n return {\n kind: 'committed',\n idempotencyKey: request.batch.idempotencyKey,\n committedAtMs,\n acceptedEvents: request.batch.envelopes.length,\n duplicate: false,\n targetStates: [this.committedTargetState(1)],\n };\n }\n\n private insertRawEvents(request: StoragePersistRequest, insertedAtMs: number): void {\n const table = this.options.tableMap.quoted('rawEvents');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, sequence, event_id, batch_idempotency_key,\n occurred_at_ms, monotonic_ns, source, process_kind, level, label,\n conversation_id, conversation_id_kind, correlation_id, metadata_json,\n schema_version, inserted_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const envelope of request.batch.envelopes) {\n const conversationId =\n envelope.conversationId === null ? null : String(envelope.conversationId);\n const conversationKind =\n envelope.conversationId === null ? null : typeof envelope.conversationId;\n insert.run(\n this.options.targetId,\n envelope.producerId,\n envelope.sequence,\n envelope.eventId,\n request.batch.idempotencyKey,\n envelope.occurredAtMs,\n envelope.monotonicNs,\n envelope.source,\n envelope.processKind,\n envelope.level,\n envelope.label,\n conversationId,\n conversationKind,\n envelope.correlationId,\n canonicalJson(envelope.metadata),\n envelope.schemaVersion,\n insertedAtMs,\n );\n }\n }\n\n private insertMetricSamples(request: StoragePersistRequest, _insertedAtMs: number): void {\n const samplesTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const insert = this.options.connection.prepare(\n `INSERT INTO ${samplesTable} (\n target_id, metric_name, definition_version, occurred_at_ms,\n producer_id, sequence, dimension_key, dimensions_json, values_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n const invalidate = this.options.connection.prepare(\n `DELETE FROM ${completionTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n );\n for (const sample of request.samples) {\n insert.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n sample.occurredAtMs,\n sample.producerId,\n sample.sequence,\n sample.dimensionKey,\n canonicalJson(sample.dimensions),\n canonicalJson(sample.values),\n );\n const definition = this.definitions.get(\n this.definitionKey(sample.metricName, sample.definitionVersion),\n );\n if (!definition) {\n throw new Error(\n `Missing registered metric definition ${sample.metricName}:${sample.definitionVersion}`,\n );\n }\n for (const resolutionMs of definition.resolutionsMs) {\n const bucketStartMs = this.bucketStart(sample.occurredAtMs, resolutionMs);\n invalidate.run(\n this.options.targetId,\n sample.metricName,\n sample.definitionVersion,\n resolutionMs,\n bucketStartMs,\n );\n }\n }\n }\n\n private insertExtractionFailures(request: StoragePersistRequest, recordedAtMs: number): void {\n const table = this.options.tableMap.quoted('extractionFailures');\n const insert = this.options.connection.prepare(\n `INSERT OR REPLACE INTO ${table} (\n target_id, metric_name, definition_version, producer_id,\n sequence, reason, recorded_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const failure of request.extractionFailures) {\n insert.run(\n this.options.targetId,\n failure.metricName,\n failure.definitionVersion,\n failure.producerId,\n failure.sequence,\n failure.reason.slice(0, 1_024),\n recordedAtMs,\n );\n }\n }\n\n private upsertCommittedDropCounters(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('committedDropCounters');\n const upsert = this.options.connection.prepare(\n `INSERT INTO ${table} (\n target_id, reason, priority, count, first_committed_at_ms, last_committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, reason, priority) DO UPDATE SET\n count = MIN(9007199254740991, ${table}.count + excluded.count),\n first_committed_at_ms = MIN(\n ${table}.first_committed_at_ms,\n excluded.first_committed_at_ms\n ),\n last_committed_at_ms = MAX(\n ${table}.last_committed_at_ms,\n excluded.last_committed_at_ms\n )`,\n );\n for (const counter of batch.dropCounters) {\n if (!Number.isSafeInteger(counter.count) || counter.count <= 0) {\n throw new Error('Committed telemetry drop counters must be positive safe integers');\n }\n upsert.run(\n this.options.targetId,\n counter.reason,\n counter.priority,\n counter.count,\n committedAtMs,\n committedAtMs,\n );\n }\n }\n\n private insertBatchAcknowledgement(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('batchAcknowledgements');\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, idempotency_key, producer_id, sequence_start, sequence_end,\n schema_version, checksum, accepted_events, committed_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n )\n .run(\n this.options.targetId,\n batch.idempotencyKey,\n batch.producerId,\n batch.sequenceStart,\n batch.sequenceEnd,\n batch.schemaVersion,\n batch.checksum,\n batch.envelopes.length,\n committedAtMs,\n );\n }\n\n private updateIngestWatermark(batch: TelemetryBatch, committedAtMs: number): void {\n const table = this.options.tableMap.quoted('ingestWatermarks');\n const lastOccurredAtMs = Math.max(...batch.envelopes.map((envelope) => envelope.occurredAtMs));\n const internalGapCount = batch.sequenceEnd - batch.sequenceStart + 1 - batch.envelopes.length;\n const initialGapCount = batch.sequenceStart + internalGapCount;\n this.options.connection\n .prepare(\n `INSERT INTO ${table} (\n target_id, producer_id, highest_sequence, last_occurred_at_ms,\n last_committed_at_ms, observed_gap_count\n ) VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(target_id, producer_id) DO UPDATE SET\n observed_gap_count = ${table}.observed_gap_count\n + MAX(0, ? - ${table}.highest_sequence - 1)\n + ?,\n highest_sequence = MAX(${table}.highest_sequence, excluded.highest_sequence),\n last_occurred_at_ms = MAX(${table}.last_occurred_at_ms, excluded.last_occurred_at_ms),\n last_committed_at_ms = excluded.last_committed_at_ms`,\n )\n .run(\n this.options.targetId,\n batch.producerId,\n batch.sequenceEnd,\n lastOccurredAtMs,\n committedAtMs,\n initialGapCount,\n batch.sequenceStart,\n internalGapCount,\n );\n }\n\n private addTimelineFilters(query: TimelineQuery, clauses: string[], params: unknown[]): void {\n const filters: readonly [unknown, string, unknown][] = [\n [\n query.conversationId,\n 'conversation_id = ?',\n query.conversationId === null ? null : String(query.conversationId),\n ],\n [query.source, 'source = ?', query.source],\n [query.label, 'label = ?', query.label],\n [query.level, 'level = ?', query.level],\n [query.producerId, 'producer_id = ?', query.producerId],\n [query.correlationId, 'correlation_id = ?', query.correlationId],\n ];\n for (const [guard, clause, parameter] of filters) {\n if (guard !== null) {\n clauses.push(clause);\n params.push(parameter);\n }\n }\n }\n\n private addTimelineCursor(\n cursor: Readonly<{ occurredAtMs: number; producerId: string; sequence: number }>,\n order: 'asc' | 'desc',\n clauses: string[],\n params: unknown[],\n ): void {\n const comparison = order === 'asc' ? '>' : '<';\n clauses.push(`(\n occurred_at_ms ${comparison} ?\n OR (occurred_at_ms = ? AND producer_id ${comparison} ?)\n OR (occurred_at_ms = ? AND producer_id = ? AND sequence ${comparison} ?)\n )`);\n params.push(\n cursor.occurredAtMs,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.occurredAtMs,\n cursor.producerId,\n cursor.sequence,\n );\n }\n\n private findDueBucketStarts(\n definition: MetricDefinition,\n resolutionMs: number,\n dueBeforeMs: number,\n ): number[] {\n const sampleTable = this.options.tableMap.quoted('metricSamples');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `WITH sample_buckets AS (\n SELECT\n CAST(occurred_at_ms / ? AS INTEGER) * ? AS bucket_start_ms,\n COUNT(*) AS sample_count,\n MAX(occurred_at_ms) AS sample_watermark_ms\n FROM ${sampleTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms < ?\n AND (CAST(occurred_at_ms / ? AS INTEGER) * ?) + ? <= ?\n GROUP BY bucket_start_ms\n )\n SELECT bucket.bucket_start_ms\n FROM sample_buckets AS bucket\n LEFT JOIN ${completionTable} AS completion\n ON completion.target_id = ?\n AND completion.metric_name = ?\n AND completion.definition_version = ?\n AND completion.resolution_ms = ?\n AND completion.bucket_start_ms = bucket.bucket_start_ms\n WHERE completion.bucket_start_ms IS NULL\n OR completion.sample_count <> bucket.sample_count\n OR completion.sample_watermark_ms <> bucket.sample_watermark_ms\n ORDER BY bucket.bucket_start_ms ASC\n LIMIT 256`,\n )\n .all(\n resolutionMs,\n resolutionMs,\n this.options.targetId,\n definition.name,\n definition.version,\n dueBeforeMs,\n resolutionMs,\n resolutionMs,\n resolutionMs,\n dueBeforeMs,\n this.options.targetId,\n definition.name,\n definition.version,\n resolutionMs,\n );\n return rows.map((row) => this.readNumberField(row, 'bucket_start_ms'));\n }\n\n private loadBucketWork(\n definition: MetricDefinition,\n resolutionMs: number,\n bucketStartMs: number,\n ): MetricBucketWork {\n const table = this.options.tableMap.quoted('metricSamples');\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND occurred_at_ms >= ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, producer_id ASC, sequence ASC`,\n )\n .all(\n this.options.targetId,\n definition.name,\n definition.version,\n bucketStartMs,\n bucketStartMs + resolutionMs,\n );\n const samples = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n return { definition, resolutionMs, bucketStartMs, samples };\n }\n\n private bucketIsCurrent(work: MetricBucketWork): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT sample_count, sample_watermark_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .get(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n if (row === undefined) {\n return false;\n }\n const sampleCount = this.readNumberField(row, 'sample_count');\n const watermark = this.readNumberField(row, 'sample_watermark_ms');\n return sampleCount === work.samples.length && watermark === this.sampleWatermark(work);\n }\n\n private sampleWatermark(work: MetricBucketWork): number {\n return work.samples.length === 0\n ? work.bucketStartMs\n : Math.max(...work.samples.map((sample) => sample.occurred_at_ms));\n }\n\n private materializeBucket(work: MetricBucketWork, materializedAtMs: number): number {\n const normalized = this.normalizeSamplesForCardinality(work);\n const groups = this.aggregateSamples(work.definition.measurements, normalized);\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection\n .prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n const insert = this.options.connection.prepare(\n `INSERT INTO ${rollupTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, dimension_key, dimensions_json, values_json,\n materialized_at_ms\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n );\n for (const [dimensionKey, group] of groups) {\n insert.run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n dimensionKey,\n group.dimensionsJson,\n canonicalJson(group.values),\n materializedAtMs,\n );\n }\n this.options.connection\n .prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'completed', NULL)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'completed',\n detail = NULL`,\n )\n .run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n materializedAtMs,\n );\n });\n transaction();\n return groups.size;\n }\n\n private recordRejectedBucket(\n work: MetricBucketWork,\n recordedAtMs: number,\n detail: string,\n ): void {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const transaction = this.options.connection.transaction(() => {\n this.options.connection.prepare(\n `DELETE FROM ${rollupTable}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n );\n this.options.connection.prepare(\n `INSERT INTO ${completionTable} (\n target_id, metric_name, definition_version, resolution_ms,\n bucket_start_ms, sample_count, sample_watermark_ms, completed_at_ms,\n state, detail\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'rejected', ?)\n ON CONFLICT(\n target_id, metric_name, definition_version, resolution_ms, bucket_start_ms\n ) DO UPDATE SET\n sample_count = excluded.sample_count,\n sample_watermark_ms = excluded.sample_watermark_ms,\n completed_at_ms = excluded.completed_at_ms,\n state = 'rejected',\n detail = excluded.detail`,\n ).run(\n this.options.targetId,\n work.definition.name,\n work.definition.version,\n work.resolutionMs,\n work.bucketStartMs,\n work.samples.length,\n this.sampleWatermark(work),\n recordedAtMs,\n detail.slice(0, 1_024),\n );\n });\n transaction();\n }\n\n private rollupStageDetail(\n rejectedBucketCount: number,\n examples: readonly string[],\n workBudgetReached: boolean,\n ): string | null {\n const rejected = rejectedBucketCount === 0\n ? null\n : `cardinality-rejected-buckets=${rejectedBucketCount}; ${examples.join('; ')}`;\n const detail = workBudgetReached\n ? ['work-budget-reached', rejected].filter((value) => value !== null).join('; ')\n : rejected;\n return detail?.slice(0, 2_048) ?? null;\n }\n\n private normalizeSamplesForCardinality(work: MetricBucketWork): NormalizedMetricSample[] {\n const admittedByField = new Map<string, Set<string>>();\n const normalized: NormalizedMetricSample[] = [];\n for (const sample of work.samples) {\n const dimensions = this.rowParser.parseJsonObject(sample.dimensions_json);\n const values = this.rowParser.parseNumericValues(sample.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n const admittedDimensions: Record<string, TelemetryJsonValue> = { ...dimensions.value };\n let dropSample = false;\n for (const field of work.definition.groupBy) {\n const rule = work.definition.cardinality[field];\n if (!rule) {\n throw new Error(`Missing cardinality rule for ${field}`);\n }\n const dimensionValue = admittedDimensions[field];\n const valueKey = canonicalJson(dimensionValue);\n const admittedValues = admittedByField.get(field) ?? new Set<string>();\n if (!admittedValues.has(valueKey) && admittedValues.size >= rule.maxValuesPerBucket) {\n if (rule.overflow === 'other') {\n admittedDimensions[field] = '__telemetry_other__';\n } else if (rule.overflow === 'reject') {\n throw new MetricCardinalityRejectionError(\n `Metric ${work.definition.name} rejected cardinality overflow for ${field}`,\n );\n } else {\n dropSample = true;\n break;\n }\n } else {\n admittedValues.add(valueKey);\n admittedByField.set(field, admittedValues);\n }\n }\n if (dropSample) {\n continue;\n }\n const dimensionsJson = canonicalJson(admittedDimensions);\n normalized.push({\n dimensionKey: dimensionsJson,\n dimensionsJson,\n values: values.value,\n occurredAtMs: sample.occurred_at_ms,\n producerId: sample.producer_id,\n sequence: sample.sequence,\n });\n }\n return normalized;\n }\n\n private aggregateSamples(\n measurements: readonly MetricMeasurement[],\n samples: readonly NormalizedMetricSample[],\n ): Map<string, MutableMaterializedMetricGroup> {\n const groups = new Map<string, MutableMaterializedMetricGroup>();\n const fields = measurements\n .filter((measurement): measurement is Extract<MetricMeasurement, { kind: 'field' }> => {\n return measurement.kind === 'field';\n })\n .map((measurement) => measurement.field);\n for (const sample of samples) {\n const group = groups.get(sample.dimensionKey) ?? {\n dimensionsJson: sample.dimensionsJson,\n values: { count: 0, fields: {} },\n };\n group.values.count += 1;\n for (const field of fields) {\n const measured = sample.values[field];\n if (measured === undefined) {\n continue;\n }\n const aggregate = group.values.fields[field] ?? this.newFieldAggregate(measured, sample);\n aggregate.count += group.values.fields[field] === undefined ? 0 : 1;\n aggregate.sum += group.values.fields[field] === undefined ? 0 : measured;\n aggregate.min = Math.min(aggregate.min, measured);\n aggregate.max = Math.max(aggregate.max, measured);\n aggregate.last = measured;\n aggregate.lastOccurredAtMs = sample.occurredAtMs;\n aggregate.lastProducerId = sample.producerId;\n aggregate.lastSequence = sample.sequence;\n group.values.fields[field] = aggregate;\n }\n groups.set(sample.dimensionKey, group);\n }\n return groups;\n }\n\n private newFieldAggregate(\n measured: number,\n sample: NormalizedMetricSample,\n ): MutableMetricFieldAggregate {\n return {\n count: 1,\n sum: measured,\n min: measured,\n max: measured,\n last: measured,\n lastOccurredAtMs: sample.occurredAtMs,\n lastProducerId: sample.producerId,\n lastSequence: sample.sequence,\n };\n }\n\n /**\n * Raw retention is purely time-based, matching the native collector: every\n * expired row goes in one set-based statement per level band. No page size,\n * no row cap, and no rollup-completion gate — metric samples are extracted at\n * ingest and retained on their own clock, so dropping a raw row costs no\n * metric fidelity, and no row can outlive its window waiting on a rollup.\n */\n private createRawEventRetentionStep(nowMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('rawEvents');\n const levelMs = this.options.retention.levelMs ?? {};\n const levels = Object.keys(levelMs);\n const removeByLevel = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND lower(coalesce(level, '')) = ? AND occurred_at_ms < ?`,\n );\n const fallbackPlaceholders = levels.map(() => '?').join(', ');\n const removeFallback = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?` +\n (levels.length === 0\n ? ''\n : ` AND lower(coalesce(level, '')) NOT IN (${fallbackPlaceholders})`),\n );\n let done = false;\n return (): RetentionStepOutcome => {\n if (done) {\n return { deleted: 0, done: true };\n }\n done = true;\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const level of levels) {\n const retainMs = levelMs[level];\n if (retainMs === undefined) {\n continue;\n }\n deleted += removeByLevel.run(this.options.targetId, level, nowMs - retainMs).changes;\n }\n deleted += removeFallback.run(\n this.options.targetId,\n nowMs - this.options.retention.rawMs,\n ...levels,\n ).changes;\n return deleted;\n });\n return { deleted: transaction(), done: true };\n };\n }\n\n private rawEventHasRequiredRollups(envelope: TelemetryEnvelope): boolean {\n const applicable = [...this.definitions.values()].filter((definition) => {\n return this.definitionContract.matches(definition.selector, envelope.label);\n });\n return applicable.every((definition) => {\n if (!this.metricSampleExists(definition, envelope)) {\n return true;\n }\n return definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(envelope.occurredAtMs, resolutionMs),\n );\n });\n });\n }\n\n private metricSampleExists(definition: MetricDefinition, envelope: TelemetryEnvelope): boolean {\n const table = this.options.tableMap.quoted('metricSamples');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n )\n .get(\n this.options.targetId,\n definition.name,\n definition.version,\n envelope.producerId,\n envelope.sequence,\n );\n return row !== undefined;\n }\n\n private createSampleRetentionStep(nowMs: number): RetentionStep {\n const cutoffMs = nowMs - this.options.retention.samplesMs;\n const table = this.options.tableMap.quoted('metricSamples');\n const readFirstPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const readNextPage = this.options.connection.prepare(\n `SELECT metric_name, definition_version, occurred_at_ms, producer_id,\n sequence, dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND occurred_at_ms < ?\n AND (\n occurred_at_ms, metric_name, definition_version, producer_id, sequence\n ) > (?, ?, ?, ?, ?)\n ORDER BY occurred_at_ms ASC, metric_name ASC, definition_version ASC,\n producer_id ASC, sequence ASC\n LIMIT ${RETENTION_PAGE_SIZE}`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND producer_id = ? AND sequence = ?`,\n );\n let cursor: SampleRetentionCursor | null = null;\n return (): RetentionStepOutcome => {\n const rows: unknown[] = cursor === null\n ? readFirstPage.all(this.options.targetId, cutoffMs)\n : readNextPage.all(\n this.options.targetId,\n cutoffMs,\n cursor.occurredAtMs,\n cursor.metricName,\n cursor.definitionVersion,\n cursor.producerId,\n cursor.sequence,\n );\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const samples: MetricSampleRow[] = rows.map((row) => {\n const parsed = this.rowParser.parseMetricSample(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n return parsed.value;\n });\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const sample of samples) {\n const definition = this.definitions.get(\n this.definitionKey(sample.metric_name, sample.definition_version),\n );\n if (!definition) {\n continue;\n }\n const complete = definition.resolutionsMs.every((resolutionMs) => {\n return this.hasCompletion(\n definition.name,\n definition.version,\n resolutionMs,\n this.bucketStart(sample.occurred_at_ms, resolutionMs),\n );\n });\n if (complete) {\n deleted += remove.run(\n this.options.targetId,\n sample.metric_name,\n sample.definition_version,\n sample.producer_id,\n sample.sequence,\n ).changes;\n }\n }\n return deleted;\n });\n const deleted = transaction();\n const last = samples[samples.length - 1];\n if (last === undefined || rows.length < RETENTION_PAGE_SIZE) {\n return { deleted, done: true };\n }\n cursor = {\n occurredAtMs: last.occurred_at_ms,\n metricName: last.metric_name,\n definitionVersion: last.definition_version,\n producerId: last.producer_id,\n sequence: last.sequence,\n };\n return { deleted, done: false };\n };\n }\n\n private createRollupRetentionSteps(nowMs: number): RetentionStep[] {\n const rollupTable = this.options.tableMap.quoted('metricRollups');\n const completionTable = this.options.tableMap.quoted('rollupCompletions');\n const steps: RetentionStep[] = [];\n for (const tier of this.options.retention.rollups) {\n const cutoffMs = nowMs - tier.retainMs;\n steps.push(this.createExpiredRollupStep(rollupTable, tier.resolutionMs, cutoffMs, false));\n steps.push(this.createExpiredRollupStep(completionTable, tier.resolutionMs, cutoffMs, true));\n }\n return steps;\n }\n\n private createExpiredRollupStep(\n table: string,\n resolutionMs: number,\n cutoffMs: number,\n completedOnly: boolean,\n ): RetentionStep {\n const statePredicate = completedOnly ? \" AND state = 'completed'\" : '';\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND resolution_ms = ? AND bucket_start_ms < ?${statePredicate}\n ORDER BY bucket_start_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, resolutionMs, cutoffMs).changes,\n );\n }\n\n private createPagedDeleteStep(deletePage: () => number): RetentionStep {\n return (): RetentionStepOutcome => {\n const changes = deletePage();\n return { deleted: changes, done: changes < RETENTION_PAGE_SIZE };\n };\n }\n\n private createAuxiliaryRetentionSteps(nowMs: number): RetentionStep[] {\n const acknowledgementCutoffMs = nowMs - this.acknowledgementRetentionMs();\n const ingestionCutoffMs = nowMs - this.longestRetentionMs();\n const extractionCutoffMs = nowMs - this.options.retention.samplesMs;\n return [\n this.createRowsBeforeStep('batchAcknowledgements', 'committed_at_ms', acknowledgementCutoffMs),\n this.createRowsBeforeStep('extractionFailures', 'recorded_at_ms', extractionCutoffMs),\n this.createFinishedMaintenanceRunStep(acknowledgementCutoffMs),\n ...this.createReaderLeaseSteps(nowMs),\n this.createStaleIngestWatermarkStep(ingestionCutoffMs),\n this.createUnreferencedMetricDefinitionStep(),\n ];\n }\n\n private createRowsBeforeStep(\n logicalTable: 'batchAcknowledgements' | 'extractionFailures',\n timestampColumn: 'committed_at_ms' | 'recorded_at_ms',\n cutoffMs: number,\n ): RetentionStep {\n const table = this.options.tableMap.quoted(logicalTable);\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND ${timestampColumn} < ?\n ORDER BY ${timestampColumn} ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createFinishedMaintenanceRunStep(cutoffMs: number): RetentionStep {\n const table = this.options.tableMap.quoted('maintenanceRuns');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('completed', 'failed')\n AND COALESCE(completed_at_ms, started_at_ms) < ?\n ORDER BY COALESCE(completed_at_ms, started_at_ms) ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs).changes,\n );\n }\n\n private createReaderLeaseSteps(nowMs: number): RetentionStep[] {\n const table = this.options.tableMap.quoted('readerLeases');\n const expire = this.options.connection.prepare(\n `UPDATE ${table}\n SET state = 'expired'\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state = 'active' AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${table}\n WHERE rowid IN (\n SELECT rowid FROM ${table}\n WHERE target_id = ? AND state IN ('released', 'expired')\n AND expires_at_ms <= ?\n ORDER BY expires_at_ms ASC\n LIMIT 500\n )`,\n );\n return [\n this.createPagedDeleteStep(() => expire.run(this.options.targetId, nowMs).changes),\n this.createPagedDeleteStep(() => remove.run(this.options.targetId, nowMs).changes),\n ];\n }\n\n private createStaleIngestWatermarkStep(cutoffMs: number): RetentionStep {\n const watermarks = this.options.tableMap.quoted('ingestWatermarks');\n const acknowledgements = this.options.tableMap.quoted('batchAcknowledgements');\n const rawEvents = this.options.tableMap.quoted('rawEvents');\n const samples = this.options.tableMap.quoted('metricSamples');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const remove = this.options.connection.prepare(\n `DELETE FROM ${watermarks}\n WHERE rowid IN (\n SELECT watermark.rowid\n FROM ${watermarks} AS watermark\n WHERE watermark.target_id = ?\n AND watermark.last_occurred_at_ms < ?\n AND watermark.last_committed_at_ms < ?\n AND NOT EXISTS (\n SELECT 1 FROM ${acknowledgements} AS acknowledgement\n WHERE acknowledgement.target_id = watermark.target_id\n AND acknowledgement.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rawEvents} AS raw_event\n WHERE raw_event.target_id = watermark.target_id\n AND raw_event.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = watermark.target_id\n AND sample.producer_id = watermark.producer_id\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = watermark.target_id\n AND failure.producer_id = watermark.producer_id\n )\n ORDER BY watermark.last_committed_at_ms ASC\n LIMIT 500\n )`,\n );\n return this.createPagedDeleteStep(\n () => remove.run(this.options.targetId, cutoffMs, cutoffMs).changes,\n );\n }\n\n private createUnreferencedMetricDefinitionStep(): RetentionStep {\n const definitions = this.options.tableMap.quoted('metricDefinitions');\n const samples = this.options.tableMap.quoted('metricSamples');\n const rollups = this.options.tableMap.quoted('metricRollups');\n const completions = this.options.tableMap.quoted('rollupCompletions');\n const failures = this.options.tableMap.quoted('extractionFailures');\n const read = this.options.connection.prepare(\n `SELECT definition.metric_name, definition.definition_version\n FROM ${definitions} AS definition\n WHERE definition.target_id = ? AND definition.active = 0\n AND NOT EXISTS (\n SELECT 1 FROM ${samples} AS sample\n WHERE sample.target_id = definition.target_id\n AND sample.metric_name = definition.metric_name\n AND sample.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${rollups} AS rollup\n WHERE rollup.target_id = definition.target_id\n AND rollup.metric_name = definition.metric_name\n AND rollup.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${completions} AS completion\n WHERE completion.target_id = definition.target_id\n AND completion.metric_name = definition.metric_name\n AND completion.definition_version = definition.definition_version\n )\n AND NOT EXISTS (\n SELECT 1 FROM ${failures} AS failure\n WHERE failure.target_id = definition.target_id\n AND failure.metric_name = definition.metric_name\n AND failure.definition_version = definition.definition_version\n )\n ORDER BY definition.registered_at_ms ASC\n LIMIT 500`,\n );\n const remove = this.options.connection.prepare(\n `DELETE FROM ${definitions}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ? AND active = 0`,\n );\n return (): RetentionStepOutcome => {\n const rows = read.all(this.options.targetId).map((row) => ({\n metricName: this.readStringField(row, 'metric_name'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n }));\n if (rows.length === 0) {\n return { deleted: 0, done: true };\n }\n const transaction = this.options.connection.transaction(() => {\n let deleted = 0;\n for (const row of rows) {\n deleted += remove.run(\n this.options.targetId,\n row.metricName,\n row.definitionVersion,\n ).changes;\n }\n return deleted;\n });\n const deleted = transaction();\n for (const row of rows) {\n this.definitions.delete(this.definitionKey(row.metricName, row.definitionVersion));\n }\n return { deleted, done: deleted === 0 || rows.length < RETENTION_PAGE_SIZE };\n };\n }\n\n private acknowledgementRetentionMs(): number {\n return this.options.retention.rawMs + this.options.retention.lateArrivalMs;\n }\n\n private longestRetentionMs(): number {\n return Math.max(\n this.options.retention.rawMs,\n this.options.retention.samplesMs,\n ...this.options.retention.rollups.map((tier) => tier.retainMs),\n );\n }\n\n private hasCompletion(\n metricName: string,\n definitionVersion: number,\n resolutionMs: number,\n bucketStartMs: number,\n ): boolean {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const row = this.options.connection\n .prepare(\n `SELECT 1 AS present FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms = ?\n AND state = 'completed'`,\n )\n .get(this.options.targetId, metricName, definitionVersion, resolutionMs, bucketStartMs);\n return row !== undefined;\n }\n\n private metricDefinitions(metricName: string): MetricDefinition[] {\n return [...this.definitions.values()]\n .filter((definition) => definition.name === metricName)\n .sort((left, right) => left.version - right.version);\n }\n\n private validateMetricQuery(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): string | null {\n const dimensionSets = definitions.map((definition) => new Set(definition.groupBy));\n const invalidDimension = Object.keys(query.where).find((field) => {\n return dimensionSets.some((dimensions) => !dimensions.has(field));\n });\n if (invalidDimension) {\n return `Metric ${query.metric} does not declare dimension ${invalidDimension}`;\n }\n if (query.resolution !== 'auto') {\n const explicitResolution = query.resolution;\n const unavailable = definitions.every(\n (definition) => !definition.resolutionsMs.includes(explicitResolution),\n );\n if (unavailable) {\n return `Resolution ${query.resolution} is not configured for metric ${query.metric}`;\n }\n }\n const invalidMeasurement = query.measurements.find((measurement) => {\n return definitions.some((definition) =>\n !this.definitionHasMeasurement(definition, measurement),\n );\n });\n return invalidMeasurement\n ? `Metric ${query.metric} does not declare measurement ${invalidMeasurement}`\n : null;\n }\n\n private definitionHasMeasurement(definition: MetricDefinition, requested: string): boolean {\n if (requested === 'count') {\n return definition.measurements.some((measurement) => measurement.kind === 'count');\n }\n const [field, aggregate] = requested.split('.');\n if (!field || !aggregate) {\n return false;\n }\n return definition.measurements.some((measurement) => {\n return (\n measurement.kind === 'field' &&\n measurement.field === field &&\n ((aggregate === 'avg' && measurement.aggregates.includes('sum')) ||\n (this.isMetricAggregate(aggregate) && measurement.aggregates.includes(aggregate)))\n );\n });\n }\n\n private planCoverage(\n query: MetricQuery,\n definitions: readonly MetricDefinition[],\n ): Readonly<{\n intervals: readonly RollupCoverageInterval[];\n gaps: readonly MetricQueryGap[];\n }> {\n const table = this.options.tableMap.quoted('rollupCompletions');\n const rows = this.options.connection\n .prepare(\n `SELECT definition_version, resolution_ms, bucket_start_ms\n FROM ${table}\n WHERE target_id = ? AND metric_name = ?\n AND state = 'completed'\n AND bucket_start_ms < ?\n AND bucket_start_ms + resolution_ms > ?\n ORDER BY bucket_start_ms ASC, resolution_ms ASC, definition_version DESC`,\n )\n .all(this.options.targetId, query.metric, query.toMs, query.fromMs);\n const definitionVersions = new Set(definitions.map((definition) => definition.version));\n const available = rows\n .map((row) => ({\n fromMs: this.readNumberField(row, 'bucket_start_ms'),\n toMs:\n this.readNumberField(row, 'bucket_start_ms') +\n this.readNumberField(row, 'resolution_ms'),\n definitionVersion: this.readNumberField(row, 'definition_version'),\n resolutionMs: this.readNumberField(row, 'resolution_ms'),\n }))\n .filter((row) => {\n return (\n definitionVersions.has(row.definitionVersion) &&\n (query.resolution === 'auto' || row.resolutionMs === query.resolution)\n );\n });\n const intervals: RollupCoverageInterval[] = [];\n for (const definition of definitions) {\n const versionCandidates = available.filter(\n (candidate) => candidate.definitionVersion === definition.version,\n );\n intervals.push(...this.planDefinitionCoverage(query, versionCandidates));\n }\n const orderedIntervals = intervals.sort((left, right) => {\n return (\n left.fromMs - right.fromMs ||\n left.definitionVersion - right.definitionVersion ||\n left.resolutionMs - right.resolutionMs\n );\n });\n return {\n intervals: orderedIntervals,\n gaps: this.coverageGaps(query, orderedIntervals, available),\n };\n }\n\n private planDefinitionCoverage(\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): readonly RollupCoverageInterval[] {\n const contained = candidates.filter((candidate) => {\n return candidate.fromMs >= query.fromMs && candidate.toMs <= query.toMs;\n });\n const intervals: RollupCoverageInterval[] = [];\n let cursor = query.fromMs;\n while (cursor < query.toMs) {\n const starting = contained\n .filter((candidate) => candidate.fromMs === cursor)\n .sort((left, right) => left.resolutionMs - right.resolutionMs);\n const chosen = starting[0];\n if (chosen) {\n this.appendCoverageInterval(intervals, chosen);\n cursor = chosen.toMs;\n continue;\n }\n const nextStart = contained\n .map((candidate) => candidate.fromMs)\n .filter((startMs) => startMs > cursor)\n .sort((left, right) => left - right)[0];\n cursor = nextStart ?? query.toMs;\n }\n return intervals;\n }\n\n private appendCoverageInterval(\n intervals: RollupCoverageInterval[],\n candidate: RollupCoverageInterval,\n ): void {\n const previous = intervals[intervals.length - 1];\n const extendsPrevious =\n previous !== undefined &&\n previous.toMs === candidate.fromMs &&\n previous.resolutionMs === candidate.resolutionMs &&\n previous.definitionVersion === candidate.definitionVersion;\n if (extendsPrevious) {\n intervals[intervals.length - 1] = { ...previous, toMs: candidate.toMs };\n return;\n }\n intervals.push(candidate);\n }\n\n private coverageGaps(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n candidates: readonly RollupCoverageInterval[],\n ): readonly MetricQueryGap[] {\n const coverage = [...intervals].sort(\n (left, right) => left.fromMs - right.fromMs || right.toMs - left.toMs,\n );\n const gaps: MetricQueryGap[] = [];\n let cursor = query.fromMs;\n for (const interval of coverage) {\n if (interval.fromMs > cursor) {\n this.appendSplitCoverageGaps(gaps, cursor, interval.fromMs, query, candidates);\n }\n cursor = Math.max(cursor, interval.toMs);\n }\n if (cursor < query.toMs) {\n this.appendSplitCoverageGaps(gaps, cursor, query.toMs, query, candidates);\n }\n return Object.freeze(gaps);\n }\n\n private appendSplitCoverageGaps(\n gaps: MetricQueryGap[],\n fromMs: number,\n toMs: number,\n query: MetricQuery,\n candidates: readonly RollupCoverageInterval[],\n ): void {\n const partialCandidates = candidates.filter((candidate) => {\n const outsideQuery = candidate.fromMs < query.fromMs || candidate.toMs > query.toMs;\n return outsideQuery && candidate.fromMs < toMs && candidate.toMs > fromMs;\n });\n const boundaries = new Set<number>([fromMs, toMs]);\n for (const candidate of partialCandidates) {\n boundaries.add(Math.max(fromMs, candidate.fromMs));\n boundaries.add(Math.min(toMs, candidate.toMs));\n }\n const ordered = [...boundaries].sort((left, right) => left - right);\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const gapStart = ordered[index];\n const gapEnd = ordered[index + 1];\n if (gapStart === undefined || gapEnd === undefined || gapStart >= gapEnd) {\n continue;\n }\n const isPartialBucket = partialCandidates.some((candidate) => {\n return candidate.fromMs < gapEnd && candidate.toMs > gapStart;\n });\n this.appendMetricGap(gaps, {\n fromMs: gapStart,\n toMs: gapEnd,\n reason: isPartialBucket ? 'partial-bucket' : 'not-materialized',\n });\n }\n }\n\n private appendMetricGap(gaps: MetricQueryGap[], gap: MetricQueryGap): void {\n const previous = gaps[gaps.length - 1];\n if (previous && previous.toMs === gap.fromMs && previous.reason === gap.reason) {\n gaps[gaps.length - 1] = { ...previous, toMs: gap.toMs };\n return;\n }\n gaps.push(gap);\n }\n\n private readRollupsForCoverage(\n query: MetricQuery,\n intervals: readonly RollupCoverageInterval[],\n ): Array<\n Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>\n > {\n const table = this.options.tableMap.quoted('metricRollups');\n const parsedRows = [];\n for (const interval of intervals) {\n const rows = this.options.connection\n .prepare(\n `SELECT metric_name, definition_version, resolution_ms, bucket_start_ms,\n dimension_key, dimensions_json, values_json\n FROM ${table}\n WHERE target_id = ? AND metric_name = ? AND definition_version = ?\n AND resolution_ms = ? AND bucket_start_ms >= ?\n AND bucket_start_ms + resolution_ms <= ?`,\n )\n .all(\n this.options.targetId,\n query.metric,\n interval.definitionVersion,\n interval.resolutionMs,\n interval.fromMs,\n interval.toMs,\n );\n for (const row of rows) {\n const parsed = this.rowParser.parseMetricRollup(row);\n if (!parsed.ok) {\n throw new Error(parsed.error);\n }\n const dimensions = this.rowParser.parseJsonObject(parsed.value.dimensions_json);\n const values = this.rowParser.parseRollupValues(parsed.value.values_json);\n if (!dimensions.ok) {\n throw new Error(dimensions.error);\n }\n if (!values.ok) {\n throw new Error(values.error);\n }\n parsedRows.push({\n bucket: {\n startMs: parsed.value.bucket_start_ms,\n endMs: parsed.value.bucket_start_ms + parsed.value.resolution_ms,\n dimensions: dimensions.value,\n values: this.rollupValuesToJson(values.value),\n },\n resolutionMs: parsed.value.resolution_ms,\n definitionVersion: parsed.value.definition_version,\n dimensionKey: parsed.value.dimension_key,\n });\n }\n }\n return parsedRows;\n }\n\n private rollupValuesToJson(values: MetricRollupValues): TelemetryJsonObject {\n const fields: Record<string, TelemetryJsonValue> = {};\n for (const [field, aggregate] of Object.entries(values.fields)) {\n fields[field] = {\n count: aggregate.count,\n sum: aggregate.sum,\n min: aggregate.min,\n max: aggregate.max,\n last: aggregate.last,\n avg: aggregate.count === 0 ? 0 : aggregate.sum / aggregate.count,\n };\n }\n return Object.freeze({ count: values.count, ...fields });\n }\n\n private selectMeasurements(\n values: TelemetryJsonObject,\n measurements: readonly string[],\n ): TelemetryJsonObject {\n const selected: Record<string, TelemetryJsonValue> = {};\n for (const measurement of measurements) {\n if (measurement === 'count') {\n selected.count = values.count ?? 0;\n continue;\n }\n const [field, aggregate] = measurement.split('.');\n const fieldValues = field ? values[field] : null;\n if (!field || !aggregate) {\n continue;\n }\n if (!this.isJsonObject(fieldValues)) {\n continue;\n }\n const existing = selected[field];\n const selectedField: Record<string, TelemetryJsonValue> = this.isJsonObject(existing)\n ? { ...existing }\n : {};\n const aggregateValue = fieldValues[aggregate];\n if (aggregateValue !== undefined) {\n selectedField[aggregate] = aggregateValue;\n }\n selected[field] = selectedField;\n }\n return Object.freeze(selected);\n }\n\n private matchesWhere(\n dimensions: TelemetryJsonObject,\n where: Readonly<Record<string, MetricDimensionFilter>>,\n ): boolean {\n return Object.entries(where).every(([field, expected]) => {\n const actual = dimensions[field];\n const candidates = Array.isArray(expected) ? expected : [expected];\n return candidates.some((candidate) => canonicalJson(candidate) === canonicalJson(actual));\n });\n }\n\n private compareParsedRollups(\n left: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n right: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): number {\n const direction = order === 'asc' ? 1 : -1;\n return (\n direction *\n this.compareRollupIdentity(\n left.bucket.startMs,\n left.resolutionMs,\n left.definitionVersion,\n left.dimensionKey,\n right.bucket.startMs,\n right.resolutionMs,\n right.definitionVersion,\n right.dimensionKey,\n )\n );\n }\n\n private isAfterMetricCursor(\n row: Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n cursor: Readonly<{\n bucketStartMs: number;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>,\n order: 'asc' | 'desc',\n ): boolean {\n const comparison = this.compareRollupIdentity(\n row.bucket.startMs,\n row.resolutionMs,\n row.definitionVersion,\n row.dimensionKey,\n cursor.bucketStartMs,\n cursor.resolutionMs,\n cursor.definitionVersion,\n cursor.dimensionKey,\n );\n return order === 'asc' ? comparison > 0 : comparison < 0;\n }\n\n private compareRollupIdentity(\n leftStartMs: number,\n leftResolutionMs: number,\n leftDefinitionVersion: number,\n leftDimensionKey: string,\n rightStartMs: number,\n rightResolutionMs: number,\n rightDefinitionVersion: number,\n rightDimensionKey: string,\n ): number {\n return (\n leftStartMs - rightStartMs ||\n leftResolutionMs - rightResolutionMs ||\n leftDefinitionVersion - rightDefinitionVersion ||\n leftDimensionKey.localeCompare(rightDimensionKey)\n );\n }\n\n private rowsToSegments(\n intervals: readonly RollupCoverageInterval[],\n rows: readonly Readonly<{\n bucket: MetricBucket;\n resolutionMs: number;\n definitionVersion: number;\n dimensionKey: string;\n }>[],\n ): readonly MetricQuerySegment[] {\n return Object.freeze(\n intervals.map((interval) => ({\n fromMs: interval.fromMs,\n toMs: interval.toMs,\n resolutionMs: interval.resolutionMs,\n isAggregated: true as const,\n definitionVersion: interval.definitionVersion,\n buckets: Object.freeze(\n rows\n .filter(\n (row) =>\n row.resolutionMs === interval.resolutionMs &&\n row.definitionVersion === interval.definitionVersion &&\n row.bucket.startMs >= interval.fromMs &&\n row.bucket.endMs <= interval.toMs,\n )\n .map((row) => row.bucket),\n ),\n })),\n );\n }\n\n private committedTargetState(attempts: number): TelemetryAcknowledgement['targetStates'][number] {\n return {\n targetId: this.options.targetId,\n delivery: 'required',\n state: 'committed',\n attempts,\n reason: null,\n };\n }\n\n private definitionKey(name: string, version: number): string {\n return `${name}:${version}`;\n }\n\n private normalizeDefinitions(\n definitions: readonly MetricDefinition[],\n ): readonly MetricDefinition[] {\n return definitions.map((definition) => {\n const normalized = this.definitionContract.normalize(definition);\n if (!normalized.ok) {\n throw new Error(normalized.error);\n }\n return normalized.value;\n });\n }\n\n private bucketStart(occurredAtMs: number, resolutionMs: number): number {\n return Math.floor(occurredAtMs / resolutionMs) * resolutionMs;\n }\n\n private encodeCursor(cursor: object): string {\n return Buffer.from(canonicalJson(cursor), 'utf8').toString('base64url');\n }\n\n private readStringField(row: unknown, field: string): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'string') {\n throw new Error(`Expected string field ${field}`);\n }\n return value;\n }\n\n private readNumberField(row: unknown, field: string): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error(`Expected a SQLite row while reading ${field}`);\n }\n const value = Reflect.get(row, field);\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new Error(`Expected numeric field ${field}`);\n }\n return value;\n }\n\n private parseCommittedDropCounter(row: unknown): TelemetryDropCounter {\n const reason = this.readStringField(row, 'reason');\n const priority = this.readStringField(row, 'priority');\n const count = this.readNumberField(row, 'count');\n if (!this.isDropReason(reason) || !this.isDropPriority(priority)) {\n throw new Error('Stored committed telemetry drop counter identity is invalid');\n }\n if (!Number.isSafeInteger(count) || count < 0) {\n throw new Error('Stored committed telemetry drop counter value is invalid');\n }\n return Object.freeze({ reason, priority, count });\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\n }\n\n private isJsonObject(value: TelemetryJsonValue | undefined): value is TelemetryJsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n }\n\n private isMetricAggregate(value: string): value is MetricAggregate {\n return value === 'sum' || value === 'min' || value === 'max' || value === 'last';\n }\n\n private isDropReason(value: string): value is TelemetryDropCounter['reason'] {\n return (\n value === 'capacity' ||\n value === 'sampled' ||\n value === 'stopped' ||\n value === 'invalid' ||\n value === 'transport'\n );\n }\n\n private isDropPriority(value: string): value is TelemetryDropCounter['priority'] {\n return value === 'low' || value === 'normal' || value === 'high';\n }\n}\n","import { z } from 'zod';\n\nconst integer = z.number().int();\n\nexport const RawTelemetryEventRowSchema = z\n .object({\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n event_id: z.string(),\n occurred_at_ms: integer,\n monotonic_ns: z.string().nullable(),\n source: z.string(),\n process_kind: z.string(),\n level: z.string(),\n label: z.string(),\n conversation_id: z.string().nullable(),\n conversation_id_kind: z.enum(['string', 'number']).nullable(),\n correlation_id: z.string().nullable(),\n metadata_json: z.string(),\n schema_version: integer.positive(),\n })\n .strict();\n\nexport type RawTelemetryEventRow = z.infer<typeof RawTelemetryEventRowSchema>;\n\nexport const BatchAcknowledgementRowSchema = z\n .object({\n idempotency_key: z.string(),\n producer_id: z.string(),\n sequence_start: integer.nonnegative(),\n sequence_end: integer.nonnegative(),\n schema_version: integer.positive(),\n checksum: z.string(),\n accepted_events: integer.nonnegative(),\n committed_at_ms: integer,\n })\n .strict();\n\nexport type BatchAcknowledgementRow = z.infer<typeof BatchAcknowledgementRowSchema>;\n\nexport const MetricSampleRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n occurred_at_ms: integer,\n producer_id: z.string(),\n sequence: integer.nonnegative(),\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricSampleRow = z.infer<typeof MetricSampleRowSchema>;\n\nexport const MetricRollupRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n dimension_key: z.string(),\n dimensions_json: z.string(),\n values_json: z.string(),\n })\n .strict();\n\nexport type MetricRollupRow = z.infer<typeof MetricRollupRowSchema>;\n\nexport const RollupCompletionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n resolution_ms: integer.positive(),\n bucket_start_ms: integer,\n sample_count: integer.nonnegative(),\n sample_watermark_ms: integer,\n completed_at_ms: integer,\n state: z.enum(['completed', 'rejected']),\n detail: z.string().nullable(),\n })\n .strict();\n\nexport type RollupCompletionRow = z.infer<typeof RollupCompletionRowSchema>;\n\nexport const TimelineCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n occurredAtMs: integer,\n producerId: z.string(),\n sequence: integer.nonnegative(),\n })\n .strict();\n\nexport type TimelineCursor = z.infer<typeof TimelineCursorSchema>;\n\nexport const MetricCursorSchema = z\n .object({\n version: z.literal(1),\n order: z.enum(['asc', 'desc']),\n bucketStartMs: integer,\n resolutionMs: integer.positive(),\n definitionVersion: integer.positive(),\n dimensionKey: z.string(),\n })\n .strict();\n\nexport type MetricCursor = z.infer<typeof MetricCursorSchema>;\n\nexport const TelemetryJsonObjectSchema = z.record(z.string(), z.json());\nexport const NumericValuesSchema = z.record(z.string(), z.number().finite());\n\nconst StoredMetricMeasurementSchema = z.discriminatedUnion('kind', [\n z.object({ kind: z.literal('count') }).strict(),\n z\n .object({\n kind: z.literal('field'),\n field: z.string().min(1),\n aggregates: z.array(z.enum(['sum', 'min', 'max', 'last'])).min(1),\n })\n .strict(),\n]);\n\nexport const StoredMetricDefinitionSchema = z\n .object({\n name: z.string().min(1),\n version: integer.positive(),\n selector: z.string().min(1),\n groupBy: z.array(z.string().min(1)),\n measurements: z.array(StoredMetricMeasurementSchema).min(1),\n cardinality: z.record(\n z.string(),\n z\n .object({\n maxValuesPerBucket: integer.positive(),\n overflow: z.enum(['other', 'drop', 'reject']),\n })\n .strict(),\n ),\n targetIds: z.array(z.string().min(1)),\n resolutionsMs: z.array(integer.positive()).min(1),\n missingField: z.enum(['skip', 'record-failure']),\n })\n .strict();\n\nexport const StoredMetricDefinitionRowSchema = z\n .object({\n metric_name: z.string(),\n definition_version: integer.positive(),\n definition_json: z.string(),\n definition_checksum: z.string(),\n active: integer.min(0).max(1),\n })\n .strict();\n\nexport const MetricRollupValuesSchema = z\n .object({\n count: integer.nonnegative(),\n fields: z.record(\n z.string(),\n z\n .object({\n count: integer.nonnegative(),\n sum: z.number().finite(),\n min: z.number().finite(),\n max: z.number().finite(),\n last: z.number().finite(),\n lastOccurredAtMs: integer,\n lastProducerId: z.string(),\n lastSequence: integer.nonnegative(),\n })\n .strict(),\n ),\n })\n .strict();\n","import type { TelemetryEnvelope } from '../core/types/envelope.types.js';\nimport type { TelemetryJsonObject } from '../core/types/json.types.js';\nimport type { TelemetryResult } from '../core/types/result.types.js';\nimport {\n MetricCursorSchema,\n MetricRollupRowSchema,\n MetricRollupValuesSchema,\n MetricSampleRowSchema,\n NumericValuesSchema,\n RawTelemetryEventRowSchema,\n TelemetryJsonObjectSchema,\n TimelineCursorSchema,\n type MetricCursor,\n type MetricRollupRow,\n type MetricSampleRow,\n type TimelineCursor,\n} from './schema/telemetry_repository_rows.js';\nimport type { MetricRollupValues } from '../core/types/metric.types.js';\n\nexport class TelemetryRepositoryRowParser {\n parseRawEnvelope(input: unknown): TelemetryResult<TelemetryEnvelope, string> {\n const parsed = RawTelemetryEventRowSchema.safeParse(input);\n if (!parsed.success) {\n return { ok: false, error: parsed.error.message };\n }\n const metadata = this.parseJsonObject(parsed.data.metadata_json);\n if (!metadata.ok) {\n return metadata;\n }\n const conversationId = this.parseConversationId(\n parsed.data.conversation_id,\n parsed.data.conversation_id_kind,\n );\n if (!conversationId.ok) {\n return conversationId;\n }\n return {\n ok: true,\n value: Object.freeze({\n schemaVersion: parsed.data.schema_version,\n eventId: parsed.data.event_id,\n producerId: parsed.data.producer_id,\n sequence: parsed.data.sequence,\n occurredAtMs: parsed.data.occurred_at_ms,\n monotonicNs: parsed.data.monotonic_ns,\n source: parsed.data.source,\n processKind: parsed.data.process_kind,\n level: parsed.data.level,\n label: parsed.data.label,\n conversationId: conversationId.value,\n correlationId: parsed.data.correlation_id,\n metadata: metadata.value,\n }),\n };\n }\n\n parseMetricSample(input: unknown): TelemetryResult<MetricSampleRow, string> {\n const parsed = MetricSampleRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseMetricRollup(input: unknown): TelemetryResult<MetricRollupRow, string> {\n const parsed = MetricRollupRowSchema.safeParse(input);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n }\n\n parseJsonObject(input: string): TelemetryResult<TelemetryJsonObject, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = TelemetryJsonObjectSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseNumericValues(input: string): TelemetryResult<Readonly<Record<string, number>>, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = NumericValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: Object.freeze(parsed.data) }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseRollupValues(input: string): TelemetryResult<MetricRollupValues, string> {\n try {\n const decoded: unknown = JSON.parse(input);\n const parsed = MetricRollupValuesSchema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n parseTimelineCursor(input: string): TelemetryResult<TimelineCursor, string> {\n return this.parseCursor(input, TimelineCursorSchema);\n }\n\n parseMetricCursor(input: string): TelemetryResult<MetricCursor, string> {\n return this.parseCursor(input, MetricCursorSchema);\n }\n\n private parseCursor<T>(input: string, schema: { safeParse(value: unknown): { success: true; data: T } | { success: false; error: Error } }): TelemetryResult<T, string> {\n try {\n const decodedText = Buffer.from(input, 'base64url').toString('utf8');\n const decoded: unknown = JSON.parse(decodedText);\n const parsed = schema.safeParse(decoded);\n return parsed.success\n ? { ok: true, value: parsed.data }\n : { ok: false, error: parsed.error.message };\n } catch (cause) {\n return { ok: false, error: cause instanceof Error ? cause.message : String(cause) };\n }\n }\n\n private parseConversationId(\n value: string | null,\n kind: 'string' | 'number' | null,\n ): TelemetryResult<string | number | null, string> {\n if (value === null) {\n return { ok: true, value: null };\n }\n if (kind === 'string') {\n return { ok: true, value };\n }\n if (kind === 'number') {\n const numeric = Number(value);\n return Number.isFinite(numeric)\n ? { ok: true, value: numeric }\n : { ok: false, error: `Invalid numeric conversation id ${value}` };\n }\n return { ok: false, error: 'Conversation id kind is missing' };\n }\n}\n","import { z } from 'zod';\n\nexport const TelemetrySchemaManifestRowSchema = z.object({\n target_id: z.string(),\n format_version: z.number().int().positive(),\n mapping_json: z.string(),\n mapping_checksum: z.string(),\n state: z.enum(['ready', 'renaming']),\n pending_mapping_json: z.string().nullable(),\n updated_at_ms: z.number().int(),\n}).strict();\n\nexport type TelemetrySchemaManifestRow = z.infer<typeof TelemetrySchemaManifestRowSchema>;\n","export type ReadOnlySqlKind = 'select' | 'with' | 'explain-query-plan' | 'pragma';\n\nexport type ReadOnlySqlStatement = Readonly<{\n sql: string;\n kind: ReadOnlySqlKind;\n}>;\n\ntype SqlToken = Readonly<{ value: string; position: number }>;\n\nconst MUTATION_KEYWORDS = new Set([\n 'INSERT',\n 'UPDATE',\n 'DELETE',\n 'REPLACE',\n 'CREATE',\n 'ALTER',\n 'DROP',\n 'ATTACH',\n 'DETACH',\n 'VACUUM',\n 'REINDEX',\n 'ANALYZE',\n 'BEGIN',\n 'COMMIT',\n 'ROLLBACK',\n 'SAVEPOINT',\n 'RELEASE',\n 'END',\n]);\n\nconst READ_ONLY_PRAGMAS = new Set([\n 'TABLE_INFO',\n 'TABLE_XINFO',\n 'INDEX_LIST',\n 'INDEX_INFO',\n 'INDEX_XINFO',\n 'FOREIGN_KEY_LIST',\n 'DATABASE_LIST',\n 'COMPILE_OPTIONS',\n 'SCHEMA_VERSION',\n 'USER_VERSION',\n 'QUICK_CHECK',\n 'INTEGRITY_CHECK',\n]);\n\nconst PARAMETERIZED_READ_ONLY_PRAGMAS = new Set([\n 'TABLE_INFO',\n 'TABLE_XINFO',\n 'INDEX_LIST',\n 'INDEX_INFO',\n 'INDEX_XINFO',\n 'FOREIGN_KEY_LIST',\n 'QUICK_CHECK',\n 'INTEGRITY_CHECK',\n]);\n\nexport class ReadOnlySqlGuard {\n validate(source: string): ReadOnlySqlStatement {\n const { tokens, semicolons } = this.scan(source);\n if (tokens.length === 0) {\n throw new Error('Diagnostic SQL cannot be empty');\n }\n const sql = this.singleStatement(source, tokens, semicolons);\n const values = tokens.map((token) => token.value);\n const mutation = values.find((token) => MUTATION_KEYWORDS.has(token));\n if (mutation !== undefined) {\n throw new Error(`Diagnostic SQL cannot contain ${mutation}`);\n }\n const first = values[0];\n if (first === 'SELECT') {\n return Object.freeze({ sql, kind: 'select' });\n }\n if (first === 'WITH') {\n return Object.freeze({ sql, kind: 'with' });\n }\n if (\n first === 'EXPLAIN' &&\n values[1] === 'QUERY' &&\n values[2] === 'PLAN' &&\n (values[3] === 'SELECT' || values[3] === 'WITH')\n ) {\n return Object.freeze({ sql, kind: 'explain-query-plan' });\n }\n if (first === 'PRAGMA') {\n return this.validatePragma(sql, values);\n }\n throw new Error(\n 'Diagnostic SQL must be SELECT, read-only WITH, EXPLAIN QUERY PLAN, or an allowlisted PRAGMA',\n );\n }\n\n private validatePragma(sql: string, tokens: readonly string[]): ReadOnlySqlStatement {\n const pragma = tokens[1];\n if (pragma === undefined || !READ_ONLY_PRAGMAS.has(pragma)) {\n throw new Error(`PRAGMA ${pragma ?? '<missing>'} is not allowed`);\n }\n if (\n tokens.includes('=') ||\n (tokens.includes('(') && !PARAMETERIZED_READ_ONLY_PRAGMAS.has(pragma))\n ) {\n throw new Error('Diagnostic PRAGMA assignments are not allowed');\n }\n return Object.freeze({ sql, kind: 'pragma' });\n }\n\n private singleStatement(\n source: string,\n tokens: readonly SqlToken[],\n semicolons: readonly number[],\n ): string {\n if (semicolons.length > 1) {\n throw new Error('Diagnostic SQL accepts exactly one statement');\n }\n const semicolon = semicolons[0];\n if (semicolon === undefined) {\n return source.trim();\n }\n if (tokens.some((token) => token.position > semicolon)) {\n throw new Error('Diagnostic SQL accepts exactly one statement');\n }\n return source.slice(0, semicolon).trim();\n }\n\n private scan(source: string): Readonly<{\n tokens: readonly SqlToken[];\n semicolons: readonly number[];\n }> {\n const tokens: SqlToken[] = [];\n const semicolons: number[] = [];\n let index = 0;\n while (index < source.length) {\n const character = source[index] ?? '';\n const next = source[index + 1] ?? '';\n if (/\\s/.test(character)) {\n index += 1;\n } else if (character === '-' && next === '-') {\n index = this.skipLineComment(source, index + 2);\n } else if (character === '/' && next === '*') {\n index = this.skipBlockComment(source, index + 2);\n } else if (character === \"'\" || character === '\"' || character === '`') {\n index = this.skipQuoted(source, index, character);\n } else if (character === '[') {\n index = this.skipBracketIdentifier(source, index + 1);\n } else if (character === ';') {\n semicolons.push(index);\n index += 1;\n } else if (/[A-Za-z_]/.test(character)) {\n const start = index;\n index += 1;\n while (/[A-Za-z0-9_]/.test(source[index] ?? '')) {\n index += 1;\n }\n tokens.push({ value: source.slice(start, index).toUpperCase(), position: start });\n } else {\n tokens.push({ value: character, position: index });\n index += 1;\n }\n }\n return Object.freeze({\n tokens: Object.freeze(tokens),\n semicolons: Object.freeze(semicolons),\n });\n }\n\n private skipLineComment(source: string, index: number): number {\n const newline = source.indexOf('\\n', index);\n return newline < 0 ? source.length : newline + 1;\n }\n\n private skipBlockComment(source: string, index: number): number {\n const end = source.indexOf('*/', index);\n if (end < 0) {\n throw new Error('Diagnostic SQL has an unterminated block comment');\n }\n return end + 2;\n }\n\n private skipQuoted(source: string, opening: number, quote: string): number {\n let index = opening + 1;\n while (index < source.length) {\n if (source[index] === quote) {\n if (source[index + 1] === quote) {\n index += 2;\n continue;\n }\n return index + 1;\n }\n index += 1;\n }\n throw new Error('Diagnostic SQL has an unterminated quoted value');\n }\n\n private skipBracketIdentifier(source: string, index: number): number {\n const end = source.indexOf(']', index);\n if (end < 0) {\n throw new Error('Diagnostic SQL has an unterminated bracket identifier');\n }\n return end + 1;\n }\n}\n","export type TelemetryCliCommandKind =\n | 'help'\n | 'timeline-query'\n | 'metrics-query'\n | 'metrics-graph'\n | 'sqlite-query'\n | 'sqlite-compact'\n | 'sqlite-migration-status'\n | 'sqlite-migration-up';\n\nexport type ParsedTelemetryCliCommand = Readonly<{\n kind: TelemetryCliCommandKind;\n options: ReadonlyMap<string, readonly string[]>;\n}>;\n\nconst COMMON_QUERY_OPTIONS = [\n 'config',\n 'target',\n 'from',\n 'to',\n 'order',\n 'limit',\n 'cursor',\n 'format',\n 'timezone',\n 'storage-base',\n] as const;\n\nconst ALLOWED_OPTIONS: Readonly<Record<TelemetryCliCommandKind, ReadonlySet<string>>> =\n Object.freeze({\n help: new Set<string>(),\n 'timeline-query': new Set([\n ...COMMON_QUERY_OPTIONS,\n 'label',\n 'conversation-id',\n 'source',\n 'level',\n 'producer-id',\n 'correlation-id',\n ]),\n 'metrics-query': new Set([\n ...COMMON_QUERY_OPTIONS,\n 'metric',\n 'where',\n 'measurement',\n 'resolution',\n 'source',\n ]),\n 'metrics-graph': new Set([\n ...COMMON_QUERY_OPTIONS,\n 'metric',\n 'where',\n 'measurement',\n 'resolution',\n 'source',\n 'type',\n 'output',\n 'width',\n 'height',\n 'max-series',\n 'max-points',\n ]),\n 'sqlite-query': new Set([\n 'config',\n 'target',\n 'storage-base',\n 'sql',\n 'param',\n 'format',\n 'limit',\n 'max-duration',\n ]),\n 'sqlite-compact': new Set(['config', 'target', 'storage-base', 'format']),\n 'sqlite-migration-status': new Set(['config', 'target', 'storage-base', 'format']),\n 'sqlite-migration-up': new Set(['config', 'target', 'storage-base', 'format']),\n });\n\nconst REPEATABLE_OPTIONS = new Set(['where', 'measurement', 'param']);\n\nconst COMMANDS: readonly Readonly<{\n tokens: readonly string[];\n kind: TelemetryCliCommandKind;\n}>[] = Object.freeze([\n { tokens: ['timeline', 'query'], kind: 'timeline-query' },\n { tokens: ['metrics', 'query'], kind: 'metrics-query' },\n { tokens: ['metrics', 'graph'], kind: 'metrics-graph' },\n { tokens: ['sqlite', 'query'], kind: 'sqlite-query' },\n { tokens: ['sqlite', 'compact'], kind: 'sqlite-compact' },\n { tokens: ['sqlite', 'migration', 'status'], kind: 'sqlite-migration-status' },\n { tokens: ['sqlite', 'migration', 'up'], kind: 'sqlite-migration-up' },\n]);\n\nexport class TelemetryCliUsageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TelemetryCliUsageError';\n }\n}\n\nexport class TelemetryCliArguments {\n parse(argv: readonly string[]): ParsedTelemetryCliCommand {\n const { kind, optionStart } = this.command(argv);\n const options = this.options(argv.slice(optionStart), ALLOWED_OPTIONS[kind]);\n return Object.freeze({ kind, options });\n }\n\n private command(argv: readonly string[]): Readonly<{\n kind: TelemetryCliCommandKind;\n optionStart: number;\n }> {\n if (argv.length === 0 || argv[0] === 'help' || argv[0] === '--help') {\n return { kind: 'help', optionStart: argv.length };\n }\n const matched = COMMANDS.find((candidate) =>\n candidate.tokens.every((token, index) => argv[index] === token),\n );\n if (matched !== undefined) {\n return { kind: matched.kind, optionStart: matched.tokens.length };\n }\n if (argv.slice(0, 3).join(' ') === 'sqlite schema rename') {\n throw new TelemetryCliUsageError(\n 'sqlite schema rename is unavailable until manifest-backed recovery is implemented',\n );\n }\n throw new TelemetryCliUsageError(`Unknown telemetry command: ${argv.join(' ')}`);\n }\n\n private options(\n argv: readonly string[],\n allowed: ReadonlySet<string>,\n ): ReadonlyMap<string, readonly string[]> {\n const parsed = new Map<string, string[]>();\n for (let index = 0; index < argv.length; index += 2) {\n const token = argv[index];\n const value = argv[index + 1];\n if (token === undefined || !token.startsWith('--') || token.length === 2) {\n throw new TelemetryCliUsageError(\n `Expected a --named option, received ${token ?? '<missing>'}`,\n );\n }\n const name = token.slice(2);\n if (!allowed.has(name)) {\n throw new TelemetryCliUsageError(`Unknown option --${name}`);\n }\n if (value === undefined || value.startsWith('--')) {\n throw new TelemetryCliUsageError(`Option --${name} requires a value`);\n }\n const existing = parsed.get(name) ?? [];\n if (existing.length > 0 && !REPEATABLE_OPTIONS.has(name)) {\n throw new TelemetryCliUsageError(`Option --${name} may only be provided once`);\n }\n existing.push(value);\n parsed.set(name, existing);\n }\n return new Map([...parsed.entries()].map(([name, values]) => [name, Object.freeze(values)]));\n }\n}\n","import type { MetricQueryResponse, TimelineQueryResponse } from '../../core/types/query.types.js';\nimport type {\n TelemetryCliCompactionResult,\n TelemetryCliDiagnosticResult,\n TelemetryCliMigrationStatus,\n TelemetryCliStructuredFormat,\n} from '../types/telemetry_cli.types.js';\n\nexport class TelemetryCliFormatter {\n timeline(\n response: TimelineQueryResponse,\n format: TelemetryCliStructuredFormat,\n timezone: string,\n ): string {\n if (format === 'json') {\n return this.json(response);\n }\n if (format === 'jsonl') {\n const records = [\n ...response.events.map((event) => ({ kind: 'event', targetId: response.targetId, event })),\n ...response.gaps.map((gap) => ({ kind: 'gap', targetId: response.targetId, gap })),\n { kind: 'page', targetId: response.targetId, nextCursor: response.nextCursor },\n ];\n return this.jsonLines(records);\n }\n if (format === 'csv') {\n const rows = [\n ...response.events.map((event) => [\n 'event',\n response.targetId,\n event.occurredAtMs,\n '',\n event.producerId,\n event.sequence,\n event.level,\n event.label,\n event.conversationId ?? '',\n JSON.stringify(event.metadata),\n '',\n ]),\n ...response.gaps.map((gap) => [\n 'gap',\n response.targetId,\n gap.fromMs,\n gap.toMs,\n '',\n '',\n '',\n '',\n '',\n '',\n gap.reason,\n ]),\n ['page', response.targetId, '', '', '', '', '', '', '', '', response.nextCursor ?? ''],\n ];\n return this.csv(\n [\n 'kind',\n 'targetId',\n 'fromMs',\n 'toMs',\n 'producerId',\n 'sequence',\n 'level',\n 'label',\n 'conversationId',\n 'metadata',\n 'detail',\n ],\n rows,\n );\n }\n const lines = [\n `Target: ${response.targetId}`,\n 'occurredAt\\tlevel\\tlabel\\tconversationId\\tproducerId\\tsequence',\n ...response.events.map((event) =>\n [\n this.timestamp(event.occurredAtMs, timezone),\n event.level,\n event.label,\n event.conversationId ?? '',\n event.producerId,\n event.sequence,\n ].join('\\t'),\n ),\n ...response.gaps.map(\n (gap) =>\n `GAP\\t${this.timestamp(gap.fromMs, timezone)} -> ${this.timestamp(gap.toMs, timezone)}\\t${gap.reason}`,\n ),\n `Next cursor: ${response.nextCursor ?? 'none'}`,\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n metrics(\n response: MetricQueryResponse,\n format: TelemetryCliStructuredFormat,\n timezone: string,\n ): string {\n if (format === 'json') {\n return this.json(response);\n }\n const buckets = response.segments.flatMap((segment) =>\n segment.buckets.map((bucket) => ({\n targetId: response.targetId,\n metric: response.metric,\n definitionVersion: segment.definitionVersion,\n resolutionMs: segment.resolutionMs,\n bucket,\n })),\n );\n if (format === 'jsonl') {\n const records = [\n ...buckets.map((bucket) => ({ kind: 'bucket', ...bucket })),\n ...response.gaps.map((gap) => ({ kind: 'gap', targetId: response.targetId, gap })),\n ...response.partialFailures.map((failure) => ({ kind: 'partial-failure', failure })),\n { kind: 'page', targetId: response.targetId, nextCursor: response.nextCursor },\n ];\n return this.jsonLines(records);\n }\n if (format === 'csv') {\n return this.csv(\n [\n 'kind',\n 'targetId',\n 'metric',\n 'definitionVersion',\n 'resolutionMs',\n 'startMs',\n 'endMs',\n 'dimensions',\n 'values',\n 'detail',\n ],\n [\n ...buckets.map((entry) => [\n 'bucket',\n entry.targetId,\n entry.metric,\n entry.definitionVersion,\n entry.resolutionMs,\n entry.bucket.startMs,\n entry.bucket.endMs,\n JSON.stringify(entry.bucket.dimensions),\n JSON.stringify(entry.bucket.values),\n '',\n ]),\n ...response.gaps.map((gap) => [\n 'gap',\n response.targetId,\n response.metric,\n '',\n '',\n gap.fromMs,\n gap.toMs,\n '',\n '',\n gap.reason,\n ]),\n ...response.partialFailures.map((failure) => [\n 'partial-failure',\n failure.targetId,\n response.metric,\n '',\n '',\n '',\n '',\n '',\n '',\n failure.reason,\n ]),\n [\n 'page',\n response.targetId,\n response.metric,\n '',\n '',\n '',\n '',\n '',\n '',\n response.nextCursor ?? '',\n ],\n ],\n );\n }\n const lines = [\n `Target: ${response.targetId}`,\n `Metric: ${response.metric}`,\n 'start\\tend\\tresolutionMs\\tdefinition\\tdimensions\\tvalues',\n ...buckets.map((entry) =>\n [\n this.timestamp(entry.bucket.startMs, timezone),\n this.timestamp(entry.bucket.endMs, timezone),\n entry.resolutionMs,\n entry.definitionVersion,\n JSON.stringify(entry.bucket.dimensions),\n JSON.stringify(entry.bucket.values),\n ].join('\\t'),\n ),\n ...response.gaps.map(\n (gap) =>\n `GAP\\t${this.timestamp(gap.fromMs, timezone)} -> ${this.timestamp(gap.toMs, timezone)}\\t${gap.reason}`,\n ),\n ...response.partialFailures.map(\n (failure) => `PARTIAL\\t${failure.targetId}\\t${failure.reason}`,\n ),\n `Next cursor: ${response.nextCursor ?? 'none'}`,\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n diagnostic(result: TelemetryCliDiagnosticResult, format: TelemetryCliStructuredFormat): string {\n if (format === 'json') {\n return this.json(result);\n }\n if (format === 'jsonl') {\n return this.jsonLines(result.rows);\n }\n if (format === 'csv') {\n return this.csv(\n result.columns,\n result.rows.map((row) => result.columns.map((column) => row[column] ?? '')),\n );\n }\n const lines = [\n result.columns.join('\\t'),\n ...result.rows.map((row) =>\n result.columns.map((column) => this.cell(row[column])).join('\\t'),\n ),\n `Rows: ${result.rows.length}${result.truncated ? ' (truncated)' : ''}; elapsedMs=${result.elapsedMs}`,\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n compaction(result: TelemetryCliCompactionResult, format: 'table' | 'json'): string {\n if (format === 'json') {\n return this.json(result);\n }\n return [\n `Target: ${result.targetId}`,\n `Auto-vacuum: ${result.autoVacuum}`,\n `Pages: ${result.pagesBefore} -> ${result.pagesAfter} (${result.reclaimedPages} reclaimed)`,\n `Freelist: ${result.freePagesBefore} -> ${result.freePagesAfter}`,\n `Database bytes: ${result.databaseBytesBefore} -> ${result.databaseBytesAfter}`,\n `WAL bytes: ${result.walBytesBefore} -> ${result.walBytesAfter}`,\n `Filesystem bytes reclaimed: ${result.reclaimedBytes}`,\n `Elapsed ms: ${result.elapsedMs}`,\n '',\n ].join('\\n');\n }\n\n migrations(result: TelemetryCliMigrationStatus, format: 'table' | 'json'): string {\n if (format === 'json') {\n return this.json(result);\n }\n return [\n `Target: ${result.targetId}`,\n `Completed (${result.completed.length}): ${result.completed.join(', ') || 'none'}`,\n `Pending (${result.pending.length}): ${result.pending.join(', ') || 'none'}`,\n '',\n ].join('\\n');\n }\n\n private json(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n }\n\n private jsonLines(values: readonly unknown[]): string {\n return values.length === 0\n ? ''\n : `${values.map((value) => JSON.stringify(value)).join('\\n')}\\n`;\n }\n\n private csv(columns: readonly string[], rows: readonly (readonly unknown[])[]): string {\n const lines = [\n columns.map((column) => this.csvCell(column)).join(','),\n ...rows.map((row) => row.map((value) => this.csvCell(value)).join(',')),\n ];\n return `${lines.join('\\n')}\\n`;\n }\n\n private csvCell(value: unknown): string {\n const text = this.cell(value);\n return `\"${text.replaceAll('\"', '\"\"')}\"`;\n }\n\n private cell(value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return String(value).replace(/[\\r\\n\\t]/g, ' ');\n }\n\n private timestamp(value: number, timezone: string): string {\n if (timezone === 'UTC') {\n return new Date(value).toISOString();\n }\n return new Intl.DateTimeFormat('en-CA', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hourCycle: 'h23',\n timeZoneName: 'short',\n }).format(value);\n }\n}\n"],"mappings":"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","names":["import_node_fs","loadYaml","key","import_node_fs","import_node_path","BetterSqlite3","import_node_crypto","import_node_fs","import_node_path","import_better_sqlite3","import_node_fs","import_node_path","import_zod","deleted","import_zod","BetterSqlite3"]}
|