@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.
Files changed (79) hide show
  1. package/README.md +6 -0
  2. package/dist/browser/index.d.cts +6 -5
  3. package/dist/browser/index.d.ts +6 -5
  4. package/dist/{browser_telemetry_client-BSAMZ8Qb.d.cts → browser_telemetry_client-ClZl3awO.d.cts} +2 -2
  5. package/dist/{browser_telemetry_client-DPBU6NGw.d.ts → browser_telemetry_client-t4dPp8Ku.d.ts} +2 -2
  6. package/dist/cli/telemetry_bin.cjs +393 -35
  7. package/dist/cli/telemetry_bin.cjs.map +1 -1
  8. package/dist/cli/telemetry_bin.js +378 -20
  9. package/dist/cli/telemetry_bin.js.map +1 -1
  10. package/dist/cli/telemetry_cli.cjs +393 -35
  11. package/dist/cli/telemetry_cli.cjs.map +1 -1
  12. package/dist/cli/telemetry_cli.d.cts +35 -5
  13. package/dist/cli/telemetry_cli.d.ts +35 -5
  14. package/dist/cli/telemetry_cli.js +378 -20
  15. package/dist/cli/telemetry_cli.js.map +1 -1
  16. package/dist/{client_defaults-ShVYQYmn.d.ts → client_defaults-CZ8PysZX.d.ts} +2 -2
  17. package/dist/{client_defaults-Dk0MMzvx.d.cts → client_defaults-lDbWYWWK.d.cts} +2 -2
  18. package/dist/core/index.cjs +5 -1
  19. package/dist/core/index.cjs.map +1 -1
  20. package/dist/core/index.d.cts +15 -12
  21. package/dist/core/index.d.ts +15 -12
  22. package/dist/core/index.js +5 -1
  23. package/dist/core/index.js.map +1 -1
  24. package/dist/electron/index.d.cts +5 -4
  25. package/dist/electron/index.d.ts +5 -4
  26. package/dist/{envelope.types-rOLpWXRC.d.cts → envelope.types-DIvZD3xH.d.ts} +2 -6
  27. package/dist/{envelope.types-rOLpWXRC.d.ts → envelope.types-DyrlRG49.d.cts} +2 -6
  28. package/dist/{in_memory_batch_transport-DKW9EZnU.d.cts → in_memory_batch_transport-3T6gElXP.d.cts} +1 -1
  29. package/dist/{in_memory_batch_transport-oOwNxXnA.d.ts → in_memory_batch_transport-DpQU6JqM.d.ts} +1 -1
  30. package/dist/index.cjs +5 -1
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.cts +14 -12
  33. package/dist/index.d.ts +14 -12
  34. package/dist/index.js +5 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/json.types-BqS77fcN.d.cts +7 -0
  37. package/dist/json.types-BqS77fcN.d.ts +7 -0
  38. package/dist/{maintenance_coordinator.types-C4ULi4A4.d.cts → maintenance_coordinator.types-Crhx9i9k.d.cts} +3 -3
  39. package/dist/{maintenance_coordinator.types-ikUrRXmO.d.ts → maintenance_coordinator.types-DprmgpVn.d.ts} +3 -3
  40. package/dist/metric.types-D8aOAnUm.d.ts +67 -0
  41. package/dist/metric.types-Dg4eZq6u.d.cts +67 -0
  42. package/dist/{metric_definition_contract-BYtnODhu.d.ts → metric_definition_contract-C6MERhJs.d.ts} +1 -1
  43. package/dist/{metric_definition_contract-DfhhmTZ1.d.cts → metric_definition_contract-DoAk7NOw.d.cts} +1 -1
  44. package/dist/node/index.cjs +5 -1
  45. package/dist/node/index.cjs.map +1 -1
  46. package/dist/node/index.d.cts +11 -9
  47. package/dist/node/index.d.ts +11 -9
  48. package/dist/node/index.js +5 -1
  49. package/dist/node/index.js.map +1 -1
  50. package/dist/node/producer/index.d.cts +5 -4
  51. package/dist/node/producer/index.d.ts +5 -4
  52. package/dist/projector/index.cjs +1370 -0
  53. package/dist/projector/index.cjs.map +1 -0
  54. package/dist/projector/index.d.cts +246 -0
  55. package/dist/projector/index.d.ts +246 -0
  56. package/dist/projector/index.js +1328 -0
  57. package/dist/projector/index.js.map +1 -0
  58. package/dist/{query.types-DU5v7vM0.d.ts → query.types-CRqAsGTX.d.cts} +4 -66
  59. package/dist/{query.types-DuYWbFFe.d.cts → query.types-DnOMYXpC.d.ts} +4 -66
  60. package/dist/sqlite/index.cjs +5 -1
  61. package/dist/sqlite/index.cjs.map +1 -1
  62. package/dist/sqlite/index.d.cts +7 -5
  63. package/dist/sqlite/index.d.ts +7 -5
  64. package/dist/sqlite/index.js +5 -1
  65. package/dist/sqlite/index.js.map +1 -1
  66. package/dist/{storage.types-k7oElEB3.d.ts → storage.types-BKWoIOHp.d.ts} +3 -2
  67. package/dist/{storage.types-Bji_pWqr.d.cts → storage.types-DHbAm3j_.d.cts} +3 -2
  68. package/dist/{telemetry_client-BO5Pjp41.d.cts → telemetry_client-Bg5tbj5E.d.cts} +3 -2
  69. package/dist/{telemetry_client-D8uZ-mTL.d.ts → telemetry_client-DWKgufmc.d.ts} +3 -2
  70. package/dist/{telemetry_configuration_parser-BZ8Nvnle.d.ts → telemetry_configuration_parser-6BR3_dD_.d.ts} +2 -2
  71. package/dist/{telemetry_configuration_parser-CgSN7R6A.d.cts → telemetry_configuration_parser-ybeweUPE.d.cts} +2 -2
  72. package/dist/testing/index.d.cts +7 -5
  73. package/dist/testing/index.d.ts +7 -5
  74. package/dist/trace-adapter/index.d.cts +4 -3
  75. package/dist/trace-adapter/index.d.ts +4 -3
  76. package/dist/{transport.types-BAl_TRtU.d.cts → transport.types-C2dP-eed.d.cts} +1 -1
  77. package/dist/{transport.types-DDnZoKWi.d.ts → transport.types-SA8KpLiK.d.ts} +1 -1
  78. package/native/noego_telemetry_native.node +0 -0
  79. package/package.json +11 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transports/index.ts","../../src/transports/sqlite_transport.ts","../../src/core/helper/canonical_json.ts","../../src/storage/helper/sqlite_table_names.ts","../../src/storage/sqlite_ownership_lease.ts","../../src/storage/telemetry_proper_sql_runner.ts","../../src/storage/telemetry_repository.ts","../../src/core/metric_definition_contract.ts","../../src/storage/schema/telemetry_repository_rows.ts","../../src/storage/telemetry_repository_row_parser.ts","../../src/storage/telemetry_table_map.ts","../../src/transports/schema/telemetry_schema_manifest.ts"],"sourcesContent":["export { SQLiteTelemetryTransport } from './sqlite_transport.js';\nexport type { SQLiteTelemetryTransportOptions } from './types/sqlite_transport.types.js';\nexport type {\n SqliteMaintenanceConfiguration,\n SqliteRetentionConfiguration,\n SqliteSchemaConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n} from '../core/types/configuration.types.js';\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 {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from '../core/helper/canonical_json.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 type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../core/types/storage.types.js';\nimport type { TelemetryAcknowledgement } from '../core/types/transport.types.js';\nimport { SQLITE_LOGICAL_TABLE_NAMES, SQLITE_SCHEMA_MANIFEST_TABLE } 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 './schema/telemetry_schema_manifest.js';\nimport type { SQLiteTelemetryTransportOptions } from './types/sqlite_transport.types.js';\n\nconst DEFAULT_MIGRATIONS_DIRECTORY = typeof __dirname === 'string'\n ? resolve(__dirname, '../../migrations')\n : fileURLToPath(new URL('../../migrations/', import.meta.url));\n\nexport class SQLiteTelemetryTransport<IntervalHandle = unknown> implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities = Object.freeze({\n rawPersistence: true,\n metricSamples: true,\n rollups: true,\n queries: true,\n retention: true,\n maintenance: true,\n });\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n private tableMap: TelemetryTableMap | null = null;\n private connection: BetterSqlite3.Database | null = null;\n private repository: TelemetryRepository | null = null;\n private definitions: readonly MetricDefinition[] = Object.freeze([]);\n private lease: SqliteOwnershipLease | null = null;\n private heartbeatHandle: IntervalHandle | null = null;\n private activeReaders = 0;\n private activeWrites = 0;\n private accepting = false;\n\n constructor(private readonly options: SQLiteTelemetryTransportOptions<IntervalHandle>) {\n this.targetId = options.configuration.targetId;\n this.validateConfiguration();\n }\n\n static defaults(\n configuration: SQLiteTelemetryTransportOptions['configuration'],\n ): SQLiteTelemetryTransportOptions<ReturnType<typeof setInterval>> {\n return {\n configuration,\n migrationsDirectory: DEFAULT_MIGRATIONS_DIRECTORY,\n processToken: randomUUID(),\n now: () => Date.now(),\n createInterval: (work, intervalMs) => setInterval(work, intervalMs),\n clearInterval: (handle) => clearInterval(handle),\n delay: (durationMs) => new Promise((resolve) => setTimeout(resolve, durationMs)),\n };\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start SQLite telemetry target from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n const tableMap = TelemetryTableMap.create(this.options.configuration.schema);\n if (!tableMap.ok) {\n return this.failStart(tableMap.error);\n }\n this.tableMap = tableMap.value;\n this.lease = new SqliteOwnershipLease({\n targetId: this.targetId,\n databasePath: this.options.configuration.path,\n mode: 'writer',\n expiryMs: this.options.configuration.leaseExpiryMs,\n processToken: this.options.processToken,\n now: this.options.now,\n });\n const acquired = this.lease.acquire();\n if (!acquired.ok) {\n return this.failStart(acquired.error);\n }\n\n try {\n const connection = new BetterSqlite3(this.options.configuration.path);\n this.connection = connection;\n this.configureConnection(connection);\n const manifestNeedsUpgrade = this.initializeAndVerifyManifest(connection, tableMap.value);\n await this.runMigrations(connection, tableMap.value);\n this.verifySchema(connection, tableMap.value);\n if (manifestNeedsUpgrade) {\n this.upgradeManifestMapping(connection, tableMap.value);\n }\n const stackDatabase = await createSqliteDb(connection);\n this.repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap: tableMap.value,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const recovered = this.repository.recoverInterruptedMaintenance(this.options.now());\n if (!recovered.ok) {\n throw new Error(recovered.error);\n }\n const registered = this.repository.registerDefinitions(definitions);\n if (!registered.ok) {\n throw new Error(registered.error);\n }\n this.definitions = Object.freeze([...definitions]);\n this.startHeartbeat();\n this.accepting = true;\n this.state = 'ready';\n return { ok: true, value: undefined };\n } catch (cause) {\n this.closeOwnedResources();\n return this.failStart(this.errorMessage(cause));\n }\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n if (!this.accepting || this.state !== 'ready' || this.repository === null) {\n return this.closedAcknowledgement(request.batch.idempotencyKey);\n }\n this.activeWrites += 1;\n try {\n const persisted = this.repository.persist(request);\n if (persisted.kind === 'acknowledged') {\n return persisted.acknowledgement;\n }\n this.detail = persisted.reason;\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: persisted.reason,\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 1,\n reason: persisted.reason,\n }],\n };\n } finally {\n this.activeWrites -= 1;\n }\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateTimelineQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => {\n const repository = this.requireRepository();\n const rawCutoffMs = this.options.now() - this.options.configuration.retention.rawMs;\n return repository.timeline(query, rawCutoffMs);\n });\n return this.enforceResponseBytes(result);\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateMetricQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => this.requireRepository().metrics(query));\n if (result.ok) {\n const bucketCount = result.value.segments.reduce((count, segment) => count + segment.buckets.length, 0);\n if (bucketCount > this.options.configuration.query.maxBuckets) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric result exceeds the configured bucket maximum' },\n };\n }\n }\n return this.enforceResponseBytes(result);\n }\n\n async materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(\n nowMs: number,\n shouldContinue: () => boolean = () => true,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n let drain: ReturnType<TelemetryRepository['beginRetentionDrain']>;\n try {\n drain = this.requireRepository().beginRetentionDrain(nowMs);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n let affectedRows = 0;\n let deletionRounds = 0;\n let interrupted = false;\n for (;;) {\n if (!shouldContinue()) {\n interrupted = true;\n break;\n }\n const batch = drain.nextBatch();\n if (!batch.ok) {\n return batch;\n }\n affectedRows += batch.value.deletedRows;\n deletionRounds += 1;\n if (!batch.value.hasMore) {\n break;\n }\n await this.options.delay(0);\n }\n return {\n ok: true,\n value: {\n stage: 'retention',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: interrupted ? 'interrupted' : null,\n deletionRounds,\n completed: !interrupted,\n interrupted,\n },\n };\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n if (this.activeReaders > 0 || this.activeWrites > 0) {\n this.accepting = true;\n return { ok: false, error: 'Timed out waiting for telemetry readers/writers to quiesce' };\n }\n try {\n const tableMap = this.requireTableMap();\n this.closeDatabaseConnectionForCompaction();\n this.compactClosedDatabase(tableMap);\n await this.reopenDatabaseAfterCompaction(tableMap);\n this.accepting = true;\n return {\n ok: true,\n value: {\n stage: 'compaction',\n affectedRows: 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n const compactionError = this.errorMessage(cause);\n try {\n await this.reopenDatabaseAfterCompaction(this.requireTableMap());\n this.accepting = true;\n } catch (reopenCause) {\n this.state = 'failed';\n this.detail = this.errorMessage(reopenCause);\n }\n return { ok: false, error: compactionError };\n }\n }\n\n async recordMaintenance(\n record: MaintenanceRunRecord,\n ): Promise<TelemetryResult<void, string>> {\n try {\n return this.requireRepository().recordMaintenance(record);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n status(): StorageTargetStatus {\n const committedDropCounters = this.repository?.committedDropCounters();\n return Object.freeze({\n targetId: this.targetId,\n state: this.state,\n detail: this.detail,\n writerLeaseHeld: this.lease?.isHeld() ?? false,\n committedDropCounters:\n committedDropCounters?.ok === true ? committedDropCounters.value : Object.freeze([]),\n });\n }\n\n maintenanceConfiguration(): SQLiteTelemetryTransportOptions['configuration']['maintenance'] {\n return this.options.configuration.maintenance;\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n this.closeOwnedResources();\n this.state = 'stopped';\n this.detail = null;\n }\n\n private configureConnection(connection: BetterSqlite3.Database): void {\n const userTableCount = this.readCount(connection.prepare(\n `SELECT COUNT(*) AS count FROM sqlite_master\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'`,\n ).get());\n if (userTableCount === 0) {\n connection.pragma('auto_vacuum = INCREMENTAL');\n connection.exec('VACUUM');\n }\n const autoVacuum = Number(connection.pragma('auto_vacuum', { simple: true }));\n if (autoVacuum !== 2) {\n throw new Error('Telemetry SQLite target must use auto_vacuum=INCREMENTAL');\n }\n connection.pragma('journal_mode = WAL');\n connection.pragma('synchronous = NORMAL');\n connection.pragma('foreign_keys = ON');\n connection.pragma('busy_timeout = 5000');\n }\n\n private closeDatabaseConnectionForCompaction(): void {\n const connection = this.requireConnection();\n connection.pragma('wal_checkpoint(TRUNCATE)');\n this.repository = null;\n this.connection = null;\n connection.close();\n }\n\n private compactClosedDatabase(tableMap: TelemetryTableMap): void {\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n connection.exec('VACUUM');\n this.verifySchema(connection, tableMap);\n } finally {\n connection.close();\n }\n }\n\n private async reopenDatabaseAfterCompaction(tableMap: TelemetryTableMap): Promise<void> {\n if (this.connection !== null && this.repository !== null) {\n return;\n }\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n this.initializeAndVerifyManifest(connection, tableMap);\n this.verifySchema(connection, tableMap);\n const stackDatabase = await createSqliteDb(connection);\n const repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const loaded = repository.loadDefinitionsReadOnly(this.definitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n this.connection = connection;\n this.repository = repository;\n } catch (cause) {\n connection.close();\n throw cause;\n }\n }\n\n private initializeAndVerifyManifest(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): boolean {\n connection.exec(\n `CREATE TABLE IF NOT EXISTS \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id TEXT PRIMARY KEY,\n format_version INTEGER NOT NULL,\n mapping_json TEXT NOT NULL,\n mapping_checksum TEXT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('ready', 'renaming')),\n pending_mapping_json TEXT,\n updated_at_ms INTEGER NOT NULL\n )`,\n );\n const rows = connection.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 ).all();\n if (rows.length === 0) {\n connection.prepare(\n `INSERT INTO \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n ) VALUES (?, ?, ?, ?, 'ready', NULL, ?)`,\n ).run(\n this.targetId,\n 2,\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.options.now(),\n );\n return false;\n }\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.target_id !== this.targetId) {\n throw new Error(`Telemetry database belongs to target ${parsed.data.target_id}, not ${this.targetId}`);\n }\n if (parsed.data.state !== 'ready') {\n throw new Error('Telemetry schema rename recovery is required before startup');\n }\n if (parsed.data.mapping_checksum === tableMap.checksum) {\n return false;\n }\n if (this.isLegacyManifestMapping(parsed.data, tableMap)) {\n return true;\n }\n throw new Error('Telemetry table mapping differs from the schema manifest; run offline schema rename');\n }\n\n private isLegacyManifestMapping(\n manifest: Readonly<{\n format_version: number;\n mapping_json: string;\n mapping_checksum: string;\n }>,\n tableMap: TelemetryTableMap,\n ): boolean {\n if (manifest.format_version !== 1) {\n return false;\n }\n const parsed: unknown = JSON.parse(manifest.mapping_json);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return false;\n }\n if (telemetryChecksum(parsed) !== manifest.mapping_checksum) {\n return false;\n }\n const expected = tableMap.manifestMapping();\n const legacyEntries = Object.entries(expected).filter(\n ([logicalName]) => logicalName !== 'committedDropCounters',\n );\n const actualEntries = Object.entries(parsed as Record<string, unknown>);\n return (\n actualEntries.length === legacyEntries.length &&\n legacyEntries.every(([logicalName, physicalName]) => {\n return Reflect.get(parsed, logicalName) === physicalName;\n })\n );\n }\n\n private upgradeManifestMapping(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): void {\n connection\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.options.now(),\n this.targetId,\n );\n }\n\n private async runMigrations(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): Promise<void> {\n const sqlRunner = new TelemetryProperSqlRunner(connection, tableMap);\n const migrationRunner = await new MigrationRunnerFactory().create({\n migration_folder: this.options.migrationsDirectory,\n migration_table: tableMap.quoted('migrationHistory'),\n database: 'sqlite',\n sqlite: { database: this.options.configuration.path },\n }, sqlRunner);\n const pending = await migrationRunner.getPendingMigrations();\n await migrationRunner.migrate(pending, true);\n }\n\n private verifySchema(connection: BetterSqlite3.Database, tableMap: TelemetryTableMap): void {\n const rows = connection.prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table'`,\n ).all();\n const names = new Set(rows.map((row) => this.readName(row)));\n if (!names.has(SQLITE_SCHEMA_MANIFEST_TABLE)) {\n throw new Error('Telemetry schema manifest is missing');\n }\n const missing = SQLITE_LOGICAL_TABLE_NAMES\n .map((logicalName) => tableMap.physical(logicalName))\n .filter((physicalName) => !names.has(physicalName));\n if (missing.length > 0) {\n throw new Error(`Telemetry schema is missing table(s): ${missing.join(', ')}`);\n }\n }\n\n private startHeartbeat(): void {\n const intervalMs = Math.max(1_000, Math.floor(this.options.configuration.leaseExpiryMs / 3));\n this.heartbeatHandle = this.options.createInterval(() => {\n const heartbeat = this.lease?.heartbeat();\n if (heartbeat && !heartbeat.ok) {\n this.accepting = false;\n this.state = 'failed';\n this.detail = heartbeat.error;\n }\n }, intervalMs);\n }\n\n private withReaderLease<T>(work: () => TelemetryResult<T, TelemetryQueryError>): TelemetryResult<T, TelemetryQueryError> {\n if (!this.accepting || this.state !== 'ready') {\n return { ok: false, error: { kind: 'storage-failure', message: 'Telemetry target is not accepting readers' } };\n }\n this.activeReaders += 1;\n const leaseId = randomUUID();\n const table = this.requireTableMap().quoted('readerLeases');\n const connection = this.requireConnection();\n try {\n const acquiredAtMs = this.options.now();\n connection.prepare(\n `INSERT INTO ${table} (\n target_id, lease_id, owner_id, acquired_at_ms, expires_at_ms, state\n ) VALUES (?, ?, ?, ?, ?, 'active')`,\n ).run(\n this.targetId,\n leaseId,\n this.options.processToken,\n acquiredAtMs,\n acquiredAtMs + this.options.configuration.leaseExpiryMs,\n );\n return work();\n } finally {\n connection.prepare(\n `UPDATE ${table} SET state = 'released' WHERE target_id = ? AND lease_id = ?`,\n ).run(this.targetId, leaseId);\n this.activeReaders -= 1;\n }\n }\n\n private requireRepositoryResult(\n work: (repository: TelemetryRepository) => TelemetryResult<MaintenanceStageResult, string>,\n ): TelemetryResult<MaintenanceStageResult, string> {\n try {\n return work(this.requireRepository());\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private validateTimelineQuery(query: TimelineQuery): string | null {\n const commonError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n return commonError;\n }\n\n private validateMetricQuery(query: MetricQuery): string | null {\n const rangeError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n if (rangeError !== null) {\n return rangeError;\n }\n if (query.limit > this.options.configuration.query.maxBuckets) {\n return 'Metric query limit exceeds the configured bucket maximum';\n }\n return null;\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.targetId) {\n return `Query target ${targetId} does not match ${this.targetId}`;\n }\n if (!Number.isSafeInteger(fromMs) || !Number.isSafeInteger(toMs) || fromMs >= toMs) {\n return 'Query time range must use safe integer milliseconds and be non-empty';\n }\n if (toMs - fromMs > this.options.configuration.query.maxRangeMs) {\n return 'Query time range exceeds the configured maximum';\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > this.options.configuration.query.maxRows) {\n return 'Query row limit is outside the configured bounds';\n }\n return null;\n }\n\n private validateConfiguration(): void {\n const configuration = this.options.configuration;\n if (!configuration.targetId.trim() || !configuration.path.trim()) {\n throw new Error('SQLite telemetry target id and path are required');\n }\n if (!Number.isInteger(configuration.leaseExpiryMs) || configuration.leaseExpiryMs < 1_000) {\n throw new Error('SQLite telemetry ownership lease expiry must be at least one second');\n }\n const queryLimits = Object.values(configuration.query);\n if (queryLimits.some((limit) => !Number.isSafeInteger(limit) || limit <= 0)) {\n throw new Error('SQLite telemetry query limits must be positive safe integers');\n }\n const retention = configuration.retention;\n const invalidRetention = retention.rawMs <= 0\n || retention.lateArrivalMs < 0\n || retention.samplesMs < retention.rawMs + retention.lateArrivalMs;\n if (invalidRetention) {\n throw new Error('SQLite telemetry retention values are invalid');\n }\n this.validateRollupTiers();\n }\n\n private validateRollupTiers(): void {\n const retention = this.options.configuration.retention;\n const tiers = retention.rollups;\n if (tiers.length === 0) {\n throw new Error('SQLite telemetry requires at least one rollup retention tier');\n }\n for (let index = 0; index < tiers.length; index += 1) {\n const tier = tiers[index];\n const previous = tiers[index - 1];\n if (!tier || tier.resolutionMs <= 0 || tier.retainMs < retention.rawMs) {\n throw new Error('SQLite telemetry rollup tiers are invalid');\n }\n if (previous && (tier.resolutionMs <= previous.resolutionMs || tier.retainMs < previous.retainMs)) {\n throw new Error('SQLite telemetry rollup tiers must increase by resolution and retention');\n }\n }\n }\n\n private enforceResponseBytes<T>(\n result: TelemetryResult<T, TelemetryQueryError>,\n ): TelemetryResult<T, TelemetryQueryError> {\n if (!result.ok) {\n return result;\n }\n // This output guard runs after repository materialization. Range/row/bucket limits\n // bound normal reads, but a future streaming query path should enforce bytes while decoding.\n try {\n const bytes = telemetryUtf8Length(canonicalJson(result.value));\n if (bytes > this.options.configuration.query.maxResponseBytes) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Query result exceeds the configured response byte maximum' },\n };\n }\n return result;\n } catch (cause) {\n return {\n ok: false,\n error: { kind: 'storage-failure', message: `Unable to size telemetry query result: ${this.errorMessage(cause)}` },\n };\n }\n }\n\n private failStart(error: string): TelemetryResult<void, string> {\n this.state = 'failed';\n this.detail = error;\n return { ok: false, error };\n }\n\n private closedAcknowledgement(idempotencyKey: string): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey,\n reason: 'SQLite telemetry target is not ready',\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 0,\n reason: 'target-not-ready',\n }],\n };\n }\n\n private closeOwnedResources(): void {\n if (this.heartbeatHandle !== null) {\n this.options.clearInterval(this.heartbeatHandle);\n this.heartbeatHandle = null;\n }\n if (this.connection?.open) {\n try {\n this.connection.close();\n } catch {\n // Release the ownership lease even if SQLite close reports a failure.\n }\n }\n this.connection = null;\n this.repository = null;\n this.lease?.release();\n this.lease = null;\n }\n\n private requireRepository(): TelemetryRepository {\n if (this.repository === null) {\n throw new Error('SQLite telemetry repository is not initialized');\n }\n return this.repository;\n }\n\n private requireConnection(): BetterSqlite3.Database {\n if (this.connection === null) {\n throw new Error('SQLite telemetry connection is not initialized');\n }\n return this.connection;\n }\n\n private requireTableMap(): TelemetryTableMap {\n if (this.tableMap === null) {\n throw new Error('SQLite telemetry table map is not initialized');\n }\n return this.tableMap;\n }\n\n private readCount(row: unknown): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite count query returned no row');\n }\n const count = Reflect.get(row, 'count');\n if (typeof count !== 'number') {\n throw new Error('SQLite count query returned an invalid count');\n }\n return count;\n }\n\n private readName(row: unknown): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite schema query returned an invalid row');\n }\n const name = Reflect.get(row, 'name');\n if (typeof name !== 'string') {\n throw new Error('SQLite schema query returned an invalid table name');\n }\n return name;\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\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 {\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 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","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 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","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"],"mappings":"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","names":["import_node_crypto","import_node_path","deleted","import_zod","resolve","BetterSqlite3"]}
1
+ {"version":3,"sources":["../../src/transports/index.ts","../../src/transports/sqlite_transport.ts","../../src/core/helper/canonical_json.ts","../../src/storage/helper/sqlite_table_names.ts","../../src/storage/sqlite_ownership_lease.ts","../../src/storage/telemetry_proper_sql_runner.ts","../../src/storage/telemetry_repository.ts","../../src/core/metric_definition_contract.ts","../../src/storage/schema/telemetry_repository_rows.ts","../../src/storage/telemetry_repository_row_parser.ts","../../src/storage/telemetry_table_map.ts","../../src/transports/schema/telemetry_schema_manifest.ts"],"sourcesContent":["export { SQLiteTelemetryTransport } from './sqlite_transport.js';\nexport type { SQLiteTelemetryTransportOptions } from './types/sqlite_transport.types.js';\nexport type {\n SqliteMaintenanceConfiguration,\n SqliteRetentionConfiguration,\n SqliteSchemaConfiguration,\n SqliteTableOverrides,\n SqliteTargetConfiguration,\n} from '../core/types/configuration.types.js';\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 {\n canonicalJson,\n telemetryChecksum,\n telemetryUtf8Length,\n} from '../core/helper/canonical_json.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 type {\n MaintenanceRunRecord,\n MaintenanceStageResult,\n StoragePersistRequest,\n StorageTargetStatus,\n TelemetryStorageCapabilities,\n TelemetryStorageTransport,\n} from '../core/types/storage.types.js';\nimport type { TelemetryAcknowledgement } from '../core/types/transport.types.js';\nimport { SQLITE_LOGICAL_TABLE_NAMES, SQLITE_SCHEMA_MANIFEST_TABLE } 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 './schema/telemetry_schema_manifest.js';\nimport type { SQLiteTelemetryTransportOptions } from './types/sqlite_transport.types.js';\n\nconst DEFAULT_MIGRATIONS_DIRECTORY = typeof __dirname === 'string'\n ? resolve(__dirname, '../../migrations')\n : fileURLToPath(new URL('../../migrations/', import.meta.url));\n\nexport class SQLiteTelemetryTransport<IntervalHandle = unknown> implements TelemetryStorageTransport {\n readonly targetId: string;\n readonly capabilities: TelemetryStorageCapabilities = Object.freeze({\n rawPersistence: true,\n metricSamples: true,\n rollups: true,\n queries: true,\n retention: true,\n maintenance: true,\n });\n private state: StorageTargetStatus['state'] = 'created';\n private detail: string | null = null;\n private tableMap: TelemetryTableMap | null = null;\n private connection: BetterSqlite3.Database | null = null;\n private repository: TelemetryRepository | null = null;\n private definitions: readonly MetricDefinition[] = Object.freeze([]);\n private lease: SqliteOwnershipLease | null = null;\n private heartbeatHandle: IntervalHandle | null = null;\n private activeReaders = 0;\n private activeWrites = 0;\n private accepting = false;\n\n constructor(private readonly options: SQLiteTelemetryTransportOptions<IntervalHandle>) {\n this.targetId = options.configuration.targetId;\n this.validateConfiguration();\n }\n\n static defaults(\n configuration: SQLiteTelemetryTransportOptions['configuration'],\n ): SQLiteTelemetryTransportOptions<ReturnType<typeof setInterval>> {\n return {\n configuration,\n migrationsDirectory: DEFAULT_MIGRATIONS_DIRECTORY,\n processToken: randomUUID(),\n now: () => Date.now(),\n createInterval: (work, intervalMs) => setInterval(work, intervalMs),\n clearInterval: (handle) => clearInterval(handle),\n delay: (durationMs) => new Promise((resolve) => setTimeout(resolve, durationMs)),\n };\n }\n\n async start(definitions: readonly MetricDefinition[]): Promise<TelemetryResult<void, string>> {\n if (this.state !== 'created' && this.state !== 'stopped') {\n return { ok: false, error: `Cannot start SQLite telemetry target from state ${this.state}` };\n }\n this.state = 'starting';\n this.detail = null;\n const tableMap = TelemetryTableMap.create(this.options.configuration.schema);\n if (!tableMap.ok) {\n return this.failStart(tableMap.error);\n }\n this.tableMap = tableMap.value;\n this.lease = new SqliteOwnershipLease({\n targetId: this.targetId,\n databasePath: this.options.configuration.path,\n mode: 'writer',\n expiryMs: this.options.configuration.leaseExpiryMs,\n processToken: this.options.processToken,\n now: this.options.now,\n });\n const acquired = this.lease.acquire();\n if (!acquired.ok) {\n return this.failStart(acquired.error);\n }\n\n try {\n const connection = new BetterSqlite3(this.options.configuration.path);\n this.connection = connection;\n this.configureConnection(connection);\n const manifestNeedsUpgrade = this.initializeAndVerifyManifest(connection, tableMap.value);\n await this.runMigrations(connection, tableMap.value);\n this.verifySchema(connection, tableMap.value);\n if (manifestNeedsUpgrade) {\n this.upgradeManifestMapping(connection, tableMap.value);\n }\n const stackDatabase = await createSqliteDb(connection);\n this.repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap: tableMap.value,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const recovered = this.repository.recoverInterruptedMaintenance(this.options.now());\n if (!recovered.ok) {\n throw new Error(recovered.error);\n }\n const registered = this.repository.registerDefinitions(definitions);\n if (!registered.ok) {\n throw new Error(registered.error);\n }\n this.definitions = Object.freeze([...definitions]);\n this.startHeartbeat();\n this.accepting = true;\n this.state = 'ready';\n return { ok: true, value: undefined };\n } catch (cause) {\n this.closeOwnedResources();\n return this.failStart(this.errorMessage(cause));\n }\n }\n\n async persist(request: StoragePersistRequest): Promise<TelemetryAcknowledgement> {\n if (!this.accepting || this.state !== 'ready' || this.repository === null) {\n return this.closedAcknowledgement(request.batch.idempotencyKey);\n }\n this.activeWrites += 1;\n try {\n const persisted = this.repository.persist(request);\n if (persisted.kind === 'acknowledged') {\n return persisted.acknowledgement;\n }\n this.detail = persisted.reason;\n return {\n kind: 'retryable',\n idempotencyKey: request.batch.idempotencyKey,\n reason: persisted.reason,\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 1,\n reason: persisted.reason,\n }],\n };\n } finally {\n this.activeWrites -= 1;\n }\n }\n\n async timeline(query: TimelineQuery): Promise<TelemetryResult<TimelineQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateTimelineQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => {\n const repository = this.requireRepository();\n const rawCutoffMs = this.options.now() - this.options.configuration.retention.rawMs;\n return repository.timeline(query, rawCutoffMs);\n });\n return this.enforceResponseBytes(result);\n }\n\n async metrics(query: MetricQuery): Promise<TelemetryResult<MetricQueryResponse, TelemetryQueryError>> {\n const queryError = this.validateMetricQuery(query);\n if (queryError !== null) {\n return { ok: false, error: { kind: 'invalid-query', message: queryError } };\n }\n const result = this.withReaderLease(() => this.requireRepository().metrics(query));\n if (result.ok) {\n const bucketCount = result.value.segments.reduce((count, segment) => count + segment.buckets.length, 0);\n if (bucketCount > this.options.configuration.query.maxBuckets) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Metric result exceeds the configured bucket maximum' },\n };\n }\n }\n return this.enforceResponseBytes(result);\n }\n\n async materializeRollups(\n nowMs: number,\n maxWorkMs: number,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.materializeRollups(nowMs, maxWorkMs));\n }\n\n async enforceRetention(\n nowMs: number,\n shouldContinue: () => boolean = () => true,\n ): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n let drain: ReturnType<TelemetryRepository['beginRetentionDrain']>;\n try {\n drain = this.requireRepository().beginRetentionDrain(nowMs);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n let affectedRows = 0;\n let deletionRounds = 0;\n let interrupted = false;\n for (;;) {\n if (!shouldContinue()) {\n interrupted = true;\n break;\n }\n const batch = drain.nextBatch();\n if (!batch.ok) {\n return batch;\n }\n affectedRows += batch.value.deletedRows;\n deletionRounds += 1;\n if (!batch.value.hasMore) {\n break;\n }\n await this.options.delay(0);\n }\n return {\n ok: true,\n value: {\n stage: 'retention',\n affectedRows,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: interrupted ? 'interrupted' : null,\n deletionRounds,\n completed: !interrupted,\n interrupted,\n },\n };\n }\n\n async checkpoint(): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.checkpoint());\n }\n\n async reclaim(maxPages: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n return this.requireRepositoryResult((repository) => repository.reclaim(maxPages));\n }\n\n async compact(deadlineMs: number): Promise<TelemetryResult<MaintenanceStageResult, string>> {\n const startedAt = this.options.now();\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n if (this.activeReaders > 0 || this.activeWrites > 0) {\n this.accepting = true;\n return { ok: false, error: 'Timed out waiting for telemetry readers/writers to quiesce' };\n }\n try {\n const tableMap = this.requireTableMap();\n this.closeDatabaseConnectionForCompaction();\n this.compactClosedDatabase(tableMap);\n await this.reopenDatabaseAfterCompaction(tableMap);\n this.accepting = true;\n return {\n ok: true,\n value: {\n stage: 'compaction',\n affectedRows: 0,\n affectedPages: 0,\n elapsedMs: this.options.now() - startedAt,\n detail: null,\n },\n };\n } catch (cause) {\n const compactionError = this.errorMessage(cause);\n try {\n await this.reopenDatabaseAfterCompaction(this.requireTableMap());\n this.accepting = true;\n } catch (reopenCause) {\n this.state = 'failed';\n this.detail = this.errorMessage(reopenCause);\n }\n return { ok: false, error: compactionError };\n }\n }\n\n async recordMaintenance(\n record: MaintenanceRunRecord,\n ): Promise<TelemetryResult<void, string>> {\n try {\n return this.requireRepository().recordMaintenance(record);\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n status(): StorageTargetStatus {\n const committedDropCounters = this.repository?.committedDropCounters();\n return Object.freeze({\n targetId: this.targetId,\n state: this.state,\n detail: this.detail,\n writerLeaseHeld: this.lease?.isHeld() ?? false,\n committedDropCounters:\n committedDropCounters?.ok === true ? committedDropCounters.value : Object.freeze([]),\n });\n }\n\n maintenanceConfiguration(): SQLiteTelemetryTransportOptions['configuration']['maintenance'] {\n return this.options.configuration.maintenance;\n }\n\n async stop(deadlineMs: number): Promise<void> {\n this.accepting = false;\n while ((this.activeReaders > 0 || this.activeWrites > 0) && this.options.now() < deadlineMs) {\n await this.options.delay(1);\n }\n this.closeOwnedResources();\n this.state = 'stopped';\n this.detail = null;\n }\n\n private configureConnection(connection: BetterSqlite3.Database): void {\n const userTableCount = this.readCount(connection.prepare(\n `SELECT COUNT(*) AS count FROM sqlite_master\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'`,\n ).get());\n if (userTableCount === 0) {\n connection.pragma('auto_vacuum = INCREMENTAL');\n connection.exec('VACUUM');\n }\n const autoVacuum = Number(connection.pragma('auto_vacuum', { simple: true }));\n if (autoVacuum !== 2) {\n throw new Error('Telemetry SQLite target must use auto_vacuum=INCREMENTAL');\n }\n connection.pragma('journal_mode = WAL');\n connection.pragma('synchronous = NORMAL');\n connection.pragma('foreign_keys = ON');\n connection.pragma('busy_timeout = 5000');\n }\n\n private closeDatabaseConnectionForCompaction(): void {\n const connection = this.requireConnection();\n connection.pragma('wal_checkpoint(TRUNCATE)');\n this.repository = null;\n this.connection = null;\n connection.close();\n }\n\n private compactClosedDatabase(tableMap: TelemetryTableMap): void {\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n connection.exec('VACUUM');\n this.verifySchema(connection, tableMap);\n } finally {\n connection.close();\n }\n }\n\n private async reopenDatabaseAfterCompaction(tableMap: TelemetryTableMap): Promise<void> {\n if (this.connection !== null && this.repository !== null) {\n return;\n }\n const connection = new BetterSqlite3(this.options.configuration.path);\n try {\n this.configureConnection(connection);\n this.initializeAndVerifyManifest(connection, tableMap);\n this.verifySchema(connection, tableMap);\n const stackDatabase = await createSqliteDb(connection);\n const repository = new TelemetryRepository({\n targetId: this.targetId,\n connection,\n stackDatabase,\n tableMap,\n retention: this.options.configuration.retention,\n now: this.options.now,\n });\n const loaded = repository.loadDefinitionsReadOnly(this.definitions);\n if (!loaded.ok) {\n throw new Error(loaded.error);\n }\n this.connection = connection;\n this.repository = repository;\n } catch (cause) {\n connection.close();\n throw cause;\n }\n }\n\n private initializeAndVerifyManifest(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): boolean {\n connection.exec(\n `CREATE TABLE IF NOT EXISTS \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id TEXT PRIMARY KEY,\n format_version INTEGER NOT NULL,\n mapping_json TEXT NOT NULL,\n mapping_checksum TEXT NOT NULL,\n state TEXT NOT NULL CHECK (state IN ('ready', 'renaming')),\n pending_mapping_json TEXT,\n updated_at_ms INTEGER NOT NULL\n )`,\n );\n const rows = connection.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 ).all();\n if (rows.length === 0) {\n connection.prepare(\n `INSERT INTO \"${SQLITE_SCHEMA_MANIFEST_TABLE}\" (\n target_id, format_version, mapping_json, mapping_checksum,\n state, pending_mapping_json, updated_at_ms\n ) VALUES (?, ?, ?, ?, 'ready', NULL, ?)`,\n ).run(\n this.targetId,\n 2,\n JSON.stringify(tableMap.manifestMapping()),\n tableMap.checksum,\n this.options.now(),\n );\n return false;\n }\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.target_id !== this.targetId) {\n throw new Error(`Telemetry database belongs to target ${parsed.data.target_id}, not ${this.targetId}`);\n }\n if (parsed.data.state !== 'ready') {\n throw new Error('Telemetry schema rename recovery is required before startup');\n }\n if (parsed.data.mapping_checksum === tableMap.checksum) {\n return false;\n }\n if (this.isLegacyManifestMapping(parsed.data, tableMap)) {\n return true;\n }\n throw new Error('Telemetry table mapping differs from the schema manifest; run offline schema rename');\n }\n\n private isLegacyManifestMapping(\n manifest: Readonly<{\n format_version: number;\n mapping_json: string;\n mapping_checksum: string;\n }>,\n tableMap: TelemetryTableMap,\n ): boolean {\n if (manifest.format_version !== 1) {\n return false;\n }\n const parsed: unknown = JSON.parse(manifest.mapping_json);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n return false;\n }\n if (telemetryChecksum(parsed) !== manifest.mapping_checksum) {\n return false;\n }\n const expected = tableMap.manifestMapping();\n const legacyEntries = Object.entries(expected).filter(\n ([logicalName]) => logicalName !== 'committedDropCounters',\n );\n const actualEntries = Object.entries(parsed as Record<string, unknown>);\n return (\n actualEntries.length === legacyEntries.length &&\n legacyEntries.every(([logicalName, physicalName]) => {\n return Reflect.get(parsed, logicalName) === physicalName;\n })\n );\n }\n\n private upgradeManifestMapping(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): void {\n connection\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.options.now(),\n this.targetId,\n );\n }\n\n private async runMigrations(\n connection: BetterSqlite3.Database,\n tableMap: TelemetryTableMap,\n ): Promise<void> {\n const sqlRunner = new TelemetryProperSqlRunner(connection, tableMap);\n const migrationRunner = await new MigrationRunnerFactory().create({\n migration_folder: this.options.migrationsDirectory,\n migration_table: tableMap.quoted('migrationHistory'),\n database: 'sqlite',\n sqlite: { database: this.options.configuration.path },\n }, sqlRunner);\n const pending = await migrationRunner.getPendingMigrations();\n await migrationRunner.migrate(pending, true);\n }\n\n private verifySchema(connection: BetterSqlite3.Database, tableMap: TelemetryTableMap): void {\n const rows = connection.prepare(\n `SELECT name FROM sqlite_master WHERE type = 'table'`,\n ).all();\n const names = new Set(rows.map((row) => this.readName(row)));\n if (!names.has(SQLITE_SCHEMA_MANIFEST_TABLE)) {\n throw new Error('Telemetry schema manifest is missing');\n }\n const missing = SQLITE_LOGICAL_TABLE_NAMES\n .map((logicalName) => tableMap.physical(logicalName))\n .filter((physicalName) => !names.has(physicalName));\n if (missing.length > 0) {\n throw new Error(`Telemetry schema is missing table(s): ${missing.join(', ')}`);\n }\n }\n\n private startHeartbeat(): void {\n const intervalMs = Math.max(1_000, Math.floor(this.options.configuration.leaseExpiryMs / 3));\n this.heartbeatHandle = this.options.createInterval(() => {\n const heartbeat = this.lease?.heartbeat();\n if (heartbeat && !heartbeat.ok) {\n this.accepting = false;\n this.state = 'failed';\n this.detail = heartbeat.error;\n }\n }, intervalMs);\n }\n\n private withReaderLease<T>(work: () => TelemetryResult<T, TelemetryQueryError>): TelemetryResult<T, TelemetryQueryError> {\n if (!this.accepting || this.state !== 'ready') {\n return { ok: false, error: { kind: 'storage-failure', message: 'Telemetry target is not accepting readers' } };\n }\n this.activeReaders += 1;\n const leaseId = randomUUID();\n const table = this.requireTableMap().quoted('readerLeases');\n const connection = this.requireConnection();\n try {\n const acquiredAtMs = this.options.now();\n connection.prepare(\n `INSERT INTO ${table} (\n target_id, lease_id, owner_id, acquired_at_ms, expires_at_ms, state\n ) VALUES (?, ?, ?, ?, ?, 'active')`,\n ).run(\n this.targetId,\n leaseId,\n this.options.processToken,\n acquiredAtMs,\n acquiredAtMs + this.options.configuration.leaseExpiryMs,\n );\n return work();\n } finally {\n connection.prepare(\n `UPDATE ${table} SET state = 'released' WHERE target_id = ? AND lease_id = ?`,\n ).run(this.targetId, leaseId);\n this.activeReaders -= 1;\n }\n }\n\n private requireRepositoryResult(\n work: (repository: TelemetryRepository) => TelemetryResult<MaintenanceStageResult, string>,\n ): TelemetryResult<MaintenanceStageResult, string> {\n try {\n return work(this.requireRepository());\n } catch (cause) {\n return { ok: false, error: this.errorMessage(cause) };\n }\n }\n\n private validateTimelineQuery(query: TimelineQuery): string | null {\n const commonError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n return commonError;\n }\n\n private validateMetricQuery(query: MetricQuery): string | null {\n const rangeError = this.validateQueryRange(query.targetId, query.fromMs, query.toMs, query.limit);\n if (rangeError !== null) {\n return rangeError;\n }\n if (query.limit > this.options.configuration.query.maxBuckets) {\n return 'Metric query limit exceeds the configured bucket maximum';\n }\n return null;\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.targetId) {\n return `Query target ${targetId} does not match ${this.targetId}`;\n }\n if (!Number.isSafeInteger(fromMs) || !Number.isSafeInteger(toMs) || fromMs >= toMs) {\n return 'Query time range must use safe integer milliseconds and be non-empty';\n }\n if (toMs - fromMs > this.options.configuration.query.maxRangeMs) {\n return 'Query time range exceeds the configured maximum';\n }\n if (!Number.isInteger(limit) || limit <= 0 || limit > this.options.configuration.query.maxRows) {\n return 'Query row limit is outside the configured bounds';\n }\n return null;\n }\n\n private validateConfiguration(): void {\n const configuration = this.options.configuration;\n if (!configuration.targetId.trim() || !configuration.path.trim()) {\n throw new Error('SQLite telemetry target id and path are required');\n }\n if (!Number.isInteger(configuration.leaseExpiryMs) || configuration.leaseExpiryMs < 1_000) {\n throw new Error('SQLite telemetry ownership lease expiry must be at least one second');\n }\n const queryLimits = Object.values(configuration.query);\n if (queryLimits.some((limit) => !Number.isSafeInteger(limit) || limit <= 0)) {\n throw new Error('SQLite telemetry query limits must be positive safe integers');\n }\n const retention = configuration.retention;\n const invalidRetention = retention.rawMs <= 0\n || retention.lateArrivalMs < 0\n || retention.samplesMs < retention.rawMs + retention.lateArrivalMs;\n if (invalidRetention) {\n throw new Error('SQLite telemetry retention values are invalid');\n }\n this.validateRollupTiers();\n }\n\n private validateRollupTiers(): void {\n const retention = this.options.configuration.retention;\n const tiers = retention.rollups;\n if (tiers.length === 0) {\n throw new Error('SQLite telemetry requires at least one rollup retention tier');\n }\n for (let index = 0; index < tiers.length; index += 1) {\n const tier = tiers[index];\n const previous = tiers[index - 1];\n if (!tier || tier.resolutionMs <= 0 || tier.retainMs < retention.rawMs) {\n throw new Error('SQLite telemetry rollup tiers are invalid');\n }\n if (previous && (tier.resolutionMs <= previous.resolutionMs || tier.retainMs < previous.retainMs)) {\n throw new Error('SQLite telemetry rollup tiers must increase by resolution and retention');\n }\n }\n }\n\n private enforceResponseBytes<T>(\n result: TelemetryResult<T, TelemetryQueryError>,\n ): TelemetryResult<T, TelemetryQueryError> {\n if (!result.ok) {\n return result;\n }\n // This output guard runs after repository materialization. Range/row/bucket limits\n // bound normal reads, but a future streaming query path should enforce bytes while decoding.\n try {\n const bytes = telemetryUtf8Length(canonicalJson(result.value));\n if (bytes > this.options.configuration.query.maxResponseBytes) {\n return {\n ok: false,\n error: { kind: 'invalid-query', message: 'Query result exceeds the configured response byte maximum' },\n };\n }\n return result;\n } catch (cause) {\n return {\n ok: false,\n error: { kind: 'storage-failure', message: `Unable to size telemetry query result: ${this.errorMessage(cause)}` },\n };\n }\n }\n\n private failStart(error: string): TelemetryResult<void, string> {\n this.state = 'failed';\n this.detail = error;\n return { ok: false, error };\n }\n\n private closedAcknowledgement(idempotencyKey: string): TelemetryAcknowledgement {\n return {\n kind: 'retryable',\n idempotencyKey,\n reason: 'SQLite telemetry target is not ready',\n retryAfterMs: 100,\n targetStates: [{\n targetId: this.targetId,\n delivery: this.options.configuration.delivery,\n state: 'failed',\n attempts: 0,\n reason: 'target-not-ready',\n }],\n };\n }\n\n private closeOwnedResources(): void {\n if (this.heartbeatHandle !== null) {\n this.options.clearInterval(this.heartbeatHandle);\n this.heartbeatHandle = null;\n }\n if (this.connection?.open) {\n try {\n this.connection.close();\n } catch {\n // Release the ownership lease even if SQLite close reports a failure.\n }\n }\n this.connection = null;\n this.repository = null;\n this.lease?.release();\n this.lease = null;\n }\n\n private requireRepository(): TelemetryRepository {\n if (this.repository === null) {\n throw new Error('SQLite telemetry repository is not initialized');\n }\n return this.repository;\n }\n\n private requireConnection(): BetterSqlite3.Database {\n if (this.connection === null) {\n throw new Error('SQLite telemetry connection is not initialized');\n }\n return this.connection;\n }\n\n private requireTableMap(): TelemetryTableMap {\n if (this.tableMap === null) {\n throw new Error('SQLite telemetry table map is not initialized');\n }\n return this.tableMap;\n }\n\n private readCount(row: unknown): number {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite count query returned no row');\n }\n const count = Reflect.get(row, 'count');\n if (typeof count !== 'number') {\n throw new Error('SQLite count query returned an invalid count');\n }\n return count;\n }\n\n private readName(row: unknown): string {\n if (typeof row !== 'object' || row === null || Array.isArray(row)) {\n throw new Error('SQLite schema query returned an invalid row');\n }\n const name = Reflect.get(row, 'name');\n if (typeof name !== 'string') {\n throw new Error('SQLite schema query returned an invalid table name');\n }\n return name;\n }\n\n private errorMessage(cause: unknown): string {\n return cause instanceof Error ? cause.message : String(cause);\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 {\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 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","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 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","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"],"mappings":"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","names":["import_node_crypto","import_node_path","deleted","import_zod","resolve","BetterSqlite3"]}