@kb-labs/rest-api-app 2.112.0 → 2.114.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +642 -519
- package/dist/index.js.map +1 -1
- package/package.json +21 -20
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/events/hub.ts","../src/routes/readiness.ts","../src/observability/prometheus-registry.ts","../src/middleware/metrics.ts","../src/routes/sse-auth.ts","../src/routes/events.ts","../src/routes/path-helpers.ts","../src/daemon/metrics/system-metrics-collector.ts","../src/daemon/metrics/historical-metrics.ts","../src/observability/service-contract.ts","../src/routes/health.ts","../src/routes/openapi.ts","../src/diagnostics/header-debug.ts","../src/routes/metrics.ts","../src/routes/plugins.ts","../src/routes/workflows.ts","../src/routes/jobs.ts","../src/routes/cache.ts","../src/routes/observability.ts","../src/routes/analytics.ts","../src/routes/adapters.ts","../src/routes/logs.ts","../src/routes/platform.ts","../src/routes/adapter-call.ts","../src/routes/debug.ts","../src/routes/index.ts","../src/plugins.ts","../src/middleware/envelope.ts","../src/middleware/request-id.ts","../src/middleware/mock-mode.ts","../src/middleware/security-headers.ts","../src/middleware/cache.ts","../src/middleware/process-error-guard.ts","../src/middleware/startup-throttle.ts","../src/middleware/request-timeout.ts","../src/middleware/tenant-rate-limit.ts","../src/middleware/index.ts","../src/server.ts","../src/bootstrap.ts","../src/index.ts"],"names":["resolve","memoryUsage","platform","hostname","REST_VERSION","path","performance","join","existsSync","result","message","z","normalizeBasePath","metricsCollector","path2","fs","randomUUID"],"mappings":"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","file":"index.js","sourcesContent":["import { EventEmitter } from 'node:events';\n\nexport type RegistryBroadcast = {\n type: 'registry';\n rev: number;\n generatedAt?: string;\n partial?: boolean;\n stale?: boolean;\n expiresAt?: string | null;\n ttlMs?: number | null;\n checksum?: string;\n checksumAlgorithm?: 'sha256';\n previousChecksum?: string | null;\n};\n\nexport type HealthBroadcast = {\n type: 'health';\n status: 'healthy' | 'degraded';\n ts: string;\n ready: boolean;\n reason?: string;\n registryPartial?: boolean;\n registryStale?: boolean;\n registryLoaded?: boolean;\n pluginMountInProgress?: boolean;\n pluginRoutesMounted?: boolean;\n pluginsMounted?: number;\n pluginsFailed?: number;\n lastPluginMountTs?: string | null;\n pluginRoutesLastDurationMs?: number | null;\n redisEnabled?: boolean;\n redisHealthy?: boolean;\n redisStates?: {\n publisher: string | null;\n subscriber: string | null;\n cache: string | null;\n };\n};\n\nexport type BroadcastEvent = RegistryBroadcast | HealthBroadcast;\n\nexport class EventHub {\n private emitter: EventEmitter;\n\n constructor() {\n this.emitter = new EventEmitter();\n this.emitter.setMaxListeners(0);\n }\n\n publish(event: BroadcastEvent): void {\n this.emitter.emit('broadcast', event);\n }\n\n subscribe(handler: (event: BroadcastEvent) => void): () => void {\n this.emitter.on('broadcast', handler);\n return () => {\n this.emitter.off('broadcast', handler);\n };\n }\n}\n","// Shared readiness state for health and plugin routes\nexport interface ReadinessState {\n cliApiInitialized: boolean;\n registryLoaded: boolean;\n registryPartial: boolean;\n registryStale: boolean;\n pluginRoutesMounted: boolean;\n pluginMountInProgress: boolean;\n pluginRoutesCount: number;\n pluginRouteErrors: number;\n pluginRouteFailures: Array<{ id: string; error: string }>;\n lastPluginMountTs?: string | null;\n pluginRoutesLastDurationMs?: number | null;\n redisEnabled: boolean;\n redisConnected: boolean;\n redisStates: {\n publisher: string | null;\n subscriber: string | null;\n cache: string | null;\n };\n}\n\nexport function createInitialReadinessState(): ReadinessState {\n return {\n cliApiInitialized: false,\n registryLoaded: false,\n registryPartial: false,\n registryStale: false,\n pluginRoutesMounted: false,\n pluginMountInProgress: true,\n pluginRoutesCount: 0,\n pluginRouteErrors: 0,\n pluginRouteFailures: [],\n lastPluginMountTs: null,\n pluginRoutesLastDurationMs: null,\n redisEnabled: false,\n redisConnected: true,\n redisStates: {\n publisher: null,\n subscriber: null,\n cache: null,\n },\n };\n}\n\nexport function isReady(readiness: ReadinessState): boolean {\n return (\n readiness.cliApiInitialized &&\n readiness.registryLoaded &&\n !readiness.registryPartial &&\n !readiness.registryStale &&\n (!readiness.redisEnabled || readiness.redisConnected)\n );\n}\n\nexport function resolveReadinessReason(readiness: ReadinessState):\n | 'ready'\n | 'cli_api_not_initialized'\n | 'registry_not_loaded'\n | 'registry_partial'\n | 'registry_snapshot_stale'\n | 'redis_unavailable'\n | 'plugin_mount_in_progress' {\n if (!readiness.cliApiInitialized) {\n return 'cli_api_not_initialized';\n }\n if (!readiness.registryLoaded) {\n if (readiness.registryStale) {\n return 'registry_snapshot_stale';\n }\n if (readiness.registryPartial) {\n return 'registry_partial';\n }\n return 'registry_not_loaded';\n }\n if (readiness.redisEnabled && !readiness.redisConnected) {\n return 'redis_unavailable';\n }\n if (readiness.pluginMountInProgress) {\n return 'plugin_mount_in_progress';\n }\n return 'ready';\n}\n","/**\n * @module @kb-labs/rest-api-app/observability/prometheus-registry\n * Prometheus metric definitions for the REST API service.\n * These are definitions only — not a Fastify hook.\n */\n\nimport { Registry, Histogram, Counter, Gauge } from 'prom-client';\n\n/**\n * Prometheus metrics registry\n */\nexport const promRegistry = new Registry();\n\n/**\n * HTTP request duration histogram with percentiles\n * Automatically calculates p50, p95, p99\n */\nexport const httpRequestDuration = new Histogram({\n name: 'http_request_duration_ms',\n help: 'HTTP request duration in milliseconds',\n labelNames: ['method', 'route', 'status_code', 'tenant', 'plugin'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000], // milliseconds\n registers: [promRegistry],\n});\n\n/**\n * HTTP requests total counter\n */\nexport const httpRequestsTotal = new Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code', 'tenant', 'plugin'],\n registers: [promRegistry],\n});\n\n/**\n * HTTP errors total counter\n */\nexport const httpErrorsTotal = new Counter({\n name: 'http_errors_total',\n help: 'Total number of HTTP errors (4xx, 5xx)',\n labelNames: ['status_code', 'error_code', 'tenant'],\n registers: [promRegistry],\n});\n\n/**\n * Process uptime gauge\n */\nexport const processUptime = new Gauge({\n name: 'process_uptime_seconds',\n help: 'Process uptime in seconds',\n registers: [promRegistry],\n});\n\nexport const processCpuPercent = new Gauge({\n name: 'process_cpu_percent',\n help: 'Current process CPU usage percentage',\n registers: [promRegistry],\n});\n\nexport const processRssBytes = new Gauge({\n name: 'process_rss_bytes',\n help: 'Current process resident set size in bytes',\n registers: [promRegistry],\n});\n\nexport const processHeapUsedBytes = new Gauge({\n name: 'process_heap_used_bytes',\n help: 'Current process heap used in bytes',\n registers: [promRegistry],\n});\n\nexport const processEventLoopLagMs = new Gauge({\n name: 'process_event_loop_lag_ms',\n help: 'Current event loop lag in milliseconds',\n registers: [promRegistry],\n});\n\nexport const serviceHealthStatus = new Gauge({\n name: 'service_health_status',\n help: 'Service health status (2=healthy, 1=degraded, 0=unhealthy)',\n registers: [promRegistry],\n});\n\nexport const serviceRestartsTotal = new Gauge({\n name: 'service_restarts_total',\n help: 'Service restart counter within current process lifetime',\n registers: [promRegistry],\n});\n\nexport const serviceActiveOperations = new Gauge({\n name: 'service_active_operations',\n help: 'Current number of active operations',\n registers: [promRegistry],\n});\n\nexport const serviceOperationTotal = new Counter({\n name: 'service_operation_total',\n help: 'Total number of service operations',\n labelNames: ['operation', 'status'],\n registers: [promRegistry],\n});\n\nexport const serviceOperationDuration = new Histogram({\n name: 'service_operation_duration_ms',\n help: 'Service operation duration in milliseconds',\n labelNames: ['operation', 'status'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n registers: [promRegistry],\n});\n\n/**\n * Header policy metrics\n */\nexport const headersFiltered = new Counter({\n name: 'kb_headers_filtered_total',\n help: 'Total headers filtered by policy enforcement',\n labelNames: ['direction', 'plugin'],\n registers: [promRegistry],\n});\n\nexport const headersSensitiveInbound = new Counter({\n name: 'kb_headers_sensitive_inbound_total',\n help: 'Sensitive inbound headers observed',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const headersValidationErrors = new Counter({\n name: 'kb_headers_validation_errors_total',\n help: 'Header validation errors encountered',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const headersVaryApplied = new Counter({\n name: 'kb_headers_vary_applied_total',\n help: 'Vary header entries applied by policy',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const headersDryRunDecisions = new Counter({\n name: 'kb_headers_dry_run_decisions_total',\n help: 'Header decisions skipped due to dry-run mode',\n registers: [promRegistry],\n});\n\n/**\n * Plugin metrics\n */\nexport const pluginRequestsTotal = new Counter({\n name: 'kb_plugin_request_total',\n help: 'Total HTTP requests per plugin',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const pluginRequestDuration = new Histogram({\n name: 'kb_plugin_request_duration_ms',\n help: 'Plugin request duration metrics',\n labelNames: ['plugin'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000],\n registers: [promRegistry],\n});\n\n/**\n * Tenant metrics\n */\nexport const tenantRequestsTotal = new Counter({\n name: 'kb_tenant_request_total',\n help: 'Total HTTP requests per tenant',\n labelNames: ['tenant'],\n registers: [promRegistry],\n});\n\nexport const tenantErrorsTotal = new Counter({\n name: 'kb_tenant_request_errors_total',\n help: 'Total HTTP errors per tenant',\n labelNames: ['tenant'],\n registers: [promRegistry],\n});\n\nexport const tenantRequestDuration = new Histogram({\n name: 'kb_tenant_request_duration_ms',\n help: 'Tenant request duration',\n labelNames: ['tenant'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000],\n registers: [promRegistry],\n});\n\n/**\n * Plugin mount metrics\n */\nexport const pluginsMountTotal = new Gauge({\n name: 'kb_plugins_mount_total',\n help: 'Plugins processed during last mount run',\n registers: [promRegistry],\n});\n\nexport const pluginsMountSucceeded = new Gauge({\n name: 'kb_plugins_mount_succeeded',\n help: 'Plugins successfully mounted',\n registers: [promRegistry],\n});\n\nexport const pluginsMountFailed = new Gauge({\n name: 'kb_plugins_mount_failed',\n help: 'Plugins failed to mount',\n registers: [promRegistry],\n});\n\nexport const pluginsMountElapsed = new Gauge({\n name: 'kb_plugins_mount_elapsed_ms',\n help: 'Plugin mount elapsed time in milliseconds',\n registers: [promRegistry],\n});\n\n/**\n * Redis metrics\n */\nexport const redisStatusUpdates = new Counter({\n name: 'kb_redis_status_updates_total',\n help: 'Redis status updates observed',\n registers: [promRegistry],\n});\n\nexport const redisStatusTransitions = new Counter({\n name: 'kb_redis_status_transitions_total',\n help: 'Redis health transitions',\n labelNames: ['state'],\n registers: [promRegistry],\n});\n\nexport const redisHealthy = new Gauge({\n name: 'kb_redis_healthy',\n help: 'Redis healthy flag (1 = healthy)',\n registers: [promRegistry],\n});\n\nexport const redisRoleState = new Gauge({\n name: 'kb_redis_role_state_total',\n help: 'Redis role state occurrences',\n labelNames: ['role', 'state'],\n registers: [promRegistry],\n});\n\n/**\n * Update process uptime metric\n */\nexport function updateProcessUptime(startTimeMs: number): void {\n const uptimeSeconds = (Date.now() - startTimeMs) / 1000;\n processUptime.set(uptimeSeconds);\n}\n\nexport function updateRuntimeObservabilityMetrics(input: {\n cpuPercent: number;\n rssBytes: number;\n heapUsedBytes: number;\n eventLoopLagMs: number;\n activeOperations: number;\n healthStatus?: 'healthy' | 'degraded' | 'unhealthy';\n}): void {\n processCpuPercent.set(input.cpuPercent);\n processRssBytes.set(input.rssBytes);\n processHeapUsedBytes.set(input.heapUsedBytes);\n processEventLoopLagMs.set(input.eventLoopLagMs);\n serviceActiveOperations.set(input.activeOperations);\n serviceRestartsTotal.set(0);\n\n if (input.healthStatus) {\n updateServiceHealthStatus(input.healthStatus);\n }\n}\n\nexport function updateServiceHealthStatus(status: 'healthy' | 'degraded' | 'unhealthy'): void {\n serviceHealthStatus.set(status === 'healthy' ? 2 : status === 'degraded' ? 1 : 0);\n}\n\n/**\n * Get all metrics in Prometheus format\n */\nexport async function getPrometheusMetrics(): Promise<string> {\n return promRegistry.metrics();\n}\n","import { performance } from 'node:perf_hooks';\nimport type { FastifyInstance } from 'fastify';\ntype RedisStatus = {\n enabled: boolean;\n healthy: boolean;\n roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null };\n};\nimport { OperationMetricsTracker } from '@kb-labs/shared-http';\nimport {\n httpRequestDuration,\n httpRequestsTotal,\n httpErrorsTotal,\n serviceActiveOperations,\n serviceOperationDuration,\n serviceOperationTotal,\n tenantRequestsTotal,\n tenantErrorsTotal,\n tenantRequestDuration,\n} from '../observability/prometheus-registry';\nimport { platform } from '@kb-labs/core-runtime';\n\n/**\n * @module @kb-labs/rest-api-app/middleware/metrics\n * Metrics collection middleware\n */\n\n/**\n * Metrics data\n */\ntype RedisRole = 'publisher' | 'subscriber' | 'cache';\n\ninterface RedisMetrics {\n updates: number;\n healthyTransitions: number;\n unhealthyTransitions: number;\n lastUpdateTs: number | null;\n lastHealthyTs: number | null;\n lastUnhealthyTs: number | null;\n lastStatus: {\n enabled: boolean;\n healthy: boolean;\n roles: Record<RedisRole, string | null>;\n } | null;\n roleStates: Record<RedisRole, Record<string, number>>;\n}\n\ninterface Metrics {\n requests: {\n total: number;\n active: number;\n byMethod: Record<string, number>;\n byStatus: Record<string, number>;\n byRoute: Record<string, number>;\n byTenant: Record<string, number>; // ← Multi-tenancy support\n };\n latency: {\n total: number;\n count: number;\n min: number;\n max: number;\n average: number;\n histogram: Map<string, RouteLatencyStats>;\n };\n errors: {\n total: number;\n byCode: Record<string, number>;\n };\n timestamps: {\n startTime: number;\n lastRequest: number;\n };\n headers: {\n filteredInbound: number;\n filteredOutbound: number;\n sensitiveInbound: number;\n validationErrors: number;\n varyApplied: number;\n dryRunDecisions: number;\n byPlugin: Record<string, HeaderPluginMetrics>;\n };\n redis: RedisMetrics;\n // ← Multi-tenancy support\n perTenant: Map<string, {\n total: number;\n errors: number;\n totalLatency: number;\n }>;\n}\n\ntype RouteLatencyStats = {\n count: number;\n total: number;\n max: number;\n byStatus: Record<string, number>;\n};\n\ntype HeaderPluginMetrics = {\n filteredInbound: number;\n filteredOutbound: number;\n validationErrors: number;\n varyApplied: number;\n sensitiveInbound: number;\n};\n\ntype HeaderMetricsEntry = {\n pluginId?: string;\n routeId?: string;\n filteredInbound: number;\n filteredOutbound: number;\n sensitiveInbound: number;\n validationErrors: number;\n varyApplied: number;\n dryRun: boolean;\n};\n\nexport type PluginsMetricsSnapshot = {\n total: number;\n succeeded: number;\n failed: number;\n elapsedMs: number;\n};\n\ntype PluginsMetricsDetails = Record<string, {\n routes: number;\n status: 'ok' | 'failed';\n durationMs: number;\n lastError?: string;\n}>;\n\nclass PluginsMetricsCollector {\n private metrics: PluginsMetricsSnapshot & { details: PluginsMetricsDetails } = this.createDefault();\n\n private createDefault(): PluginsMetricsSnapshot & { details: PluginsMetricsDetails } {\n return {\n total: 0,\n succeeded: 0,\n failed: 0,\n elapsedMs: 0,\n details: {},\n };\n }\n\n reset(): void {\n this.metrics = this.createDefault();\n }\n\n recordSuccess(pluginId: string, routes: number, durationMs: number): void {\n this.metrics.total += 1;\n this.metrics.succeeded += 1;\n this.metrics.elapsedMs += durationMs;\n this.metrics.details[pluginId] = {\n routes,\n status: 'ok',\n durationMs,\n };\n }\n\n recordFailure(pluginId: string, error: string): void {\n this.metrics.total += 1;\n this.metrics.failed += 1;\n this.metrics.details[pluginId] = {\n routes: 0,\n status: 'failed',\n durationMs: 0,\n lastError: error,\n };\n }\n\n getSnapshot(): PluginsMetricsSnapshot {\n return {\n total: this.metrics.total,\n succeeded: this.metrics.succeeded,\n failed: this.metrics.failed,\n elapsedMs: Number(this.metrics.elapsedMs.toFixed(2)),\n };\n }\n\n getDetails(): PluginsMetricsDetails {\n return this.metrics.details;\n }\n}\n\nexport interface MetricsSnapshot {\n requests: Metrics['requests'] & {\n success: number;\n clientErrors: number;\n serverErrors: number;\n };\n latency: Omit<Metrics['latency'], 'histogram'> & {\n histogram: Array<{\n route: string;\n count: number;\n total: number;\n max: number;\n byStatus: Record<string, number>;\n budgetMs: number | null;\n pluginId?: string;\n }>;\n };\n perPlugin: Array<{\n pluginId?: string;\n total: number;\n totalDuration: number;\n maxDuration: number;\n statuses: Record<string, number>;\n }>;\n perTenant: Array<{\n tenantId: string;\n total: number;\n errors: number;\n avgLatencyMs: number;\n }>;\n errors: Metrics['errors'];\n timestamps: Metrics['timestamps'];\n headers: {\n filteredInbound: number;\n filteredOutbound: number;\n sensitiveInbound: number;\n validationErrors: number;\n varyApplied: number;\n dryRunDecisions: number;\n perPlugin: Array<{\n pluginId: string;\n filteredInbound: number;\n filteredOutbound: number;\n validationErrors: number;\n varyApplied: number;\n sensitiveInbound: number;\n }>;\n };\n redis: {\n updates: number;\n healthyTransitions: number;\n unhealthyTransitions: number;\n lastUpdateTs: number | null;\n lastHealthyTs: number | null;\n lastUnhealthyTs: number | null;\n lastStatus: {\n enabled: boolean;\n healthy: boolean;\n roles: Record<RedisRole, string | null>;\n } | null;\n roleStates: Array<{\n role: RedisRole;\n states: Array<{ state: string; count: number }>;\n }>;\n };\n}\n\nclass MetricsCollector {\n private metrics: Metrics = this.createMetrics();\n private pluginsMetrics = new PluginsMetricsCollector();\n private lastPluginSnapshot: PluginsMetricsSnapshot | null = null;\n private pluginRouteBudgets = new Map<string, { budgetMs: number | null; pluginId?: string }>();\n\n private createMetrics(): Metrics {\n return {\n requests: {\n total: 0,\n active: 0,\n byMethod: {},\n byStatus: {},\n byRoute: {},\n byTenant: {}, // ← Multi-tenancy support\n },\n latency: {\n total: 0,\n count: 0,\n min: Infinity,\n max: 0,\n average: 0,\n histogram: new Map<string, RouteLatencyStats>(),\n },\n errors: {\n total: 0,\n byCode: {},\n },\n timestamps: {\n startTime: Date.now(),\n lastRequest: Date.now(),\n },\n headers: {\n filteredInbound: 0,\n filteredOutbound: 0,\n sensitiveInbound: 0,\n validationErrors: 0,\n varyApplied: 0,\n dryRunDecisions: 0,\n byPlugin: {},\n },\n redis: this.createRedisMetrics(),\n perTenant: new Map(), // ← Multi-tenancy support\n };\n }\n\n private createRedisMetrics(): RedisMetrics {\n return {\n updates: 0,\n healthyTransitions: 0,\n unhealthyTransitions: 0,\n lastUpdateTs: null,\n lastHealthyTs: null,\n lastUnhealthyTs: null,\n lastStatus: null,\n roleStates: {\n publisher: {},\n subscriber: {},\n cache: {},\n },\n };\n }\n\n recordRequest(method: string, route: string, statusCode: number, durationMs: number, tenantId?: string): void {\n this.metrics.requests.total++;\n this.metrics.requests.byMethod[method] = (this.metrics.requests.byMethod[method] || 0) + 1;\n const statusGroup = `${Math.floor(statusCode / 100)}xx`;\n this.metrics.requests.byStatus[statusGroup] = (this.metrics.requests.byStatus[statusGroup] || 0) + 1;\n\n const normalizedRoute = normalizeRoute(route);\n if (normalizedRoute) {\n const routeBucket = `${method} ${normalizedRoute}`;\n this.metrics.requests.byRoute[routeBucket] = (this.metrics.requests.byRoute[routeBucket] || 0) + 1;\n updateLatencyHistogram(this.metrics.latency.histogram, routeBucket, durationMs, statusCode);\n }\n\n // ← Multi-tenancy support: track by tenant\n if (tenantId) {\n this.metrics.requests.byTenant[tenantId] = (this.metrics.requests.byTenant[tenantId] || 0) + 1;\n\n const tenantStats = this.metrics.perTenant.get(tenantId) || {\n total: 0,\n errors: 0,\n totalLatency: 0,\n };\n tenantStats.total++;\n tenantStats.totalLatency += durationMs;\n if (statusCode >= 400) {\n tenantStats.errors++;\n }\n this.metrics.perTenant.set(tenantId, tenantStats);\n }\n\n this.metrics.latency.count++;\n this.metrics.latency.total += durationMs;\n this.metrics.latency.min = Math.min(this.metrics.latency.min, durationMs);\n this.metrics.latency.max = Math.max(this.metrics.latency.max, durationMs);\n this.metrics.latency.average = this.metrics.latency.total / this.metrics.latency.count;\n this.metrics.timestamps.lastRequest = Date.now();\n }\n\n incrementActiveRequests(): number {\n this.metrics.requests.active += 1;\n return this.metrics.requests.active;\n }\n\n decrementActiveRequests(): number {\n this.metrics.requests.active = Math.max(0, this.metrics.requests.active - 1);\n return this.metrics.requests.active;\n }\n\n getActiveRequests(): number {\n return this.metrics.requests.active;\n }\n\n recordError(errorCode: string): void {\n this.metrics.errors.total++;\n this.metrics.errors.byCode[errorCode] = (this.metrics.errors.byCode[errorCode] || 0) + 1;\n }\n\n recordHeaderMetrics(entry: HeaderMetricsEntry): void {\n const headers = this.metrics.headers;\n headers.filteredInbound += Math.max(0, entry.filteredInbound);\n headers.filteredOutbound += Math.max(0, entry.filteredOutbound);\n headers.sensitiveInbound += Math.max(0, entry.sensitiveInbound);\n headers.validationErrors += Math.max(0, entry.validationErrors);\n headers.varyApplied += Math.max(0, entry.varyApplied);\n if (entry.dryRun) {\n headers.dryRunDecisions += Math.max(\n 0,\n entry.filteredInbound + entry.filteredOutbound + entry.validationErrors\n );\n }\n\n if (entry.pluginId) {\n const existing: HeaderPluginMetrics = headers.byPlugin[entry.pluginId] ?? {\n filteredInbound: 0,\n filteredOutbound: 0,\n validationErrors: 0,\n varyApplied: 0,\n sensitiveInbound: 0,\n };\n existing.filteredInbound += Math.max(0, entry.filteredInbound);\n existing.filteredOutbound += Math.max(0, entry.filteredOutbound);\n existing.validationErrors += Math.max(0, entry.validationErrors);\n existing.varyApplied += Math.max(0, entry.varyApplied);\n existing.sensitiveInbound += Math.max(0, entry.sensitiveInbound);\n headers.byPlugin[entry.pluginId] = existing;\n }\n }\n\n recordRedisStatus(status: RedisStatus | null): void {\n if (!status) {\n return;\n }\n const now = Date.now();\n const redisMetrics = this.metrics.redis;\n const previous = redisMetrics.lastStatus;\n\n redisMetrics.updates += 1;\n redisMetrics.lastUpdateTs = now;\n if (status.healthy) {\n redisMetrics.lastHealthyTs = now;\n } else {\n redisMetrics.lastUnhealthyTs = now;\n }\n\n if (previous && previous.healthy !== status.healthy) {\n if (status.healthy) {\n redisMetrics.healthyTransitions += 1;\n } else {\n redisMetrics.unhealthyTransitions += 1;\n }\n }\n\n const normalizedRoles: Record<RedisRole, string | null> = {\n publisher: status.roles.publisher ?? null,\n subscriber: status.roles.subscriber ?? null,\n cache: status.roles.cache ?? null,\n };\n\n (Object.keys(normalizedRoles) as RedisRole[]).forEach((role) => {\n const state = normalizedRoles[role] ?? 'unknown';\n const bucket = state ?? 'unknown';\n redisMetrics.roleStates[role][bucket] =\n (redisMetrics.roleStates[role][bucket] ?? 0) + 1;\n });\n\n redisMetrics.lastStatus = {\n enabled: status.enabled,\n healthy: status.healthy,\n roles: normalizedRoles,\n };\n }\n\n getMetrics(): MetricsSnapshot {\n const avg = this.metrics.latency.count > 0\n ? this.metrics.latency.total / this.metrics.latency.count\n : 0;\n\n const perPluginMap = new Map<string, {\n pluginId?: string;\n total: number;\n totalDuration: number;\n maxDuration: number;\n statuses: Record<string, number>;\n }>();\n\n const histogramArray = Array.from(this.metrics.latency.histogram.entries()).map(([route, stats]) => {\n const entry = this.pluginRouteBudgets.get(route);\n const pluginId = entry?.pluginId;\n if (pluginId) {\n let aggregate = perPluginMap.get(pluginId);\n if (!aggregate) {\n aggregate = {\n pluginId,\n total: 0,\n totalDuration: 0,\n maxDuration: 0,\n statuses: {},\n };\n perPluginMap.set(pluginId, aggregate);\n }\n aggregate.total += stats.count;\n aggregate.totalDuration += stats.total;\n aggregate.maxDuration = Math.max(aggregate.maxDuration, stats.max);\n for (const [statusCode, count] of Object.entries(stats.byStatus)) {\n aggregate.statuses[statusCode] = (aggregate.statuses[statusCode] || 0) + count;\n }\n }\n\n return {\n route,\n count: stats.count,\n total: stats.total,\n max: stats.max,\n byStatus: { ...stats.byStatus },\n budgetMs: entry?.budgetMs ?? null,\n pluginId,\n };\n });\n\n const headerPerPlugin = Object.entries(this.metrics.headers.byPlugin).map(([pluginId, data]) => ({\n pluginId,\n filteredInbound: data.filteredInbound,\n filteredOutbound: data.filteredOutbound,\n validationErrors: data.validationErrors,\n varyApplied: data.varyApplied,\n sensitiveInbound: data.sensitiveInbound,\n }));\n\n const redisRoleStates = (Object.keys(this.metrics.redis.roleStates) as RedisRole[]).map((role) => ({\n role,\n states: Object.entries(this.metrics.redis.roleStates[role]).map(([state, count]) => ({\n state,\n count,\n })),\n }));\n\n const lastRedisStatus = this.metrics.redis.lastStatus\n ? {\n enabled: this.metrics.redis.lastStatus.enabled,\n healthy: this.metrics.redis.lastStatus.healthy,\n roles: { ...this.metrics.redis.lastStatus.roles },\n }\n : null;\n\n // Serialize perTenant Map to Array\n const perTenantArray = Array.from(this.metrics.perTenant.entries()).map(([tenantId, stats]) => ({\n tenantId,\n total: stats.total,\n errors: stats.errors,\n avgLatencyMs: stats.total > 0 ? stats.totalLatency / stats.total : 0,\n }));\n\n // Calculate success/error counts from byStatus\n const success = (this.metrics.requests.byStatus['2xx'] || 0) + (this.metrics.requests.byStatus['3xx'] || 0);\n const clientErrors = this.metrics.requests.byStatus['4xx'] || 0;\n const serverErrors = this.metrics.requests.byStatus['5xx'] || 0;\n\n return {\n requests: {\n ...this.metrics.requests,\n success,\n clientErrors,\n serverErrors,\n },\n latency: {\n total: this.metrics.latency.total,\n count: this.metrics.latency.count,\n min: this.metrics.latency.min,\n max: this.metrics.latency.max,\n average: avg,\n histogram: histogramArray,\n },\n perPlugin: Array.from(perPluginMap.values()),\n perTenant: perTenantArray,\n errors: { ...this.metrics.errors, byCode: { ...this.metrics.errors.byCode } },\n timestamps: { ...this.metrics.timestamps },\n headers: {\n filteredInbound: this.metrics.headers.filteredInbound,\n filteredOutbound: this.metrics.headers.filteredOutbound,\n sensitiveInbound: this.metrics.headers.sensitiveInbound,\n validationErrors: this.metrics.headers.validationErrors,\n varyApplied: this.metrics.headers.varyApplied,\n dryRunDecisions: this.metrics.headers.dryRunDecisions,\n perPlugin: headerPerPlugin,\n },\n redis: {\n updates: this.metrics.redis.updates,\n healthyTransitions: this.metrics.redis.healthyTransitions,\n unhealthyTransitions: this.metrics.redis.unhealthyTransitions,\n lastUpdateTs: this.metrics.redis.lastUpdateTs,\n lastHealthyTs: this.metrics.redis.lastHealthyTs,\n lastUnhealthyTs: this.metrics.redis.lastUnhealthyTs,\n lastStatus: lastRedisStatus,\n roleStates: redisRoleStates,\n },\n };\n }\n\n reset(): void {\n this.metrics = this.createMetrics();\n this.pluginsMetrics.reset();\n this.lastPluginSnapshot = null;\n }\n\n beginPluginMount(): PluginsMetricsCollector {\n this.pluginsMetrics.reset();\n return this.pluginsMetrics;\n }\n\n completePluginMount(logger: { info: (...args: unknown[]) => void; warn: (...args: unknown[]) => void }): PluginsMetricsSnapshot | null {\n const snapshot = this.pluginsMetrics.getSnapshot();\n this.lastPluginSnapshot = snapshot;\n if (snapshot.total === 0) {\n return snapshot;\n }\n\n logger.info('Plugin mount metrics', snapshot);\n if (snapshot.failed > 0) {\n logger.warn('Plugin mount failures', this.pluginsMetrics.getDetails());\n }\n\n this.pluginsMetrics.reset();\n return snapshot;\n }\n\n getLastPluginMountSnapshot(): PluginsMetricsSnapshot | null {\n return this.lastPluginSnapshot;\n }\n\n registerRouteBudget(\n method: string,\n routePath: string,\n budgetMs: number | null | undefined,\n pluginId?: string\n ): void {\n const normalized = normalizeRoute(routePath);\n if (!normalized) {\n return;\n }\n const bucket = `${method.toUpperCase()} ${normalized}`;\n this.pluginRouteBudgets.set(bucket, { budgetMs: budgetMs ?? null, pluginId });\n }\n\n resetPluginRouteBudgets(): void {\n this.pluginRouteBudgets.clear();\n }\n\n getRouteBudget(method: string, routePath: string): number | null {\n const normalized = normalizeRoute(routePath);\n if (!normalized) {\n return null;\n }\n const bucket = `${method.toUpperCase()} ${normalized}`;\n const entry = this.pluginRouteBudgets.get(bucket);\n return entry ? entry.budgetMs ?? null : null;\n }\n}\n\nexport const metricsCollector = new MetricsCollector();\nexport const restDomainOperationMetrics = new OperationMetricsTracker();\n\n/**\n * Sampling strategy for high-frequency endpoints to prevent analytics overload.\n *\n * - /metrics: 1:100 (Prometheus scraping happens every few seconds)\n * - /health, /ready, /observability/health, /observability/describe: 1:10\n * - All other endpoints: 1:1 (track everything)\n *\n * Uses deterministic sampling based on request counter to ensure even distribution.\n */\nlet requestCounter = 0;\nfunction shouldSampleRequest(route: string): boolean {\n requestCounter = (requestCounter + 1) % 100;\n\n // High-frequency metrics endpoints (Prometheus scraping) - sample 1:100\n if (route === '/metrics' || route === '/api/v1/metrics') {\n return requestCounter === 0; // Only track every 100th request\n }\n\n // Medium-frequency health and observability probes - sample 1:10\n if (\n route === '/api/v1/health' ||\n route === '/api/v1/ready' ||\n route === '/api/v1/observability/health' ||\n route === '/api/v1/observability/describe'\n ) {\n return requestCounter % 10 === 0; // Only track every 10th request\n }\n\n // All other endpoints - track every request (1:1)\n return true;\n}\n\n// ADDS: request.kbMetricsStart | READS: kbLogger, kbPluginId, tenantId (onResponse)\nexport function registerMetricsMiddleware(server: FastifyInstance): void {\n server.addHook('onRequest', (request, _reply, done) => {\n request.kbMetricsStart = performance.now();\n serviceActiveOperations.set(metricsCollector.incrementActiveRequests());\n done();\n });\n\n server.addHook('onResponse', (request, reply, done) => {\n const start = request.kbMetricsStart ?? performance.now();\n const duration = Math.max(performance.now() - start, 0);\n const method = (request.method || request.raw.method || 'GET').toUpperCase();\n const routePath = request.routeOptions?.url ?? request.url;\n\n // Extract tenantId from header or env var\n const tenantId = (request.headers['x-tenant-id'] as string | undefined) ?? process.env.KB_TENANT_ID ?? 'default';\n\n // Log request completion with method + full URL + status code + duration\n if (request.kbLogger) {\n const fullUrl = request.url;\n const durationMs = Math.round(duration);\n request.kbLogger.info(`✓ ${method} ${fullUrl} ${reply.statusCode} ${durationMs}ms`, {\n statusCode: reply.statusCode,\n durationMs,\n });\n }\n\n // Record to legacy collector\n metricsCollector.recordRequest(method, routePath ?? request.url, reply.statusCode, duration, tenantId);\n if (reply.statusCode >= 400) {\n metricsCollector.recordError(String(reply.statusCode));\n }\n\n // Record to prom-client metrics\n const normalizedRoute = normalizeRoute(routePath ?? request.url) ?? 'unknown';\n const statusCode = String(reply.statusCode);\n const operation = `http.${method} ${normalizedRoute}`;\n\n // Record request duration histogram (automatically calculates p50/p95/p99)\n httpRequestDuration.observe(\n {\n method,\n route: normalizedRoute,\n status_code: statusCode,\n tenant: tenantId,\n plugin: '', // Will be populated from route metadata if available\n },\n duration\n );\n\n // Record request counter\n httpRequestsTotal.inc({\n method,\n route: normalizedRoute,\n status_code: statusCode,\n tenant: tenantId,\n plugin: '',\n });\n\n // Record errors\n if (reply.statusCode >= 400) {\n httpErrorsTotal.inc({\n status_code: statusCode,\n error_code: String(reply.errorCode ?? reply.statusCode),\n tenant: tenantId,\n });\n tenantErrorsTotal.inc({ tenant: tenantId });\n }\n\n serviceOperationTotal.inc({\n operation,\n status: reply.statusCode >= 400 ? 'error' : 'ok',\n });\n serviceOperationDuration.observe(\n {\n operation,\n status: reply.statusCode >= 400 ? 'error' : 'ok',\n },\n duration,\n );\n\n // Record tenant metrics\n tenantRequestsTotal.inc({ tenant: tenantId });\n tenantRequestDuration.observe({ tenant: tenantId }, duration);\n\n // Track to analytics for long-term storage (async, fire-and-forget)\n // This enables quarterly/annual reports and endpoint usage analysis\n // Skip OPTIONS (CORS preflight) - they don't carry useful information\n if (method !== 'OPTIONS') {\n const { analytics } = platform;\n if (analytics) {\n // Sample high-frequency probe endpoints (1:100 for metrics, 1:10 for health/ready/observability)\n // This prevents overwhelming analytics with 142k+ ping-pong events\n const shouldSample = shouldSampleRequest(normalizedRoute);\n\n if (shouldSample) {\n analytics.track('api.request', {\n endpoint: normalizedRoute,\n method,\n statusCode: reply.statusCode,\n durationMs: Math.round(duration),\n tenantId,\n pluginId: request.kbPluginId ?? undefined,\n clientVersion: request.headers['x-client-version'] as string | undefined,\n userAgent: request.headers['user-agent'] as string | undefined,\n requestId: request.id as string | undefined,\n }).catch(() => {\n // Silently ignore analytics errors - should not affect request handling\n });\n }\n }\n }\n\n serviceActiveOperations.set(metricsCollector.decrementActiveRequests());\n done();\n });\n}\n\nfunction normalizeRoute(route: string): string | null {\n if (!route) {\n return null;\n }\n const routePath = route.split('?')[0];\n if (!routePath) {\n return null;\n }\n return routePath.replace(/\\/[0-9a-fA-F-]{6,}/g, '/:id');\n}\n\nfunction updateLatencyHistogram(\n histogram: Map<string, RouteLatencyStats>,\n bucket: string,\n durationMs: number,\n statusCode: number\n): void {\n let stats = histogram.get(bucket);\n if (!stats) {\n stats = { count: 0, total: 0, max: 0, byStatus: {} };\n histogram.set(bucket, stats);\n }\n stats.count += 1;\n stats.total += durationMs;\n stats.max = Math.max(stats.max, durationMs);\n const statusKey = `${statusCode}`;\n stats.byStatus[statusKey] = (stats.byStatus[statusKey] || 0) + 1;\n}\n","/**\n * @module @kb-labs/rest-api-app/utils/sse-auth\n * Helpers for SSE token validation\n */\n\nimport type { FastifyReply, FastifyRequest, HookHandlerDoneFunction } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\n\ntype RegistryAuthConfig = {\n token: string;\n headerName: string;\n queryParam: string;\n};\n\nfunction extractTokenFromHeader(headerValue: unknown, headerName: string): string | undefined {\n if (typeof headerValue === 'string') {\n if (headerName === 'authorization') {\n const match = headerValue.match(/^Bearer\\s+(.+)$/i);\n return match ? match[1] : undefined;\n }\n return headerValue;\n }\n if (Array.isArray(headerValue)) {\n return headerValue[0];\n }\n return undefined;\n}\n\nfunction extractToken(request: FastifyRequest, config: RegistryAuthConfig): string | undefined {\n const headerName = (config.headerName ?? 'authorization').toLowerCase();\n const queryParam = config.queryParam ?? 'access_token';\n\n const explicitHeader = extractTokenFromHeader(request.headers[headerName], headerName);\n if (explicitHeader) {\n return explicitHeader;\n }\n\n if (headerName !== 'authorization' && typeof request.headers.authorization === 'string') {\n const fallback = extractTokenFromHeader(request.headers.authorization, 'authorization');\n if (fallback) {\n return fallback;\n }\n }\n\n const query = request.query as Record<string, string | undefined>;\n return query?.[queryParam] ?? query?.access_token;\n}\n\nexport function buildRegistrySseAuthHook(config: RestApiConfig) {\n const registryAuth = config.events?.registry;\n if (!registryAuth?.token) {\n return undefined;\n }\n const authConfig: RegistryAuthConfig = {\n token: registryAuth.token,\n headerName: registryAuth.headerName ?? 'authorization',\n queryParam: registryAuth.queryParam ?? 'access_token',\n };\n\n return function registrySseAuthHook(\n request: FastifyRequest,\n reply: FastifyReply,\n done: HookHandlerDoneFunction\n ) {\n const provided = extractToken(request, authConfig);\n if (provided === authConfig.token) {\n done();\n return;\n }\n\n reply\n .code(401)\n .header('content-type', 'application/json')\n .send({\n status: 'unauthorized',\n reason: 'invalid_token',\n });\n };\n}\n\n\n","import type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry, SystemHealthSnapshot } from '@kb-labs/core-registry';\nimport type { ReadinessState } from './readiness';\nimport { isReady, resolveReadinessReason } from './readiness';\nimport type { EventHub, BroadcastEvent } from '../events/hub';\nimport { metricsCollector } from '../middleware/metrics.js';\nimport { buildRegistrySseAuthHook } from './sse-auth';\n\nexport async function registerEventRoutes(\n server: FastifyInstance,\n basePath: string,\n registry: IEntityRegistry,\n readiness: ReadinessState,\n eventHub: EventHub,\n config: RestApiConfig\n): Promise<void> {\n const endpoint = `${basePath}/events/registry`;\n const authHook = buildRegistrySseAuthHook(config);\n\n server.route({\n method: 'GET',\n url: endpoint,\n onRequest: authHook ? [authHook] : undefined,\n handler: async (request, reply) => {\n // Tell Fastify we're manually managing the response\n reply.hijack();\n\n // Explicit CORS headers for EventSource (browser requires these before opening connection)\n const origin = request.headers.origin;\n if (origin === 'http://localhost:3000' || origin === 'http://localhost:5173') {\n reply.raw.setHeader('Access-Control-Allow-Origin', origin);\n reply.raw.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache, no-transform');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.flushHeaders?.();\n reply.raw.write(': connected\\n\\n');\n\n const send = (event: BroadcastEvent) => {\n reply.raw.write(`event: ${event.type}\\n`);\n reply.raw.write(`data: ${JSON.stringify(event)}\\n\\n`);\n };\n\n const unsubscribe = eventHub.subscribe(send);\n\n const snapshot = registry.snapshot();\n const checksumAlgorithm = snapshot.checksumAlgorithm === 'sha256' ? 'sha256' : undefined;\n send({\n type: 'registry',\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n partial: snapshot.partial,\n stale: snapshot.stale,\n expiresAt: snapshot.expiresAt ?? null,\n ttlMs: snapshot.ttlMs ?? null,\n checksum: snapshot.checksum ?? undefined,\n checksumAlgorithm,\n previousChecksum: snapshot.previousChecksum ?? null,\n });\n\n const healthPromise = registry\n .getSystemHealth()\n .then((health: SystemHealthSnapshot) => {\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n const pluginSnapshot = metricsCollector.getLastPluginMountSnapshot();\n const redisStatus = ('getRedisStatus' in registry && typeof (registry as { getRedisStatus?: () => { enabled: boolean; healthy: boolean; roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null } } }).getRedisStatus === 'function')\n ? (registry as { getRedisStatus: () => { enabled: boolean; healthy: boolean; roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null } } }).getRedisStatus()\n : undefined;\n send({\n type: 'health',\n status: health.status,\n ts: health.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n pluginsMounted: pluginSnapshot?.succeeded ?? 0,\n pluginsFailed: pluginSnapshot?.failed ?? 0,\n lastPluginMountTs: readiness.lastPluginMountTs ?? null,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n redisEnabled: redisStatus?.enabled ?? false,\n redisHealthy: redisStatus?.healthy ?? true,\n redisStates: redisStatus ? {\n publisher: redisStatus.roles.publisher ?? null,\n subscriber: redisStatus.roles.subscriber ?? null,\n cache: redisStatus.roles.cache ?? null,\n } : undefined,\n });\n })\n .catch((error: unknown) => {\n if (request.kbLogger) {\n request.kbLogger.warn('Failed to fetch system health for SSE client', { err: error });\n }\n });\n\n await new Promise<void>((resolve) => {\n request.raw.on('close', () => {\n unsubscribe();\n reply.raw.end();\n resolve();\n });\n // In inject/test mode, the socket is not a real TCP socket and 'close' may not fire.\n // Wait for health fetch to complete before resolving so health event is included in response.\n if (request.raw.socket && !(request.raw.socket as { writable?: boolean }).writable) {\n void healthPromise.then(() => {\n unsubscribe();\n reply.raw.end();\n resolve();\n });\n }\n });\n },\n });\n}\n","export function normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n return basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n}\n\nexport function resolvePaths(basePath: string, route: string): string[] {\n const normalizedRoute = route.startsWith('/') ? route : `/${route}`;\n if (!basePath) {\n return [normalizedRoute];\n }\n const base = normalizeBasePath(basePath);\n return Array.from(new Set([normalizedRoute, `${base}${normalizedRoute}`]));\n}\n","/**\n * @module @kb-labs/rest-api-app/services/system-metrics-collector\n * System metrics collector for REST API instances.\n *\n * Collects CPU, memory, uptime, and load average metrics from the current instance\n * and writes them to platform.cache with TTL for automatic cleanup.\n */\n\nimport { platform } from '@kb-labs/core-runtime';\nimport * as os from 'node:os';\nimport * as process from 'node:process';\nimport { monitorEventLoopDelay } from 'node:perf_hooks';\nimport { updateRuntimeObservabilityMetrics } from '../../observability/prometheus-registry.js';\n\nlet latestSystemMetricsSnapshot: SystemMetrics | null = null;\n\n/**\n * System metrics data structure\n */\nexport interface SystemMetrics {\n /** Instance identifier (hostname) */\n instanceId: string;\n\n /** Timestamp when metrics were collected (ms since epoch) */\n timestamp: number;\n\n /** CPU usage information */\n cpu: {\n /** User CPU time in microseconds */\n user: number;\n /** System CPU time in microseconds */\n system: number;\n /** CPU usage percentage (0-100) */\n percentage: number;\n };\n\n /** Memory usage information */\n memory: {\n /** Resident Set Size (bytes) - total memory allocated */\n rss: number;\n /** Heap total (bytes) - allocated heap */\n heapTotal: number;\n /** Heap used (bytes) - actual heap used */\n heapUsed: number;\n /** External memory (bytes) - C++ objects bound to JS */\n external: number;\n /** Array buffers (bytes) */\n arrayBuffers: number;\n /** RSS usage percentage (0-100) */\n rssPercentage: number;\n /** Heap usage percentage (0-100) */\n heapPercentage: number;\n };\n\n /** Process uptime (seconds) */\n uptime: number;\n eventLoopLagMs: number;\n activeOperations: number;\n\n /** System load average (1, 5, 15 minutes) */\n loadAvg: [number, number, number];\n\n /** Total system memory (bytes) */\n totalMemory: number;\n\n /** Free system memory (bytes) */\n freeMemory: number;\n}\n\nfunction toFiniteNumber(value: number): number {\n return Number.isFinite(value) ? value : 0;\n}\n\n/**\n * System metrics collector\n * Periodically collects system metrics and writes to platform.cache\n */\nexport class SystemMetricsCollector {\n private intervalId: NodeJS.Timeout | null = null;\n private instanceId: string;\n private lastCpuUsage = process.cpuUsage();\n private lastCpuTime = Date.now();\n private eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });\n private latestMetrics: SystemMetrics | null = null;\n\n constructor(\n private readonly serviceId: string = 'rest',\n private readonly getActiveOperations: () => number = () => 0,\n ) {\n this.instanceId = `${os.hostname()}:${process.pid}`;\n }\n\n /**\n * Calculate CPU percentage based on delta\n */\n private calculateCpuPercentage(): number {\n const currentUsage = process.cpuUsage(this.lastCpuUsage);\n const currentTime = Date.now();\n const deltaTime = currentTime - this.lastCpuTime;\n\n // Update for next calculation\n this.lastCpuUsage = process.cpuUsage();\n this.lastCpuTime = currentTime;\n\n // Calculate CPU percentage\n // cpuUsage() returns microseconds, convert to milliseconds and calculate percentage\n const cpuTimeMs = (currentUsage.user + currentUsage.system) / 1000;\n const percentage = (cpuTimeMs / deltaTime) * 100;\n\n // Cap at 100% (can exceed on multi-core systems)\n return Math.min(percentage, 100);\n }\n\n /**\n * Collect current system metrics\n */\n private collectMetrics(): SystemMetrics {\n const memoryUsage = process.memoryUsage();\n const totalMemory = os.totalmem();\n const heapPercentageRaw =\n memoryUsage.heapTotal > 0 ? (memoryUsage.heapUsed / memoryUsage.heapTotal) * 100 : 0;\n const eventLoopLagMs = toFiniteNumber(Number((this.eventLoopDelay.mean / 1_000_000).toFixed(2)));\n const cpuPercentage = toFiniteNumber(this.calculateCpuPercentage());\n\n return {\n instanceId: this.instanceId,\n timestamp: Date.now(),\n cpu: {\n user: this.lastCpuUsage.user,\n system: this.lastCpuUsage.system,\n percentage: cpuPercentage,\n },\n memory: {\n rss: memoryUsage.rss,\n heapTotal: memoryUsage.heapTotal,\n heapUsed: memoryUsage.heapUsed,\n external: memoryUsage.external,\n arrayBuffers: memoryUsage.arrayBuffers,\n rssPercentage: toFiniteNumber((memoryUsage.rss / totalMemory) * 100),\n heapPercentage: toFiniteNumber(heapPercentageRaw),\n },\n uptime: process.uptime(),\n eventLoopLagMs,\n activeOperations: this.getActiveOperations(),\n loadAvg: os.loadavg() as [number, number, number],\n totalMemory,\n freeMemory: os.freemem(),\n };\n }\n\n /**\n * Start collecting metrics at regular intervals\n * @param intervalMs - Collection interval in milliseconds (default: 10000ms = 10s)\n * @param ttlMs - Time-to-live for cache entries (default: 60000ms = 60s)\n */\n async start(intervalMs: number = 10000, ttlMs: number = 60000): Promise<void> {\n if (this.intervalId) {\n platform.logger.warn('SystemMetricsCollector already started');\n return;\n }\n\n platform.logger.info('Starting system metrics collector', {\n serviceId: this.serviceId,\n instanceId: this.instanceId,\n intervalMs,\n ttlMs,\n });\n\n this.eventLoopDelay.enable();\n\n // Collect immediately on start\n await this.collect(ttlMs);\n\n // Then collect at intervals\n this.intervalId = setInterval(async () => {\n await this.collect(ttlMs);\n }, intervalMs);\n }\n\n /**\n * Collect metrics and write to cache\n */\n private async collect(ttlMs: number): Promise<void> {\n try {\n const metrics = this.collectMetrics();\n this.latestMetrics = metrics;\n latestSystemMetricsSnapshot = metrics;\n\n // Write to platform.cache with TTL\n // Key pattern: system-metrics:{instanceId}\n await platform.cache.set(\n `system-metrics:${this.instanceId}`,\n metrics,\n ttlMs\n );\n\n updateRuntimeObservabilityMetrics({\n cpuPercent: metrics.cpu.percentage,\n rssBytes: metrics.memory.rss,\n heapUsedBytes: metrics.memory.heapUsed,\n eventLoopLagMs: metrics.eventLoopLagMs,\n activeOperations: metrics.activeOperations,\n });\n\n platform.logger.debug('System metrics collected', {\n serviceId: this.serviceId,\n instanceId: this.instanceId,\n cpu: metrics.cpu.percentage.toFixed(1) + '%',\n memory: metrics.memory.rssPercentage.toFixed(1) + '%',\n eventLoopLagMs: metrics.eventLoopLagMs,\n activeOperations: metrics.activeOperations,\n uptime: Math.floor(metrics.uptime) + 's',\n });\n\n this.eventLoopDelay.reset();\n } catch (error) {\n platform.logger.error('Failed to collect system metrics', error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n getInstanceId(): string {\n return this.instanceId;\n }\n\n getLatestMetrics(): SystemMetrics | null {\n return this.latestMetrics;\n }\n\n /**\n * Stop collecting metrics\n */\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n platform.logger.info('System metrics collector stopped');\n }\n this.eventLoopDelay.disable();\n }\n}\n\nexport function getLatestSystemMetrics(): SystemMetrics | null {\n return latestSystemMetricsSnapshot;\n}\n","/**\n * @module @kb-labs/rest-api-app/services/historical-metrics\n * Historical metrics collection and storage service\n */\n\nimport type { CacheAdapter } from '@kb-labs/plugin-contracts';\nimport { metricsCollector } from '../../middleware/metrics.js';\n\n/**\n * Historical data point\n */\nexport interface HistoricalDataPoint {\n timestamp: number;\n value: number;\n}\n\n/**\n * Heatmap cell data\n */\nexport interface HeatmapCell {\n day: string; // 'Mon', 'Tue', etc.\n hour: number; // 0-23\n value: number;\n}\n\n/**\n * Metrics snapshot for historical storage\n */\ninterface MetricsSnapshot {\n timestamp: number;\n requests: {\n total: number;\n success: number;\n clientErrors: number;\n serverErrors: number;\n };\n latency: {\n average: number;\n min: number;\n max: number;\n p50?: number;\n p95?: number;\n p99?: number;\n };\n uptime: number; // seconds\n perPlugin: Array<{\n pluginId?: string;\n requests: number;\n errors: number;\n avgLatency: number;\n }>;\n}\n\n/**\n * Historical metrics collector configuration\n */\nexport interface HistoricalMetricsConfig {\n /** Collection interval in milliseconds (default: 5000 = 5s) */\n intervalMs?: number;\n /** Maximum points to store per time range */\n maxPoints?: {\n /** Last 1 minute (default: 12 points at 5s intervals) */\n '1m'?: number;\n /** Last 5 minutes (default: 60 points) */\n '5m'?: number;\n /** Last 10 minutes (default: 120 points) */\n '10m'?: number;\n /** Last 30 minutes (default: 360 points) */\n '30m'?: number;\n /** Last 1 hour (default: 720 points) */\n '1h'?: number;\n };\n /** Enable debug logging */\n debug?: boolean;\n}\n\nconst DEFAULT_CONFIG: Required<HistoricalMetricsConfig> = {\n intervalMs: 5000,\n maxPoints: {\n '1m': 12,\n '5m': 60,\n '10m': 120,\n '30m': 360,\n '1h': 720,\n },\n debug: false,\n};\n\n/**\n * Historical metrics collector service\n *\n * Collects and stores historical metrics data in platform.cache with TTL-based retention.\n * Provides time-series data for dashboards and analytics.\n */\nexport class HistoricalMetricsCollector {\n private cache: CacheAdapter;\n private config: Required<HistoricalMetricsConfig>;\n private intervalHandle: NodeJS.Timeout | null = null;\n private logger: Console | any;\n private startTimeMs: number = Date.now();\n\n constructor(cache: CacheAdapter, config: HistoricalMetricsConfig = {}, logger: Console | any = console) {\n this.cache = cache;\n this.config = { ...DEFAULT_CONFIG, ...config, maxPoints: { ...DEFAULT_CONFIG.maxPoints, ...config.maxPoints } };\n this.logger = logger;\n }\n\n /**\n * Start background collection\n */\n start(): void {\n if (this.intervalHandle) {\n this.log('warn', 'Historical metrics collector already started');\n return;\n }\n\n this.log('info', 'Starting historical metrics collector', {\n intervalMs: this.config.intervalMs,\n });\n\n // Collect immediately, then every intervalMs\n this.collect().catch(err => {\n this.log('error', 'Failed to collect initial metrics', { err });\n });\n\n this.intervalHandle = setInterval(() => {\n this.collect().catch(err => {\n this.log('error', 'Failed to collect metrics', { err });\n });\n }, this.config.intervalMs);\n }\n\n /**\n * Stop background collection\n */\n stop(): void {\n if (this.intervalHandle) {\n clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n this.log('info', 'Historical metrics collector stopped');\n }\n }\n\n /**\n * Collect current metrics snapshot and store in cache\n */\n private async collect(): Promise<void> {\n const now = Date.now();\n const metrics = metricsCollector.getMetrics();\n\n // Build snapshot\n const snapshot: MetricsSnapshot = {\n timestamp: now,\n requests: {\n total: metrics.requests.total,\n success: metrics.requests.success ?? 0,\n clientErrors: metrics.requests.clientErrors ?? 0,\n serverErrors: metrics.requests.serverErrors ?? 0,\n },\n latency: {\n average: metrics.latency.average,\n min: metrics.latency.min === Infinity ? 0 : metrics.latency.min,\n max: metrics.latency.max,\n },\n uptime: (now - metrics.timestamps.startTime) / 1000,\n perPlugin: metrics.perPlugin.map(p => ({\n pluginId: p.pluginId,\n requests: p.total,\n errors: Object.values(p.statuses)\n .filter((_, idx) => Object.keys(p.statuses)[idx]?.startsWith('4') || Object.keys(p.statuses)[idx]?.startsWith('5'))\n .reduce((sum, count) => sum + count, 0),\n avgLatency: p.total > 0 ? p.totalDuration / p.total : 0,\n })),\n };\n\n // Store in each time range bucket\n await Promise.all([\n this.appendToTimeSeries('1m', snapshot, 2 * 60 * 1000), // TTL: 2 minutes\n this.appendToTimeSeries('5m', snapshot, 10 * 60 * 1000), // TTL: 10 minutes\n this.appendToTimeSeries('10m', snapshot, 20 * 60 * 1000), // TTL: 20 minutes\n this.appendToTimeSeries('30m', snapshot, 60 * 60 * 1000), // TTL: 1 hour\n this.appendToTimeSeries('1h', snapshot, 2 * 60 * 60 * 1000), // TTL: 2 hours\n ]);\n\n // Update heatmap aggregation (less frequently - every minute)\n if (now % 60000 < this.config.intervalMs) {\n await this.updateHeatmapAggregation(snapshot).catch(err => {\n this.log('error', 'Failed to update heatmap', { err });\n });\n }\n\n this.log('debug', 'Metrics snapshot collected', {\n timestamp: new Date(now).toISOString(),\n requests: snapshot.requests.total,\n latency: snapshot.latency.average.toFixed(2),\n });\n }\n\n /**\n * Append snapshot to time series bucket\n */\n private async appendToTimeSeries(range: keyof typeof DEFAULT_CONFIG.maxPoints, snapshot: MetricsSnapshot, ttlMs: number): Promise<void> {\n const key = `metrics:history:${range}`;\n const maxPoints = this.config.maxPoints[range] ?? 120;\n\n // Get existing time series\n let timeSeries = await this.cache.get<MetricsSnapshot[]>(key);\n if (!timeSeries || !Array.isArray(timeSeries)) {\n timeSeries = [];\n }\n\n // Append new snapshot\n timeSeries.push(snapshot);\n\n // Trim to max points (FIFO)\n if (timeSeries.length > maxPoints) {\n timeSeries = timeSeries.slice(timeSeries.length - maxPoints);\n }\n\n // Store back with TTL\n await this.cache.set(key, timeSeries, ttlMs);\n }\n\n /**\n * Update heatmap aggregation for weekly patterns\n */\n private async updateHeatmapAggregation(snapshot: MetricsSnapshot): Promise<void> {\n const key = 'metrics:heatmap:7d';\n const ttlMs = 24 * 60 * 60 * 1000; // 24 hours\n\n // Get existing heatmap data\n let heatmapData = await this.cache.get<Record<string, HeatmapCell[]>>(key);\n if (!heatmapData || typeof heatmapData !== 'object') {\n heatmapData = { latency: [], errors: [], requests: [] };\n }\n\n // Calculate current day and hour\n const date = new Date(snapshot.timestamp);\n const day = (['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const)[date.getDay() as 0|1|2|3|4|5|6];\n const hour = date.getHours();\n\n // Update each metric type\n for (const metricType of ['latency', 'errors', 'requests'] as const) {\n let cells = heatmapData[metricType] || [];\n\n // Find or create cell for this day/hour\n const cellIndex = cells.findIndex(c => c.day === day && c.hour === hour);\n\n let value = 0;\n if (metricType === 'latency') {\n value = snapshot.latency.average;\n } else if (metricType === 'errors') {\n value = snapshot.requests.clientErrors + snapshot.requests.serverErrors;\n } else {\n value = snapshot.requests.total;\n }\n\n if (cellIndex >= 0 && cells[cellIndex]) {\n // Update existing cell (exponential moving average)\n cells[cellIndex]!.value = cells[cellIndex]!.value * 0.9 + value * 0.1;\n } else {\n // Add new cell\n cells.push({ day, hour, value });\n }\n\n // Keep only last 7 days worth of unique day/hour combinations (7 * 24 = 168 cells max)\n if (cells.length > 168) {\n cells = cells.slice(cells.length - 168);\n }\n\n heatmapData[metricType] = cells;\n }\n\n // Store back with TTL\n await this.cache.set(key, heatmapData, ttlMs);\n }\n\n /**\n * Query historical time-series data\n */\n async queryHistory(params: {\n metric: 'requests' | 'errors' | 'latency' | 'uptime';\n range: '1m' | '5m' | '10m' | '30m' | '1h';\n interval?: '5s' | '1m' | '5m';\n }): Promise<HistoricalDataPoint[]> {\n const key = `metrics:history:${params.range}`;\n\n // Get time series from cache\n const timeSeries = await this.cache.get<MetricsSnapshot[]>(key);\n if (!timeSeries || !Array.isArray(timeSeries)) {\n return [];\n }\n\n // Extract requested metric\n const dataPoints: HistoricalDataPoint[] = timeSeries.map(snapshot => {\n let value = 0;\n\n switch (params.metric) {\n case 'requests':\n value = snapshot.requests.total;\n break;\n case 'errors':\n value = snapshot.requests.clientErrors + snapshot.requests.serverErrors;\n break;\n case 'latency':\n value = snapshot.latency.average;\n break;\n case 'uptime':\n value = snapshot.uptime;\n break;\n }\n\n return {\n timestamp: snapshot.timestamp,\n value,\n };\n });\n\n // Apply interval aggregation if requested\n if (params.interval && params.interval !== '5s') {\n return this.aggregateByInterval(dataPoints, params.interval);\n }\n\n return dataPoints;\n }\n\n /**\n * Query heatmap data\n */\n async queryHeatmap(params: {\n metric: 'latency' | 'errors' | 'requests';\n days?: 7 | 14 | 30;\n }): Promise<HeatmapCell[]> {\n const key = 'metrics:heatmap:7d';\n\n // Get heatmap data from cache\n const heatmapData = await this.cache.get<Record<string, HeatmapCell[]>>(key);\n if (!heatmapData || typeof heatmapData !== 'object') {\n // Return empty heatmap structure\n return this.generateEmptyHeatmap();\n }\n\n const cells = heatmapData[params.metric] || [];\n\n // If no data yet, return empty heatmap\n if (cells.length === 0) {\n return this.generateEmptyHeatmap();\n }\n\n // Ensure all day/hour combinations exist (fill missing with 0)\n return this.fillHeatmapGaps(cells);\n }\n\n /**\n * Generate empty heatmap structure (7 days × 24 hours)\n */\n private generateEmptyHeatmap(): HeatmapCell[] {\n const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n const cells: HeatmapCell[] = [];\n\n for (const day of days) {\n for (let hour = 0; hour < 24; hour++) {\n cells.push({ day, hour, value: 0 });\n }\n }\n\n return cells;\n }\n\n /**\n * Fill gaps in heatmap data (missing day/hour combinations)\n */\n private fillHeatmapGaps(cells: HeatmapCell[]): HeatmapCell[] {\n const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n const cellMap = new Map<string, number>();\n\n // Index existing cells\n for (const cell of cells) {\n const key = `${cell.day}:${cell.hour}`;\n cellMap.set(key, cell.value);\n }\n\n // Generate complete 7×24 grid\n const complete: HeatmapCell[] = [];\n for (const day of days) {\n for (let hour = 0; hour < 24; hour++) {\n const key = `${day}:${hour}`;\n complete.push({\n day,\n hour,\n value: cellMap.get(key) ?? 0,\n });\n }\n }\n\n return complete;\n }\n\n /**\n * Aggregate data points by interval\n */\n private aggregateByInterval(dataPoints: HistoricalDataPoint[], interval: '1m' | '5m'): HistoricalDataPoint[] {\n if (dataPoints.length === 0) {return [];}\n\n const intervalMs = interval === '1m' ? 60 * 1000 : 5 * 60 * 1000;\n const aggregated: HistoricalDataPoint[] = [];\n\n let bucket: HistoricalDataPoint[] = [];\n let bucketStart = Math.floor(dataPoints[0]!.timestamp / intervalMs) * intervalMs;\n\n for (const point of dataPoints) {\n const pointBucket = Math.floor(point.timestamp / intervalMs) * intervalMs;\n\n if (pointBucket === bucketStart) {\n bucket.push(point);\n } else {\n // Finalize current bucket\n if (bucket.length > 0) {\n const avgValue = bucket.reduce((sum, p) => sum + p.value, 0) / bucket.length;\n aggregated.push({\n timestamp: bucketStart + intervalMs / 2, // midpoint\n value: avgValue,\n });\n }\n\n // Start new bucket\n bucket = [point];\n bucketStart = pointBucket;\n }\n }\n\n // Finalize last bucket\n if (bucket.length > 0) {\n const avgValue = bucket.reduce((sum, p) => sum + p.value, 0) / bucket.length;\n aggregated.push({\n timestamp: bucketStart + intervalMs / 2,\n value: avgValue,\n });\n }\n\n return aggregated;\n }\n\n /**\n * Get collector statistics\n */\n async getStats(): Promise<{\n running: boolean;\n uptimeSeconds: number;\n timeSeries: Record<string, { points: number; oldestTimestamp: number | null; newestTimestamp: number | null }>;\n heatmap: { cells: number; metrics: string[] };\n }> {\n const stats: {\n running: boolean;\n uptimeSeconds: number;\n timeSeries: Record<string, { points: number; oldestTimestamp: number | null; newestTimestamp: number | null }>;\n heatmap: { cells: number; metrics: string[] };\n } = {\n running: this.intervalHandle !== null,\n uptimeSeconds: (Date.now() - this.startTimeMs) / 1000,\n timeSeries: {},\n heatmap: { cells: 0, metrics: [] },\n };\n\n // Check each time range\n for (const range of ['1m', '5m', '10m', '30m', '1h'] as const) {\n const key = `metrics:history:${range}`;\n const timeSeries = await this.cache.get<MetricsSnapshot[]>(key);\n\n if (timeSeries && Array.isArray(timeSeries)) {\n stats.timeSeries[range] = {\n points: timeSeries.length,\n oldestTimestamp: timeSeries[0]?.timestamp ?? null,\n newestTimestamp: timeSeries[timeSeries.length - 1]?.timestamp ?? null,\n };\n } else {\n stats.timeSeries[range] = { points: 0, oldestTimestamp: null, newestTimestamp: null };\n }\n }\n\n // Check heatmap\n const heatmapData = await this.cache.get<Record<string, HeatmapCell[]>>('metrics:heatmap:7d');\n if (heatmapData && typeof heatmapData === 'object') {\n const metrics = Object.keys(heatmapData);\n const totalCells = metrics.reduce((sum, m) => sum + (heatmapData[m]?.length ?? 0), 0);\n stats.heatmap = { cells: totalCells, metrics };\n }\n\n return stats;\n }\n\n private log(level: 'info' | 'warn' | 'error' | 'debug', message: string, meta?: Record<string, unknown>): void {\n if (level === 'debug' && !this.config.debug) {return;}\n\n this.logger[level](`[HistoricalMetrics] ${message}`, meta);\n }\n}\n","import { hostname } from 'node:os';\nimport {\n OBSERVABILITY_CONTRACT_VERSION,\n OBSERVABILITY_SCHEMA,\n CANONICAL_OBSERVABILITY_METRICS,\n type ObservabilityCheck,\n} from '@kb-labs/core-contracts';\nimport type {\n ServiceObservabilityDescribe,\n ServiceObservabilityHealth,\n ServiceOperationSample,\n} from '@kb-labs/core-contracts';\nimport {\n createServiceObservabilityDescribe,\n createServiceObservabilityHealth,\n} from '@kb-labs/shared-http';\nimport type { SystemHealthSnapshot } from '@kb-labs/core-registry';\nimport type { ReadinessState } from '../routes/readiness.js';\nimport { restDomainOperationMetrics, type MetricsSnapshot } from '../middleware/metrics.js';\nimport { getLatestSystemMetrics } from '../daemon/metrics/index.js';\n\ndeclare const __REST_API_VERSION__: string;\nconst REST_VERSION = typeof __REST_API_VERSION__ !== 'undefined' ? __REST_API_VERSION__ : '0.0.0';\n\nfunction resolveInstanceId(): string {\n return `${hostname()}:${process.pid}`;\n}\n\nfunction mergeTopOperations(\n httpOperations: ServiceOperationSample[],\n domainOperations: ServiceOperationSample[],\n limit = 5,\n): ServiceOperationSample[] {\n const merged = new Map<string, ServiceOperationSample>();\n\n for (const item of [...httpOperations, ...domainOperations]) {\n const existing = merged.get(item.operation);\n if (!existing) {\n merged.set(item.operation, { ...item });\n continue;\n }\n\n const count = (existing.count ?? 0) + (item.count ?? 0);\n const totalDurationMs =\n (existing.avgDurationMs ?? 0) * (existing.count ?? 0) +\n (item.avgDurationMs ?? 0) * (item.count ?? 0);\n\n merged.set(item.operation, {\n operation: item.operation,\n count,\n avgDurationMs: count > 0 ? totalDurationMs / count : 0,\n maxDurationMs: Math.max(existing.maxDurationMs ?? 0, item.maxDurationMs ?? 0),\n errorCount: (existing.errorCount ?? 0) + (item.errorCount ?? 0),\n });\n }\n\n const ranked = Array.from(merged.values())\n .sort((a, b) => (b.count ?? 0) - (a.count ?? 0) || (b.maxDurationMs ?? 0) - (a.maxDurationMs ?? 0))\n const sliced = ranked.slice(0, limit);\n\n if (domainOperations.length === 0 || sliced.some((item) => !item.operation.startsWith('http.'))) {\n return sliced;\n }\n\n const firstDomainOperation = ranked.find((item) => !item.operation.startsWith('http.'));\n if (!firstDomainOperation) {\n return sliced;\n }\n\n return [...sliced.slice(0, Math.max(0, limit - 1)), firstDomainOperation];\n}\n\nfunction finiteNumberOrUndefined(value: number | null | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nexport function buildRestObservabilityDescribe(basePath: string): ServiceObservabilityDescribe {\n return createServiceObservabilityDescribe({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'rest',\n instanceId: resolveInstanceId(),\n serviceType: 'http-api',\n version: REST_VERSION,\n environment: process.env.NODE_ENV ?? 'development',\n startedAt: new Date(Date.now() - process.uptime() * 1000).toISOString(),\n dependencies: [\n {\n serviceId: 'workflow',\n required: true,\n description: 'Workflow daemon for workflow and jobs APIs',\n },\n {\n serviceId: 'state-daemon',\n required: false,\n description: 'State broker and cache-backed storage',\n },\n ],\n metricsEndpoint: '/metrics',\n healthEndpoint: `${basePath}/observability/health`,\n logsSource: 'rest',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n metricFamilies: [...CANONICAL_OBSERVABILITY_METRICS],\n });\n}\n\nexport function buildRestObservabilityHealth(\n basePath: string,\n healthSnapshot: SystemHealthSnapshot,\n readiness: ReadinessState,\n metrics: MetricsSnapshot,\n): ServiceObservabilityHealth {\n const runtimeMetrics = getLatestSystemMetrics();\n const checks: ObservabilityCheck[] = [\n {\n id: 'registry',\n status: readiness.registryLoaded && !readiness.registryPartial && !readiness.registryStale\n ? 'ok'\n : readiness.registryLoaded ? 'warn' : 'error',\n message: readiness.registryLoaded ? 'Registry snapshot loaded' : 'Registry snapshot incomplete',\n },\n {\n id: 'plugin-routes',\n status: readiness.pluginRouteErrors > 0 ? 'warn' : readiness.pluginRoutesMounted ? 'ok' : 'warn',\n message: readiness.pluginRoutesMounted\n ? `${readiness.pluginRoutesCount} plugin routes mounted`\n : 'Plugin routes are still mounting',\n },\n {\n id: 'redis',\n status: !readiness.redisEnabled ? 'ok' : readiness.redisConnected ? 'ok' : 'warn',\n message: !readiness.redisEnabled\n ? 'Redis integration disabled'\n : readiness.redisConnected\n ? 'Redis healthy'\n : 'Redis unavailable',\n },\n ];\n\n const httpTopOperations = metrics.latency.histogram\n .slice()\n .sort((a, b) => b.count - a.count || b.max - a.max)\n .slice(0, 5)\n .map((entry) => ({\n operation: `http.${entry.route}`,\n count: entry.count,\n avgDurationMs: entry.count > 0 ? entry.total / entry.count : 0,\n maxDurationMs: entry.max,\n errorCount: Object.entries(entry.byStatus)\n .filter(([status]) => Number(status) >= 400)\n .reduce((sum, [, count]) => sum + count, 0),\n }));\n const topOperations = mergeTopOperations(httpTopOperations, restDomainOperationMetrics.getTopOperations(5));\n\n const latestOperation = topOperations[0];\n const state = healthSnapshot.status === 'healthy'\n ? 'active'\n : runtimeMetrics || latestOperation\n ? 'partial_observability'\n : 'insufficient_data';\n\n return createServiceObservabilityHealth({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'rest',\n instanceId: resolveInstanceId(),\n observedAt: healthSnapshot.ts,\n status: healthSnapshot.status === 'healthy' ? 'healthy' : healthSnapshot.status === 'degraded' ? 'degraded' : 'unhealthy',\n uptimeSec: healthSnapshot.uptimeSec,\n metricsEndpoint: '/metrics',\n logsSource: 'rest',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n checks,\n snapshot: {\n cpuPercent: finiteNumberOrUndefined(runtimeMetrics?.cpu.percentage),\n rssBytes: finiteNumberOrUndefined(runtimeMetrics?.memory.rss),\n heapUsedBytes: finiteNumberOrUndefined(runtimeMetrics?.memory.heapUsed),\n eventLoopLagMs: finiteNumberOrUndefined(runtimeMetrics?.eventLoopLagMs),\n activeOperations: runtimeMetrics?.activeOperations ?? metrics.requests.active,\n },\n topOperations,\n state,\n meta: {\n serviceHealthEndpoint: `${basePath}/health`,\n readyEndpoint: `${basePath}/ready`,\n runtimeMetricsCollectedAt: runtimeMetrics ? new Date(runtimeMetrics.timestamp).toISOString() : null,\n lastRequestAt: metrics.timestamps.lastRequest\n ? new Date(metrics.timestamps.lastRequest).toISOString()\n : null,\n },\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/health\n * Health check and diagnostics endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry, SystemHealthSnapshot } from '@kb-labs/core-registry';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport type { ReadinessState } from './readiness';\nimport { isReady, resolveReadinessReason } from './readiness';\nimport type { PluginsMetricsSnapshot } from '../middleware/metrics.js';\nimport { metricsCollector } from '../middleware/metrics.js';\nimport { updateServiceHealthStatus } from '../observability/prometheus-registry.js';\nimport {\n buildRestObservabilityDescribe,\n buildRestObservabilityHealth,\n} from '../observability/service-contract.js';\n\n// Version is injected at build time by tsup define\ndeclare const __REST_API_VERSION__: string;\nconst REST_VERSION = typeof __REST_API_VERSION__ !== 'undefined' ? __REST_API_VERSION__ : '0.0.0';\n\nconst CACHE_WINDOW_MS = 200;\nconst READY_SCHEMA = 'kb.ready/1';\n\ninterface CachedSnapshot {\n base: SystemHealthSnapshot;\n expiresAt: number;\n}\n\nlet cachedBaseSnapshot: CachedSnapshot | null = null;\nlet inFlightBaseSnapshot: Promise<SystemHealthSnapshot> | null = null;\n\n/**\n * Register health and readiness routes\n */\nexport async function registerHealthRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n _repoRoot: string,\n registry: IEntityRegistry,\n readiness: ReadinessState\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const healthPaths = resolvePaths(basePath, '/health');\n const readyPaths = resolvePaths(basePath, '/ready');\n const observabilityDescribePaths = resolvePaths(basePath, '/observability/describe');\n const observabilityHealthPaths = resolvePaths(basePath, '/observability/health');\n\n for (const path of healthPaths) {\n fastify.get(path, async (_request, reply) => {\n const eventHub = fastify.kbEventHub;\n try {\n const baseSnapshot = await getBaseSnapshot(registry);\n const { registryLoaded, registryPartial, registryStale } = evaluateRegistryState(registry);\n readiness.registryLoaded = registryLoaded;\n readiness.registryPartial = registryPartial;\n readiness.registryStale = registryStale;\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n const pluginsMetrics = metricsCollector.getLastPluginMountSnapshot();\n const response = augmentSnapshot(baseSnapshot, readiness, pluginsMetrics);\n updateServiceHealthStatus(\n response.status === 'healthy' ? 'healthy' : response.status === 'degraded' ? 'degraded' : 'unhealthy',\n );\n eventHub?.publish({\n type: 'health',\n status: response.status,\n ts: response.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n });\n return reply.send(response);\n } catch (error) {\n const fallback = buildFallbackSnapshot(error, readiness);\n updateServiceHealthStatus('degraded');\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n eventHub?.publish({\n type: 'health',\n status: fallback.status,\n ts: fallback.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n });\n return reply.send(fallback);\n }\n });\n }\n\n for (const path of readyPaths) {\n fastify.get(path, async (_request, reply) => {\n const eventHub = fastify.kbEventHub;\n const { registryLoaded, registryPartial, registryStale } = evaluateRegistryState(registry);\n readiness.registryLoaded = registryLoaded;\n readiness.registryPartial = registryPartial;\n readiness.registryStale = registryStale;\n\n const response = buildReadinessResponse(readiness);\n const statusCode = response.ready ? 200 : 503;\n updateServiceHealthStatus(response.ready ? 'healthy' : 'degraded');\n\n eventHub?.publish({\n type: 'health',\n status: response.ready ? 'healthy' : 'degraded',\n ts: new Date().toISOString(),\n ready: response.ready,\n reason: response.reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n lastPluginMountTs: readiness.lastPluginMountTs,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs,\n pluginsMounted: metricsCollector.getLastPluginMountSnapshot()?.succeeded ?? 0,\n pluginsFailed: metricsCollector.getLastPluginMountSnapshot()?.failed ?? 0,\n });\n\n return reply.code(statusCode).send(response);\n });\n }\n\n for (const path of observabilityDescribePaths) {\n fastify.get(path, async () => buildRestObservabilityDescribe(basePath));\n }\n\n for (const path of observabilityHealthPaths) {\n fastify.get(path, async () => {\n try {\n const baseSnapshot = await getBaseSnapshot(registry);\n const pluginsMetrics = metricsCollector.getLastPluginMountSnapshot();\n const augmented = augmentSnapshot(baseSnapshot, readiness, pluginsMetrics);\n updateServiceHealthStatus(\n augmented.status === 'healthy' ? 'healthy' : augmented.status === 'degraded' ? 'degraded' : 'unhealthy',\n );\n return buildRestObservabilityHealth(basePath, augmented, readiness, metricsCollector.getMetrics());\n } catch (error) {\n const fallback = buildFallbackSnapshot(error, readiness);\n updateServiceHealthStatus('degraded');\n return buildRestObservabilityHealth(basePath, fallback, readiness, metricsCollector.getMetrics());\n }\n });\n }\n}\n\nasync function getBaseSnapshot(registry: IEntityRegistry): Promise<SystemHealthSnapshot> {\n const now = Date.now();\n if (cachedBaseSnapshot && now < cachedBaseSnapshot.expiresAt) {\n return cachedBaseSnapshot.base;\n }\n\n if (inFlightBaseSnapshot) {\n return inFlightBaseSnapshot;\n }\n\n inFlightBaseSnapshot = registry\n .getSystemHealth({\n uptimeSec: process.uptime(),\n version: { rest: REST_VERSION },\n })\n .then(snapshot => {\n cachedBaseSnapshot = {\n base: snapshot,\n expiresAt: Date.now() + CACHE_WINDOW_MS,\n };\n inFlightBaseSnapshot = null;\n return snapshot;\n })\n .catch(error => {\n inFlightBaseSnapshot = null;\n throw error;\n });\n\n return inFlightBaseSnapshot;\n}\n\nfunction augmentSnapshot(\n base: SystemHealthSnapshot,\n readiness: ReadinessState,\n pluginsMetrics?: PluginsMetricsSnapshot | null\n): SystemHealthSnapshot {\n const snapshot = cloneSnapshot(base);\n const failures = new Map(readiness.pluginRouteFailures.map(f => [f.id, f.error]));\n\n const components = snapshot.components.map(component => {\n const failure = failures.get(component.id);\n return failure\n ? {\n ...component,\n lastError: failure,\n }\n : component;\n });\n\n const readinessMeta = {\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesCount: readiness.pluginRoutesCount,\n pluginRouteErrors: readiness.pluginRouteErrors,\n pluginRouteFailures: readiness.pluginRouteFailures,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n pluginMounts: pluginsMetrics ?? null,\n lastPluginMountTs: readiness.lastPluginMountTs ?? null,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n redisEnabled: readiness.redisEnabled,\n redisConnected: readiness.redisConnected,\n redisStates: readiness.redisStates,\n };\n\n const meta: Record<string, unknown> = {\n source: 'rest',\n ...(snapshot.meta || {}),\n readiness: readinessMeta,\n };\n\n if (readiness.pluginRouteFailures.length > 0) {\n meta.readinessFailures = readiness.pluginRouteFailures;\n }\n\n const hasReadinessErrors = readiness.pluginRouteErrors > 0 || readiness.pluginRouteFailures.length > 0;\n\n return {\n ...snapshot,\n status: hasReadinessErrors ? 'degraded' : snapshot.status,\n components,\n meta,\n };\n}\n\nfunction buildFallbackSnapshot(\n error: unknown,\n readiness: ReadinessState\n): SystemHealthSnapshot {\n const message = sanitizeError(error);\n const now = new Date();\n\n const snapshot: SystemHealthSnapshot = {\n schema: 'kb.health/1',\n ts: now.toISOString(),\n uptimeSec: Math.max(0, Math.floor(process.uptime())),\n version: {\n kbLabs: process.env.KB_LABS_VERSION || process.env.KB_VERSION || 'unknown',\n rest: REST_VERSION,\n },\n registry: {\n total: 0,\n withRest: 0,\n withStudio: 0,\n errors: 1,\n generatedAt: new Date(0).toISOString(),\n expiresAt: undefined,\n partial: true,\n stale: true,\n },\n status: 'degraded',\n components: [],\n meta: {\n source: 'rest',\n error: message,\n },\n };\n\n return augmentSnapshot(snapshot, readiness, metricsCollector.getLastPluginMountSnapshot());\n}\n\nfunction cloneSnapshot(base: SystemHealthSnapshot): SystemHealthSnapshot {\n return {\n schema: base.schema,\n ts: base.ts,\n uptimeSec: base.uptimeSec,\n version: { ...base.version },\n registry: { ...base.registry },\n status: base.status,\n components: base.components.map(component => ({ ...component })),\n ...(base.meta ? { meta: { ...base.meta } } : {}),\n };\n}\n\nfunction sanitizeError(error: unknown): string {\n if (!error) {\n return 'unknown_error';\n }\n const message = error instanceof Error ? error.message : String(error);\n const firstLine = message.trim().split('\\n')[0] ?? message.trim();\n return firstLine.length > 160 ? `${firstLine.slice(0, 157)}...` : firstLine;\n}\n\nfunction evaluateRegistryState(registry: IEntityRegistry): {\n registryLoaded: boolean;\n registryPartial: boolean;\n registryStale: boolean;\n} {\n const snapshot = registry.snapshot();\n return {\n registryLoaded: snapshot.plugins.length > 0 && !snapshot.partial && !snapshot.stale,\n registryPartial: snapshot.partial,\n registryStale: snapshot.stale,\n };\n}\n\nfunction buildReadinessResponse(readiness: ReadinessState) {\n const ready = isReady(readiness);\n const pluginIssues =\n readiness.pluginRouteErrors > 0 || readiness.pluginRouteFailures.length > 0;\n const status = ready ? (pluginIssues ? 'degraded' : 'ready') : 'initializing';\n const reason = ready ? 'ready' : resolveReadinessReason(readiness);\n\n return {\n schema: READY_SCHEMA,\n ts: new Date().toISOString(),\n ready,\n status,\n reason,\n components: {\n cliApi: {\n initialized: readiness.cliApiInitialized,\n },\n registry: {\n loaded: readiness.registryLoaded,\n partial: readiness.registryPartial,\n stale: readiness.registryStale,\n },\n plugins: {\n mounted: readiness.pluginRoutesMounted,\n inProgress: readiness.pluginMountInProgress,\n routeCount: readiness.pluginRoutesCount,\n errors: readiness.pluginRouteErrors,\n failures: readiness.pluginRouteFailures,\n lastCompletedAt: readiness.lastPluginMountTs ?? null,\n lastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n },\n redis: {\n enabled: readiness.redisEnabled,\n healthy: readiness.redisConnected,\n states: readiness.redisStates,\n },\n },\n };\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/openapi\n * OpenAPI specification endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { mergeOpenAPISpecs, type OpenAPISpec } from '@kb-labs/core-registry';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n/**\n * Register OpenAPI routes\n */\nexport async function registerOpenAPIRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry\n) {\n // Plugin-manifest-merged OpenAPI spec (renamed from /openapi.json).\n // /openapi.json is now owned by @fastify/swagger (Fastify-native routes).\n // This endpoint aggregates specs from plugin manifests only.\n fastify.get('/openapi-plugins.json', {\n schema: {\n hide: true,\n },\n config: {\n rateLimit: {\n max: 10, // 10 requests\n timeWindow: '1 minute',\n },\n },\n }, async (_, reply) => {\n try {\n const plugins = await restDomainOperationMetrics.observeOperation('plugin.registry.list', async () =>\n registry.listPlugins(),\n );\n const specs: OpenAPISpec[] = [];\n \n for (const plugin of plugins) {\n const spec = await restDomainOperationMetrics.observeOperation('openapi.plugin.get', async () =>\n registry.getOpenAPISpec(plugin.id),\n );\n if (spec) {\n specs.push(spec);\n }\n }\n \n const merged = await restDomainOperationMetrics.observeOperation('openapi.plugins.aggregate', async () =>\n mergeOpenAPISpecs(specs),\n );\n \n // Add caching headers (1 hour)\n const snapshot = registry.snapshot();\n reply.header('Cache-Control', 'public, max-age=3600');\n reply.header('ETag', `\"${snapshot.rev}\"`);\n \n reply.send(merged);\n } catch (error) {\n reply.code(500).send({\n ok: false,\n error: {\n code: 'OPENAPI_GENERATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n });\n\n // Per-plugin OpenAPI spec\n fastify.get('/openapi/:pluginId', async (req, reply) => {\n try {\n const { pluginId } = req.params as { pluginId: string };\n const spec = await restDomainOperationMetrics.observeOperation('openapi.plugin.get', async () =>\n registry.getOpenAPISpec(pluginId),\n );\n \n if (!spec) {\n reply.code(404).send({\n ok: false,\n error: {\n code: 'PLUGIN_NOT_FOUND',\n message: `Plugin ${pluginId} not found`,\n },\n });\n return;\n }\n\n reply.send(spec);\n } catch (error) {\n reply.code(500).send({\n ok: false,\n error: {\n code: 'OPENAPI_GENERATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/diagnostics/header-debug\n * In-memory buffer for recent header policy decisions (debug & dry-run).\n */\n\nexport interface HeaderDebugEntry {\n timestamp: number;\n requestId: string;\n pluginId?: string;\n routeId?: string;\n direction: 'inbound' | 'outbound';\n header: string;\n allowed?: boolean;\n reason?: string;\n action?: string;\n dryRun: boolean;\n}\n\nconst MAX_ENTRIES = 200;\nconst buffer: HeaderDebugEntry[] = [];\n\nexport function recordHeaderDebug(entry: HeaderDebugEntry): void {\n buffer.push(entry);\n if (buffer.length > MAX_ENTRIES) {\n buffer.splice(0, buffer.length - MAX_ENTRIES);\n }\n}\n\nexport function getHeaderDebugEntries(limit = 50): HeaderDebugEntry[] {\n if (buffer.length === 0) {\n return [];\n }\n const clamped = Math.max(1, Math.min(limit, MAX_ENTRIES));\n return buffer.slice(-clamped).reverse();\n}\n\n\n","/**\n * @module @kb-labs/rest-api-app/routes/metrics\n * Metrics endpoint\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { metricsCollector, restDomainOperationMetrics } from '../middleware/metrics.js';\nimport { getHeaderDebugEntries } from '../diagnostics/header-debug';\nimport { getPrometheusMetrics, updateProcessUptime } from '../observability/prometheus-registry';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\n\nfunction formatNumber(value: number, fractionDigits = 2): string {\n return Number.isFinite(value) ? value.toFixed(fractionDigits) : '0';\n}\n\n/**\n * Register metrics routes\n */\nexport function registerMetricsRoutes(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n const basePath = normalizeBasePath(config.basePath);\n const metricsPaths = resolvePaths(basePath, '/metrics');\n\n // GET /metrics (Prometheus format with real p50/p95/p99)\n const handler = async (_request: FastifyRequest, reply: FastifyReply) => {\n const metrics = metricsCollector.getMetrics();\n\n // Update process uptime before generating metrics\n updateProcessUptime(metrics.timestamps.startTime);\n\n // Get prom-client metrics (includes histogram with real percentiles)\n const promMetrics = await getPrometheusMetrics();\n\n // Append custom metrics not covered by prom-client\n const customLines: string[] = [];\n\n // Route-specific metrics (budget tracking)\n for (const entry of metrics.latency.histogram) {\n if (entry.budgetMs !== null) {\n const routeLabels = [`route=\"${entry.route}\"`];\n if (entry.pluginId) {\n routeLabels.push(`plugin=\"${entry.pluginId}\"`);\n }\n const labelString = routeLabels.join(',');\n customLines.push(`# HELP http_request_route_budget_ms Route performance budget in milliseconds`);\n customLines.push(`# TYPE http_request_route_budget_ms gauge`);\n customLines.push(`http_request_route_budget_ms{${labelString}} ${formatNumber(entry.budgetMs)}`);\n }\n }\n\n // Plugin mount snapshot\n const pluginSnapshot = metricsCollector.getLastPluginMountSnapshot();\n if (pluginSnapshot) {\n customLines.push(`# HELP kb_plugins_mount_total Plugins processed during last mount run`);\n customLines.push(`# TYPE kb_plugins_mount_total gauge`);\n customLines.push(`kb_plugins_mount_total ${pluginSnapshot.total}`);\n customLines.push(`kb_plugins_mount_succeeded ${pluginSnapshot.succeeded}`);\n customLines.push(`kb_plugins_mount_failed ${pluginSnapshot.failed}`);\n customLines.push(`kb_plugins_mount_elapsed_ms ${formatNumber(pluginSnapshot.elapsedMs)}`);\n }\n\n customLines.push(...restDomainOperationMetrics.getMetricLines());\n\n // Redis metrics (not in prom-client)\n customLines.push(`# HELP kb_redis_status_updates_total Redis status updates observed`);\n customLines.push(`# TYPE kb_redis_status_updates_total counter`);\n customLines.push(`kb_redis_status_updates_total ${metrics.redis.updates}`);\n\n customLines.push(`# HELP kb_redis_status_transitions_total Redis health transitions`);\n customLines.push(`# TYPE kb_redis_status_transitions_total counter`);\n customLines.push(`kb_redis_status_transitions_total{state=\"healthy\"} ${metrics.redis.healthyTransitions}`);\n customLines.push(`kb_redis_status_transitions_total{state=\"unhealthy\"} ${metrics.redis.unhealthyTransitions}`);\n\n if (metrics.redis.lastStatus) {\n const healthyValue = metrics.redis.lastStatus.healthy ? 1 : 0;\n customLines.push(`# HELP kb_redis_healthy Redis healthy flag (1 = healthy)`);\n customLines.push(`# TYPE kb_redis_healthy gauge`);\n customLines.push(`kb_redis_healthy ${healthyValue}`);\n\n for (const roleEntry of metrics.redis.roleStates) {\n for (const stateEntry of roleEntry.states) {\n const safeState = stateEntry.state.replace(/\"/g, '\\\\\"');\n customLines.push(\n `kb_redis_role_state_total{role=\"${roleEntry.role}\",state=\"${safeState}\"} ${stateEntry.count}`,\n );\n }\n }\n }\n\n // Combine prom-client metrics with custom metrics\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return promMetrics + '\\n' + customLines.join('\\n');\n };\n for (const path of metricsPaths) {\n server.get(path, handler);\n }\n\n server.get(`${basePath}/metrics/headers/debug`, {\n schema: {\n querystring: {\n type: 'object',\n properties: {\n limit: { type: 'integer', minimum: 1, maximum: 200 },\n },\n },\n response: {\n 200: {\n type: 'object',\n properties: {\n entries: { type: 'array' },\n },\n },\n },\n },\n }, async (request) => {\n const query = request.query as { limit?: number };\n const limit = typeof query?.limit === 'number' ? query.limit : 50;\n return {\n entries: getHeaderDebugEntries(limit),\n };\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/plugins\n * Plugin routes registration\n *\n * Uses @kb-labs/plugin-execution for unified execution layer.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry, RegistrySnapshot } from '@kb-labs/core-registry';\nimport type { ManifestV3 } from '@kb-labs/plugin-contracts';\nimport { validateManifest } from '@kb-labs/plugin-contracts';\nimport { mountRoutes } from '@kb-labs/plugin-execution/http';\nimport { mountWebSocketChannels } from '@kb-labs/plugin-execution';\nimport { InProcessBackend } from '@kb-labs/plugin-execution-factory';\nimport { combineManifestsToRegistry } from '@kb-labs/rest-api-core';\nimport { platform } from '@kb-labs/core-runtime';\nimport {\n logDiagnosticEvent,\n type DiagnosticLogLevel,\n} from '@kb-labs/core-platform';\nimport type { DiagnosticReasonCode } from '@kb-labs/core-contracts';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport type { ReadinessState } from './readiness';\nimport { resolveWorkspaceRoot } from '@kb-labs/core-workspace';\nimport { metricsCollector, restDomainOperationMetrics } from '../middleware/metrics.js';\nimport { performance } from 'node:perf_hooks';\n\ninterface SnapshotManifestEntry {\n pluginId: string;\n manifest: ManifestV3;\n pluginRoot: string;\n}\n\nfunction extractSnapshotManifests(snapshot: RegistrySnapshot): SnapshotManifestEntry[] {\n return (snapshot.manifests || []).map(entry => ({\n pluginId: entry.pluginId,\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n }));\n}\n\n/**\n * Register plugin routes\n */\nexport async function registerPluginRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry,\n readiness?: ReadinessState\n): Promise<void> {\n const gatewayTimeoutMs = config.timeouts?.requestTimeout ?? 30_000;\n // Stats aggregated from sequential mount results\n const stats = {\n mountedRoutes: 0,\n mountedChannels: 0,\n errors: 0,\n };\n\n if (readiness) {\n readiness.pluginRoutesMounted = false;\n readiness.pluginMountInProgress = true;\n readiness.pluginRoutesCount = 0;\n readiness.pluginRouteErrors = 0;\n readiness.pluginRouteFailures = [];\n readiness.pluginRoutesLastDurationMs = null;\n }\n\n metricsCollector.resetPluginRouteBudgets();\n\n const mountMetrics = metricsCollector.beginPluginMount();\n const mountStart = performance.now();\n\n try {\n const workspaceResolution = await resolveWorkspaceRoot({\n startDir: repoRoot,\n env: {\n // KB_PROJECT_ROOT is the canonical var injected by kb-dev into service processes.\n // Must be included here: passing a partial env object would silently drop it, causing\n // ctx.cwd to fall back to the platform dir (kb-platform333) instead of the user's\n // project dir when services are started via kb-dev start.\n KB_PROJECT_ROOT: process.env.KB_PROJECT_ROOT,\n KB_LABS_WORKSPACE_ROOT: process.env.KB_LABS_WORKSPACE_ROOT,\n KB_LABS_REPO_ROOT: process.env.KB_LABS_REPO_ROOT,\n },\n });\n const workspaceRoot = workspaceResolution.rootDir;\n platform.logger.info('Resolved workspace root', {\n repoRoot,\n workspaceRoot,\n source: workspaceResolution.source,\n });\n\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n\n // Log discovery summary\n platform.logger.info('Plugin discovery summary', {\n totalManifests: manifests.length,\n rev: snapshot.rev,\n partial: snapshot.partial,\n stale: snapshot.stale,\n plugins: manifests.map(e => ({\n id: e.manifest.id,\n restRoutes: e.manifest.rest?.routes?.length ?? 0,\n wsChannels: e.manifest.ws?.channels?.length ?? 0,\n })),\n });\n\n if (snapshot.partial || snapshot.stale) {\n if (snapshot.partial) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'plugin.registry.snapshot',\n level: 'warn',\n reasonCode: 'snapshot_partial',\n message: 'Registry snapshot is partial',\n outcome: 'failed',\n serviceId: 'rest',\n evidence: {\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n },\n });\n }\n\n if (snapshot.stale) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'plugin.registry.snapshot',\n level: 'warn',\n reasonCode: 'snapshot_stale',\n message: 'Registry snapshot is stale',\n outcome: 'failed',\n serviceId: 'rest',\n evidence: {\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n expiresAt: snapshot.expiresAt,\n },\n });\n }\n }\n\n emitRegistrySnapshotDiagnostics(snapshot);\n\n // Use platform's unified ExecutionBackend (initialized in bootstrap.ts)\n const backend = platform.executionBackend;\n // WS channels must always run in-process: the WSSender holds closures over\n // the live ws socket and connectionRegistry — both bound to this host.\n // Worker-pool serialization strips its methods (close/getConnectionId\n // become undefined in the worker), so defineWebSocket's createTypedSender\n // crashes with \"Cannot read properties of undefined (reading 'bind')\".\n const wsBackend = new InProcessBackend({ platform });\n\n // Filter plugins that have routes or channels to mount\n const mountableManifests = manifests\n .filter(entry =>\n (entry.manifest.rest?.routes && entry.manifest.rest.routes.length > 0) ||\n (entry.manifest.ws?.channels && entry.manifest.ws.channels.length > 0)\n );\n\n platform.logger.info('Plugins selected for route mounting', {\n mountable: mountableManifests.length,\n skipped: manifests.length - mountableManifests.length,\n mountablePlugins: mountableManifests.map(e => e.manifest.id),\n });\n\n // ── Phase 1: Batch-validate all handler files in one I/O pass ──\n // Collect all handler file paths across all plugins, then validate in a single Promise.all()\n // This avoids interleaved fs.access() calls that caused race conditions with parallel mounting.\n //\n // Handler paths in manifests are relative to the plugin's dist/ directory, because manifests\n // are loaded from dist/manifest.js. pluginRoot points to the package root, so we resolve\n // handlers relative to pluginRoot/dist/ to match where the compiled files actually live.\n const handlerChecks: Array<{ key: string; filePath: string }> = [];\n for (const entry of mountableManifests) {\n if (entry.manifest.rest?.routes) {\n for (const route of entry.manifest.rest.routes) {\n const handlerFile = route.handler.split('#')[0];\n if (handlerFile) {\n const pluginDistRoot = path.join(entry.pluginRoot, 'dist');\n const handlerPath = path.resolve(pluginDistRoot, handlerFile);\n handlerChecks.push({\n key: `${entry.manifest.id}::${route.method} ${route.path}`,\n filePath: handlerPath,\n });\n }\n }\n }\n }\n\n const handlerAccessResults = await Promise.all(\n handlerChecks.map(async (check) => {\n try {\n await fs.access(check.filePath);\n return { key: check.key, filePath: check.filePath, exists: true };\n } catch {\n return { key: check.key, filePath: check.filePath, exists: false };\n }\n })\n );\n\n // Build lookup: \"pluginId::METHOD /path\" → { exists, filePath }\n const handlerExistsMap = new Map<string, { exists: boolean; filePath: string }>();\n for (const result of handlerAccessResults) {\n handlerExistsMap.set(result.key, { exists: result.exists, filePath: result.filePath });\n }\n\n platform.logger.debug('Batch handler file validation completed', {\n totalHandlers: handlerChecks.length,\n validHandlers: handlerAccessResults.filter(r => r.exists).length,\n invalidHandlers: handlerAccessResults.filter(r => !r.exists).length,\n });\n\n // ── Phase 2: Sequential plugin mounting ──\n // Routes are registered in-memory on Fastify (~0.1ms per route).\n // Sequential mounting eliminates race conditions with zero performance cost.\n let mountedRoutes = 0;\n let mountedChannels = 0;\n let errors = 0;\n const succeeded: string[] = [];\n const failed: string[] = [];\n const routeFailures: Array<{ id: string; error: string }> = [];\n\n for (const entry of mountableManifests) {\n const { manifest, pluginRoot } = entry;\n const pluginDistRoot = path.join(pluginRoot, 'dist');\n\n // Validate routes using pre-built handler map (no I/O here)\n const restValidationErrors: string[] = [];\n if (manifest.rest?.routes) {\n for (const route of manifest.rest.routes) {\n const handlerFile = route.handler.split('#')[0];\n if (!handlerFile) {\n restValidationErrors.push(\n `Route ${route.method} ${route.path}: Invalid handler reference \"${route.handler}\"`\n );\n continue;\n }\n const lookupKey = `${manifest.id}::${route.method} ${route.path}`;\n const check = handlerExistsMap.get(lookupKey);\n if (check && !check.exists) {\n restValidationErrors.push(\n `Route ${route.method} ${route.path}: Handler file not found: ${check.filePath}`\n );\n }\n }\n }\n\n if (restValidationErrors.length > 0) {\n const reasonCode = inferRouteValidationReasonCode(restValidationErrors);\n logDiagnosticEvent(platform.logger, {\n event: 'plugin.routes.validation',\n level: resolveRouteValidationLogLevel(restValidationErrors, manifest.rest?.routes?.length ?? 0),\n reasonCode,\n message: 'Plugin route validation failed',\n outcome: 'failed',\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: 'rest',\n issues: restValidationErrors,\n remediation: 'Verify handler file paths, exports, and route schema.',\n evidence: {\n pluginRoot,\n totalRoutes: manifest.rest?.routes?.length ?? 0,\n },\n });\n\n platform.logger.warn('REST validation errors found, will skip problematic routes but continue mounting others', {\n plugin: `${manifest.id}@${manifest.version}`,\n pluginRoot,\n remediation: 'Verify REST handler file and export exist',\n errors: restValidationErrors,\n });\n\n const errorPaths = new Set(restValidationErrors.map((error) => {\n const match = error.match(/Route\\s+(\\w+)\\s+([^\\s:]+)/);\n return match ? `${match[1]} ${match[2]}` : null;\n }).filter(Boolean));\n\n const validRoutes = manifest.rest!.routes!.filter((route) => {\n const routeKey = `${route.method} ${route.path}`;\n return !errorPaths.has(routeKey);\n });\n\n if (validRoutes.length === 0) {\n restDomainOperationMetrics.recordOperation('plugin.routes.mount', 0, 'error');\n logDiagnosticEvent(platform.logger, {\n event: 'plugin.routes.validation',\n level: 'error',\n reasonCode,\n message: 'All plugin routes failed validation; skipping plugin',\n outcome: 'failed',\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: 'rest',\n issues: restValidationErrors,\n evidence: {\n pluginRoot,\n },\n });\n errors += 1;\n failed.push(manifest.id);\n routeFailures.push({\n id: manifest.id,\n error: summarizeValidationErrors(restValidationErrors),\n });\n continue;\n }\n\n manifest.rest!.routes = validRoutes;\n platform.logger.info('Filtered routes, mounting valid ones', {\n plugin: `${manifest.id}@${manifest.version}`,\n totalRoutes: manifest.rest!.routes.length + restValidationErrors.length,\n validRoutes: validRoutes.length,\n skippedRoutes: restValidationErrors.length,\n });\n }\n\n try {\n const start = performance.now();\n\n let pluginBasePath: string;\n if (manifest.rest?.basePath) {\n if (manifest.rest.basePath.startsWith('/api/')) {\n pluginBasePath = manifest.rest.basePath;\n } else if (manifest.rest.basePath.startsWith('/v1/')) {\n pluginBasePath = manifest.rest.basePath.replace(/^\\/v1/, config.basePath);\n } else {\n pluginBasePath = `${config.basePath}${manifest.rest.basePath}`;\n }\n } else {\n pluginBasePath = `${config.basePath}/plugins/${manifest.id}`;\n }\n\n platform.logger.info('Mounting plugin routes', {\n plugin: `${manifest.id}@${manifest.version}`,\n configBasePath: config.basePath,\n manifestBasePath: manifest.rest?.basePath,\n pluginBasePath,\n pluginRoot,\n routes: manifest.rest?.routes?.length ?? 0,\n });\n\n await mountRoutes(server, manifest, {\n backend,\n pluginRoot: pluginDistRoot,\n workspaceRoot,\n basePath: pluginBasePath,\n defaultTimeoutMs: gatewayTimeoutMs,\n });\n\n const duration = performance.now() - start;\n const routesCount = manifest.rest?.routes?.length ?? 0;\n\n for (const route of manifest.rest?.routes ?? []) {\n metricsCollector.registerRouteBudget(\n route.method,\n `${pluginBasePath}${route.path}`,\n route.timeoutMs ?? gatewayTimeoutMs,\n manifest.id\n );\n }\n\n mountMetrics.recordSuccess(manifest.id, routesCount, duration);\n restDomainOperationMetrics.recordOperation('plugin.routes.mount', duration, 'ok');\n\n for (const route of manifest.rest?.routes ?? []) {\n platform.logger.info('Mounted route', {\n plugin: manifest.id,\n method: route.method,\n path: `${pluginBasePath}${route.path}`,\n handler: route.handler,\n });\n }\n\n platform.logger.info('Successfully mounted plugin routes', {\n plugin: `${manifest.id}@${manifest.version}`,\n pluginBasePath,\n routesCount,\n durationMs: Number(duration.toFixed(2)),\n });\n\n // Mount WebSocket channels if present\n let channelsCount = 0;\n if (manifest.ws?.channels && manifest.ws.channels.length > 0) {\n try {\n const wsStart = performance.now();\n let wsBasePath: string = manifest.ws.basePath || `/v1/ws/plugins/${manifest.id}`;\n // Normalize: /v1/ → config.basePath (same as REST routes) so gateway\n // can proxy both HTTP and WS under the same /api/v1 prefix.\n if (wsBasePath.startsWith('/v1/')) {\n wsBasePath = wsBasePath.replace(/^\\/v1/, config.basePath);\n }\n\n platform.logger.info('Mounting WebSocket channels', {\n plugin: `${manifest.id}@${manifest.version}`,\n wsBasePath,\n channels: manifest.ws.channels.length,\n });\n\n const wsResult = await mountWebSocketChannels(server, manifest, {\n backend: wsBackend,\n pluginRoot: pluginDistRoot,\n workspaceRoot,\n basePath: wsBasePath,\n defaultTimeoutMs: manifest.ws.defaults?.timeoutMs ?? gatewayTimeoutMs,\n defaultMaxMessageSize: manifest.ws.defaults?.maxMessageSize,\n });\n\n const wsDuration = performance.now() - wsStart;\n channelsCount = wsResult.mounted;\n\n if (wsResult.mounted > 0) {\n platform.logger.info('Successfully mounted WebSocket channels', {\n plugin: `${manifest.id}@${manifest.version}`,\n channels: wsResult.mounted,\n durationMs: Number(wsDuration.toFixed(2)),\n });\n }\n\n if (wsResult.errors.length > 0) {\n platform.logger.warn('WebSocket channel mounting had errors', {\n plugin: `${manifest.id}@${manifest.version}`,\n errors: wsResult.errors,\n });\n }\n } catch (wsError) {\n logDiagnosticEvent(platform.logger, {\n event: 'plugin.ws.mount',\n level: 'error',\n reasonCode: 'ws_mount_failed',\n message: 'Failed to mount plugin WebSocket channels',\n outcome: 'failed',\n error: wsError instanceof Error ? wsError : new Error(String(wsError)),\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: 'rest',\n });\n platform.logger.error(\n 'Failed to mount WebSocket channels',\n wsError instanceof Error ? wsError : new Error(String(wsError)),\n { plugin: manifest.id }\n );\n }\n }\n\n mountedRoutes += routesCount;\n mountedChannels += channelsCount;\n succeeded.push(manifest.id);\n } catch (error) {\n mountMetrics.recordFailure(manifest.id, shortErrorMessage(error));\n restDomainOperationMetrics.recordOperation('plugin.routes.mount', 0, 'error');\n logDiagnosticEvent(platform.logger, {\n event: 'plugin.routes.mount',\n level: 'error',\n reasonCode: 'route_mount_failed',\n message: 'Failed to mount plugin routes',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: 'rest',\n });\n platform.logger.error(\n 'Failed to mount plugin routes',\n error instanceof Error ? error : new Error(String(error)),\n { plugin: manifest.id }\n );\n errors += 1;\n failed.push(manifest.id);\n routeFailures.push({\n id: manifest.id,\n error: `rest_mount_failed ${shortErrorMessage(error)}`,\n });\n }\n }\n\n // Update stats and readiness\n stats.mountedRoutes = mountedRoutes;\n stats.mountedChannels = mountedChannels;\n stats.errors = errors;\n if (readiness) {\n readiness.pluginRouteFailures = routeFailures;\n }\n\n // Log summary\n platform.logger.info('Sequential plugin route and WebSocket channel mounting completed', {\n total: mountableManifests.length,\n succeeded: succeeded.length,\n failed: failed.length,\n mountedRoutes,\n mountedChannels,\n errors,\n });\n } catch (error) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'plugin.discovery',\n level: 'error',\n reasonCode: 'plugin_discovery_failed',\n message: 'Plugin discovery failed during route registration',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'rest',\n });\n platform.logger.error(\n 'Plugin discovery failed',\n error instanceof Error ? error : new Error(String(error))\n );\n stats.errors += 1;\n if (readiness) {\n readiness.pluginRoutesCount = stats.mountedRoutes;\n readiness.pluginRouteErrors = stats.errors;\n readiness.pluginRoutesMounted = false;\n readiness.pluginMountInProgress = false;\n readiness.pluginRoutesLastDurationMs = null;\n readiness.pluginRouteFailures.push({\n id: 'discovery',\n error: `rest_discovery_failed ${shortErrorMessage(error)}`,\n });\n }\n metricsCollector.completePluginMount(platform.logger as unknown as { info: (...args: unknown[]) => void; warn: (...args: unknown[]) => void });\n return;\n }\n\n if (readiness) {\n readiness.pluginRoutesCount = stats.mountedRoutes;\n readiness.pluginRouteErrors = stats.errors;\n readiness.pluginRoutesMounted = stats.errors === 0;\n readiness.pluginMountInProgress = false;\n readiness.lastPluginMountTs = new Date().toISOString();\n readiness.pluginRoutesLastDurationMs = Number(\n (performance.now() - mountStart).toFixed(2)\n );\n }\n\n metricsCollector.completePluginMount(platform.logger as unknown as { info: (...args: unknown[]) => void; warn: (...args: unknown[]) => void });\n}\n\n/**\n * Register plugin snapshot endpoints for Studio\n */\nexport async function registerPluginSnapshotRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n registry: IEntityRegistry\n): Promise<void> {\n const basePath = config.basePath;\n\n server.post(`${basePath}/plugins/refresh`, async (_request, reply) => {\n try {\n await restDomainOperationMetrics.observeOperation('plugin.registry.refresh', async () => {\n await registry.refresh();\n });\n const snapshot = await restDomainOperationMetrics.observeOperation('plugin.registry.snapshot', async () =>\n registry.snapshot(),\n );\n emitRegistrySnapshotDiagnostics(snapshot);\n\n reply.type('application/json');\n return {\n ok: true,\n data: {\n rev: snapshot.rev,\n total: snapshot.plugins.length,\n generatedAt: snapshot.generatedAt,\n partial: snapshot.partial,\n stale: snapshot.stale,\n },\n };\n } catch (error) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'plugin.registry.refresh',\n level: 'error',\n reasonCode: 'registry_refresh_failed',\n message: 'Failed to refresh plugin registry',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'rest',\n });\n platform.logger.error(\n 'Failed to refresh plugin registry',\n error instanceof Error ? error : new Error(String(error))\n );\n reply.code(500).send({\n ok: false,\n error: 'Failed to refresh plugin registry',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Raw manifests endpoint for Studio/debug consumers\n server.get(`${basePath}/plugins/registry`, async (_request, reply) => {\n try {\n const snapshot = await restDomainOperationMetrics.observeOperation('plugin.registry.snapshot', async () =>\n registry.snapshot(),\n );\n\n // Get build timestamps and validate manifests\n const manifestsWithTimestamps = await Promise.all(\n snapshot.manifests.map(async (entry) => {\n let buildTimestamp: string | undefined;\n try {\n const distPath = path.join(entry.pluginRoot, 'dist');\n const stats = await fs.stat(distPath);\n buildTimestamp = stats.mtime.toISOString();\n } catch {\n // dist/ doesn't exist or not accessible, skip\n }\n\n // Validate manifest structure\n const validation = validateManifest(entry.manifest);\n\n return {\n pluginId: entry.pluginId,\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n source: entry.source,\n discoveredAt: snapshot.generatedAt,\n buildTimestamp,\n validation: {\n valid: validation.valid,\n errors: validation.errors,\n },\n };\n })\n );\n\n reply.type('application/json');\n return {\n manifests: manifestsWithTimestamps,\n apiBasePath: basePath,\n diagnostics: {\n total: snapshot.diagnostics?.length ?? 0,\n items: (snapshot.diagnostics ?? []).map((diagnostic) => ({\n severity: diagnostic.severity,\n code: diagnostic.code,\n reasonCode: mapRegistryDiagnosticReasonCode(diagnostic.code),\n message: diagnostic.message,\n pluginId: diagnostic.context?.pluginId,\n filePath: diagnostic.context?.filePath,\n remediation: diagnostic.remediation,\n ts: diagnostic.ts,\n })),\n },\n };\n } catch (error) {\n platform.logger.error(\n 'Failed to get plugin registry',\n error instanceof Error ? error : new Error(String(error))\n );\n reply.code(500).send({\n error: 'Failed to load plugin registry',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Plugin README — serves README.md from plugin root directory\n server.get<{\n Params: { scope: string; name: string };\n }>(`${basePath}/plugins/@:scope/:name/readme`, {\n schema: { hide: true },\n }, async (request, reply) => {\n const { scope, name } = request.params;\n\n if (!scope || !name) {\n return reply.code(400).send({ error: 'Invalid plugin identifier' });\n }\n\n const pluginId = `@${scope}/${name}`;\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n const entry = manifests.find(e => e.pluginId === pluginId);\n\n if (!entry) {\n return reply.code(404).send({ error: `Plugin not found: ${pluginId}` });\n }\n\n const readmePath = path.join(entry.pluginRoot, 'README.md');\n\n if (!readmePath.startsWith(entry.pluginRoot)) {\n return reply.code(400).send({ error: 'Invalid path' });\n }\n\n try {\n const content = await fs.readFile(readmePath, 'utf-8');\n return reply.code(200).header('Content-Type', 'text/plain; charset=utf-8').send(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return reply.code(404).send({ error: 'README.md not found' });\n }\n return reply.code(500).send({ error: 'Failed to read README.md' });\n }\n });\n\n // Plugin Changelog — serves CHANGELOG.md from plugin root directory\n server.get<{\n Params: { scope: string; name: string };\n }>(`${basePath}/plugins/@:scope/:name/changelog`, {\n schema: { hide: true },\n }, async (request, reply) => {\n const { scope, name } = request.params;\n\n if (!scope || !name) {\n return reply.code(400).send({ error: 'Invalid plugin identifier' });\n }\n\n const pluginId = `@${scope}/${name}`;\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n const entry = manifests.find(e => e.pluginId === pluginId);\n\n if (!entry) {\n return reply.code(404).send({ error: `Plugin not found: ${pluginId}` });\n }\n\n const changelogPath = path.join(entry.pluginRoot, 'CHANGELOG.md');\n\n if (!changelogPath.startsWith(entry.pluginRoot)) {\n return reply.code(400).send({ error: 'Invalid path' });\n }\n\n try {\n const content = await fs.readFile(changelogPath, 'utf-8');\n return reply.code(200).header('Content-Type', 'text/plain; charset=utf-8').send(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return reply.code(404).send({ error: 'CHANGELOG.md not found' });\n }\n return reply.code(500).send({ error: 'Failed to read CHANGELOG.md' });\n }\n });\n\n // Studio Registry V2 — returns plugin pages and menus for Module Federation\n server.get(`${basePath}/studio/registry`, {\n schema: { tags: ['Studio'], summary: 'Get Studio Registry V2 (plugin pages for Module Federation)' },\n }, async (_request, reply) => {\n try {\n const snapshot = await restDomainOperationMetrics.observeOperation('plugin.studio.registry', async () =>\n registry.snapshot(),\n );\n const manifests = extractSnapshotManifests(snapshot);\n\n // Only plugins with studio V2 config\n const studioManifests = manifests\n .filter(entry => entry.manifest.studio?.version === 2)\n .map(entry => ({ manifest: entry.manifest, pluginRoot: entry.pluginRoot }));\n\n const studioRegistry = combineManifestsToRegistry(studioManifests);\n\n reply.type('application/json');\n return studioRegistry;\n } catch (error) {\n platform.logger.error('Failed to generate studio registry', error instanceof Error ? error : new Error(String(error)));\n reply.code(500).send({\n error: 'Failed to generate studio registry',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Widget bundle static files — serves dist/widgets/ from plugin packages\n server.get<{\n Params: { scope: string; name: string; '*': string };\n }>('/plugins/@:scope/:name/widgets/*', {\n schema: { hide: true },\n }, async (request, reply) => {\n const { scope, name } = request.params;\n const filePath = request.params['*'];\n\n if (!scope || !name || !filePath || filePath.includes('..')) {\n return reply.code(400).send({ error: 'Invalid path' });\n }\n\n const pluginId = `@${scope}/${name}`;\n\n // Find the plugin's widgetBundleDir from registry\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n const entry = manifests.find(e => e.manifest.id === pluginId && e.manifest.studio?.version === 2);\n\n if (!entry) {\n return reply.code(404).send({ error: `No widget bundle for ${pluginId}` });\n }\n\n const { join, extname } = await import('node:path');\n const { createReadStream, existsSync, statSync } = await import('node:fs');\n\n const bundleDir = join(entry.pluginRoot, 'dist', 'widgets');\n const fullPath = join(bundleDir, filePath);\n\n if (!fullPath.startsWith(bundleDir)) {\n return reply.code(400).send({ error: 'Invalid path' });\n }\n\n if (!existsSync(fullPath) || !statSync(fullPath).isFile()) {\n return reply.code(404).send({ error: `Widget file not found: ${pluginId}/widgets/${filePath}` });\n }\n\n const MIME: Record<string, string> = {\n '.js': 'application/javascript', '.mjs': 'application/javascript',\n '.css': 'text/css', '.json': 'application/json', '.map': 'application/json',\n };\n\n const ext = extname(filePath);\n const isEntry = filePath === 'remoteEntry.js';\n\n return reply\n .code(200)\n .header('Content-Type', MIME[ext] ?? 'application/octet-stream')\n .header('Content-Length', statSync(fullPath).size)\n .header('Cache-Control', isEntry\n ? 'public, max-age=10, must-revalidate'\n : process.env.NODE_ENV === 'production' ? 'public, max-age=31536000, immutable' : 'no-cache')\n .send(createReadStream(fullPath));\n });\n\n // Plugin registry health endpoint\n server.get(`${basePath}/plugins/health`, async (_request, reply) => {\n try {\n const snapshot = await restDomainOperationMetrics.observeOperation('plugin.registry.health', async () =>\n registry.snapshot(),\n );\n\n // Collect validation errors from all manifests\n const validationIssues: Array<{ pluginId: string; errors: string[] }> = [];\n for (const entry of snapshot.manifests) {\n const validation = validateManifest(entry.manifest);\n if (!validation.valid) {\n validationIssues.push({\n pluginId: entry.pluginId,\n errors: validation.errors,\n });\n }\n }\n\n // Registry resolution errors (plugins that failed to load)\n const registryErrors = (snapshot as { errors?: unknown[] }).errors ?? [];\n const discoveryDiagnostics = snapshot.diagnostics ?? [];\n const discoveryErrorCount = discoveryDiagnostics.filter((diagnostic) => diagnostic.severity === 'error').length;\n\n // Determine why registry is partial\n const partialReasons: string[] = [];\n if (snapshot.corrupted) {\n partialReasons.push('snapshot_corrupted');\n }\n if (registryErrors.length > 0) {\n partialReasons.push('registry_errors');\n }\n if (discoveryErrorCount > 0) {\n partialReasons.push('discovery_diagnostics');\n }\n // If partial but no clear reason, it's likely initialization\n if (snapshot.partial && partialReasons.length === 0) {\n partialReasons.push('initialization_incomplete');\n }\n\n reply.type('application/json');\n return {\n healthy: !snapshot.partial && !snapshot.stale && validationIssues.length === 0 && registryErrors.length === 0 && discoveryErrorCount === 0,\n snapshot: {\n partial: snapshot.partial,\n stale: snapshot.stale,\n corrupted: snapshot.corrupted,\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n totalManifests: snapshot.manifests.length,\n partialReasons,\n },\n registryErrors: {\n total: registryErrors.length,\n items: registryErrors.map((err) => {\n const e = err as { pluginPath?: string; pluginId?: string; error?: string; code?: string };\n return {\n pluginPath: e.pluginPath,\n pluginId: e.pluginId,\n error: e.error,\n code: e.code,\n };\n }),\n },\n diagnostics: {\n total: discoveryDiagnostics.length,\n errors: discoveryErrorCount,\n warnings: discoveryDiagnostics.filter((diagnostic) => diagnostic.severity === 'warning').length,\n items: discoveryDiagnostics.map((diagnostic) => ({\n severity: diagnostic.severity,\n code: diagnostic.code,\n reasonCode: mapRegistryDiagnosticReasonCode(diagnostic.code),\n message: diagnostic.message,\n pluginId: diagnostic.context?.pluginId,\n filePath: diagnostic.context?.filePath,\n remediation: diagnostic.remediation,\n ts: diagnostic.ts,\n })),\n },\n validation: {\n totalIssues: validationIssues.length,\n issues: validationIssues,\n },\n message:\n registryErrors.length > 0\n ? `Registry is partial - ${registryErrors.length} plugin(s) failed to load. Check registryErrors.items for details.`\n : discoveryErrorCount > 0\n ? `Registry has discovery diagnostics - ${discoveryErrorCount} blocking issue(s). Check diagnostics.items for details.`\n : snapshot.partial && partialReasons.includes('initialization_incomplete')\n ? 'Registry is partial - initialization incomplete. Try refreshing or wait for the snapshot rebuild to complete.'\n : snapshot.partial\n ? `Registry is partial - reasons: ${partialReasons.join(', ')}`\n : snapshot.stale\n ? 'Registry is stale - plugin snapshot may be outdated.'\n : validationIssues.length > 0\n ? `${validationIssues.length} plugin(s) have validation errors.`\n : 'All plugins are healthy.',\n };\n } catch (error) {\n platform.logger.error('Failed to get plugin health', error instanceof Error ? error : new Error(String(error)));\n reply.code(500).send({\n error: 'Failed to get plugin health',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // AI Assistant endpoint: ask questions about a plugin\n server.post(`${basePath}/plugins/:pluginId/ask`, async (request, reply) => {\n try {\n const { pluginId } = request.params as { pluginId: string };\n const { question } = request.body as { question: string };\n\n if (!question || typeof question !== 'string') {\n reply.code(400).send({\n error: 'Bad request',\n message: 'Question is required and must be a string',\n });\n return;\n }\n\n // Get plugin manifest\n const snapshot = await restDomainOperationMetrics.observeOperation('plugin.registry.snapshot', async () =>\n registry.snapshot(),\n );\n const pluginEntry = snapshot.manifests.find((entry) => entry.pluginId === pluginId);\n\n if (!pluginEntry) {\n reply.code(404).send({\n error: 'Plugin not found',\n message: `Plugin ${pluginId} not found in registry`,\n });\n return;\n }\n\n // Build prompt for LLM\n const systemPrompt = `You are a helpful assistant that explains KB Labs plugins based on their manifest.\nProvide clear, concise answers about the plugin's capabilities, API endpoints, permissions, and usage.\nBe specific and reference the actual values from the manifest.`;\n\n const userPrompt = `Plugin Manifest:\n${JSON.stringify(pluginEntry.manifest, null, 2)}\n\nUser Question: ${question}\n\nPlease answer the question based on the plugin manifest above.`;\n\n // Call LLM\n const response = await restDomainOperationMetrics.observeOperation('plugin.assistant.ask', () =>\n platform.llm.complete(userPrompt, {\n systemPrompt,\n temperature: 0.3,\n maxTokens: 1000,\n }),\n );\n\n reply.type('application/json');\n return {\n answer: response.content,\n usage: response.usage,\n };\n } catch (error) {\n platform.logger.error('Failed to get AI answer about plugin', error instanceof Error ? error : new Error(String(error)));\n reply.code(500).send({\n error: 'Failed to get AI answer',\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n}\n\n/**\n * Shutdown execution backend gracefully.\n * NOTE: ExecutionBackend is now owned by platform, shutdown via platform.shutdown()\n */\nexport async function shutdownExecutionBackend(): Promise<void> {\n // ExecutionBackend lifecycle is now managed by platform\n // Call platform.shutdown() instead to shutdown all services including executionBackend\n await platform.shutdown();\n}\n\nfunction summarizeValidationErrors(errors: string[]): string {\n if (errors.length === 0) {\n return 'rest_validation_failed';\n }\n const first = errors[0] || 'rest_validation_failed';\n const prefix = first.split(':')[0]?.trim() ?? 'rest_validation_failed';\n return `rest_validation_failed ${prefix}`.trim();\n}\n\nfunction shortErrorMessage(error: unknown): string {\n if (!error) {\n return 'unknown_error';\n }\n const message = error instanceof Error ? error.message : String(error);\n const firstLine = message.trim().split('\\n')[0] ?? message.trim();\n return firstLine.length > 120 ? `${firstLine.slice(0, 117)}...` : firstLine;\n}\n\nfunction mapDiagnosticSeverityToLogLevel(\n severity: 'error' | 'warning' | 'info' | 'debug',\n): DiagnosticLogLevel {\n switch (severity) {\n case 'error':\n return 'error';\n case 'warning':\n return 'warn';\n case 'debug':\n return 'debug';\n default:\n return 'info';\n }\n}\n\nfunction mapRegistryDiagnosticReasonCode(code: string): DiagnosticReasonCode {\n switch (code) {\n case 'MANIFEST_NOT_FOUND':\n return 'manifest_missing';\n case 'MANIFEST_VALIDATION_ERROR':\n case 'MANIFEST_PARSE_ERROR':\n return 'manifest_invalid';\n case 'MANIFEST_LOAD_TIMEOUT':\n return 'manifest_load_timeout';\n case 'INTEGRITY_MISMATCH':\n return 'integrity_mismatch';\n default:\n return 'plugin_discovery_failed';\n }\n}\n\nfunction emitRegistrySnapshotDiagnostics(snapshot: RegistrySnapshot): void {\n for (const diagnostic of snapshot.diagnostics ?? []) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'plugin.discovery.diagnostic',\n level: mapDiagnosticSeverityToLogLevel(diagnostic.severity),\n reasonCode: mapRegistryDiagnosticReasonCode(diagnostic.code),\n message: diagnostic.message,\n outcome: diagnostic.severity === 'error' ? 'failed' : 'skipped',\n pluginId: diagnostic.context?.pluginId,\n serviceId: 'rest',\n manifestPath: diagnostic.context?.filePath,\n discoveryCode: diagnostic.code,\n remediation: diagnostic.remediation,\n evidence: {\n severity: diagnostic.severity,\n entityKind: diagnostic.context?.entityKind,\n entityId: diagnostic.context?.entityId,\n ts: diagnostic.ts,\n },\n });\n }\n}\n\nfunction inferRouteValidationReasonCode(errors: string[]): DiagnosticReasonCode {\n if (errors.some((error) => error.includes('Handler file not found'))) {\n return 'handler_not_found';\n }\n return 'route_validation_failed';\n}\n\nfunction resolveRouteValidationLogLevel(\n errors: string[],\n totalRoutes: number,\n): DiagnosticLogLevel {\n return errors.length >= totalRoutes ? 'error' : 'warn';\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/workflows\n * Workflow SSE streaming endpoint.\n *\n * All CRUD operations (list runs, get run, cancel, run workflow) are handled\n * by the workflow plugin via plugin routes (/plugins/workflow/...).\n * This file only provides the SSE event stream which requires a long-lived\n * connection that cannot go through the plugin execution backend.\n */\n\nimport type { FastifyInstance } from 'fastify'\nimport type { RestApiConfig } from '@kb-labs/rest-api-core'\nimport { WORKFLOW_REDIS_CHANNEL } from '@kb-labs/workflow-constants'\nimport { platform } from '@kb-labs/core-runtime'\nimport { normalizeBasePath } from './path-helpers'\n\ninterface HttpError extends Error {\n statusCode: number;\n code: string;\n}\n\nconst TERMINAL_EVENT_TYPES = ['run.finished', 'run.failed', 'run.cancelled']\nconst KEEP_ALIVE_MS = 30_000\nconst IDLE_TIMEOUT_MS = 60_000\nconst EVENT_BUS_KEY = `eventbus:${WORKFLOW_REDIS_CHANNEL}`\n\n/**\n * Replay past events for a runId from the Redis sorted set.\n * Returns true if a terminal event was found (run already finished).\n */\nasync function replayHistory(\n runId: string,\n sendEvent: (type: string, payload: unknown, timestamp?: string) => void,\n): Promise<boolean> {\n let hasTerminal = false\n try {\n const cache = platform.cache\n if (!cache?.zrangebyscore) {return false}\n\n const stored = await cache.zrangebyscore(EVENT_BUS_KEY, 0, Date.now())\n for (const raw of stored) {\n try {\n const wrapper = JSON.parse(raw) as { data: { type: string; runId: string; payload?: unknown; timestamp?: string } }\n const event = wrapper.data\n if (event.runId !== runId) {continue}\n sendEvent(event.type, event.payload, event.timestamp)\n if (TERMINAL_EVENT_TYPES.includes(event.type)) {\n hasTerminal = true\n }\n } catch { /* skip malformed entries */ }\n }\n } catch { /* cache unavailable — skip replay */ }\n return hasTerminal\n}\n\nexport async function registerWorkflowRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath)\n\n // SSE stream of workflow run events via shared IEventBus.\n // No local engine needed — events arrive through the distributed event bus\n // (state broker / Redis / Kafka). The daemon publishes, we subscribe.\n server.route({\n method: 'GET',\n url: `${basePath}/workflows/runs/:runId/events`,\n handler: async (request, reply) => {\n const runId = getRunId(request.params)\n\n // SSE response — hijack from Fastify\n reply.hijack()\n const raw = reply.raw\n\n const origin = request.headers.origin\n if (typeof origin === 'string' && (origin === 'http://localhost:3000' || origin === 'http://localhost:5173')) {\n raw.setHeader('Access-Control-Allow-Origin', origin)\n raw.setHeader('Access-Control-Allow-Credentials', 'true')\n }\n raw.setHeader('Content-Type', 'text/event-stream')\n raw.setHeader('Cache-Control', 'no-cache, no-transform')\n raw.setHeader('Connection', 'keep-alive')\n raw.flushHeaders?.()\n raw.write(': connected\\n\\n')\n\n const sentIds = new Set<string>()\n\n const sendEvent = (type: string, payload: unknown, timestamp?: string) => {\n if (raw.writableEnded) {return}\n const data = { type, runId, payload, timestamp: timestamp ?? new Date().toISOString() }\n // Dedup by type+timestamp to avoid replaying events that also arrive live\n const dedup = `${type}:${data.timestamp}`\n if (sentIds.has(dedup)) {return}\n sentIds.add(dedup)\n raw.write(`event: workflow.event\\n`)\n raw.write(`data: ${JSON.stringify(data)}\\n\\n`)\n }\n\n // Replay history — send past events for this run\n const alreadyFinished = await replayHistory(runId, sendEvent)\n if (alreadyFinished) {\n raw.end()\n return\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null\n\n const resetIdle = () => {\n if (idleTimer) {clearTimeout(idleTimer)}\n idleTimer = setTimeout(() => {\n cleanup()\n }, IDLE_TIMEOUT_MS)\n }\n\n const keepAliveTimer = setInterval(() => {\n if (raw.writableEnded) {return}\n raw.write(': keep-alive\\n\\n')\n }, KEEP_ALIVE_MS)\n\n const unsubscribe = platform.eventBus.subscribe(WORKFLOW_REDIS_CHANNEL, async (rawEvent: unknown) => {\n const event = rawEvent as { type: string; runId: string; payload?: unknown; timestamp?: string }\n if (event.runId !== runId) {return}\n sendEvent(event.type, event.payload, event.timestamp)\n resetIdle()\n if (TERMINAL_EVENT_TYPES.includes(event.type)) {\n cleanup()\n }\n })\n\n const cleanup = () => {\n unsubscribe()\n if (idleTimer) {clearTimeout(idleTimer)}\n clearInterval(keepAliveTimer)\n if (!raw.writableEnded) {\n raw.write(`event: workflow.done\\ndata: {}\\n\\n`)\n raw.end()\n }\n }\n\n resetIdle()\n request.raw.on('close', cleanup)\n },\n })\n\n // SSE stream of workflow run logs via shared IEventBus.\n // Sends all events for a run as `workflow.log` entries with jobId/stepId context.\n server.route({\n method: 'GET',\n url: `${basePath}/workflows/runs/:runId/logs`,\n handler: async (request, reply) => {\n const runId = getRunId(request.params)\n const query = request.query as { idleTimeoutMs?: string }\n const idleTimeout = query.idleTimeoutMs ? parseInt(query.idleTimeoutMs, 10) : IDLE_TIMEOUT_MS\n\n reply.hijack()\n const raw = reply.raw\n\n const origin = request.headers.origin\n if (typeof origin === 'string' && (origin === 'http://localhost:3000' || origin === 'http://localhost:5173')) {\n raw.setHeader('Access-Control-Allow-Origin', origin)\n raw.setHeader('Access-Control-Allow-Credentials', 'true')\n }\n raw.setHeader('Content-Type', 'text/event-stream')\n raw.setHeader('Cache-Control', 'no-cache, no-transform')\n raw.setHeader('Connection', 'keep-alive')\n raw.flushHeaders?.()\n raw.write(': connected\\n\\n')\n\n const sentLogIds = new Set<string>()\n\n const sendLog = (event: { type: string; runId: string; jobId?: string; stepId?: string; payload?: unknown; timestamp?: string }) => {\n if (raw.writableEnded) {return}\n const ts = event.timestamp ?? new Date().toISOString()\n const dedup = `${event.type}:${event.jobId ?? ''}:${event.stepId ?? ''}:${ts}`\n if (sentLogIds.has(dedup)) {return}\n sentLogIds.add(dedup)\n raw.write(`event: workflow.log\\n`)\n raw.write(`data: ${JSON.stringify({\n type: event.type,\n runId: event.runId,\n jobId: event.jobId,\n stepId: event.stepId,\n payload: event.payload,\n timestamp: ts,\n })}\\n\\n`)\n }\n\n // Replay history for logs\n let logsAlreadyFinished = false\n try {\n const cache = platform.cache\n if (cache?.zrangebyscore) {\n const stored = await cache.zrangebyscore(EVENT_BUS_KEY, 0, Date.now())\n for (const rawStr of stored) {\n try {\n const wrapper = JSON.parse(rawStr) as { data: { type: string; runId: string; jobId?: string; stepId?: string; payload?: unknown; timestamp?: string } }\n const ev = wrapper.data\n if (ev.runId !== runId) {continue}\n sendLog(ev)\n if (TERMINAL_EVENT_TYPES.includes(ev.type)) {logsAlreadyFinished = true}\n } catch { /* skip */ }\n }\n }\n } catch { /* cache unavailable */ }\n\n if (logsAlreadyFinished) {\n raw.write(`event: workflow.done\\ndata: {}\\n\\n`)\n raw.end()\n return\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null\n\n const resetIdle = () => {\n if (idleTimer) {clearTimeout(idleTimer)}\n idleTimer = setTimeout(() => {\n cleanup()\n }, idleTimeout)\n }\n\n const keepAliveTimer = setInterval(() => {\n if (raw.writableEnded) {return}\n raw.write(': keep-alive\\n\\n')\n }, KEEP_ALIVE_MS)\n\n const unsubscribe = platform.eventBus.subscribe(WORKFLOW_REDIS_CHANNEL, async (rawEvent: unknown) => {\n const event = rawEvent as { type: string; runId: string; jobId?: string; stepId?: string; payload?: unknown; timestamp?: string }\n if (event.runId !== runId) {return}\n sendLog(event)\n resetIdle()\n if (TERMINAL_EVENT_TYPES.includes(event.type)) {\n cleanup()\n }\n })\n\n const cleanup = () => {\n unsubscribe()\n if (idleTimer) {clearTimeout(idleTimer)}\n clearInterval(keepAliveTimer)\n if (!raw.writableEnded) {\n raw.write(`event: workflow.done\\ndata: {}\\n\\n`)\n raw.end()\n }\n }\n\n resetIdle()\n request.raw.on('close', cleanup)\n },\n })\n}\n\nfunction getRunId(params: unknown): string {\n const runId = (params as { runId?: unknown } | undefined)?.runId\n if (!runId || typeof runId !== 'string') {\n const error = new Error('runId must be provided') as HttpError\n error.statusCode = 400\n error.code = 'WF_RUN_ID_REQUIRED'\n throw error\n }\n return runId\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/jobs\n * Scheduled jobs management endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ZodTypeProvider } from 'fastify-type-provider-zod';\nimport { serializerCompiler, validatorCompiler } from 'fastify-type-provider-zod';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { ICronManager } from '@kb-labs/core-platform';\nimport { z } from 'zod';\nimport type { z as ZodType } from 'zod';\nimport {\n ListJobsQuerySchema,\n JobSchema,\n JobsListResponseSchema,\n JobResponseSchema,\n JobStatsResponseSchema,\n JobActionResponseSchema,\n ErrorResponseSchema,\n} from '@kb-labs/rest-api-contracts';\nimport { normalizeBasePath } from './path-helpers';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ninterface HttpError extends Error {\n statusCode: number;\n code: string;\n}\n\nfunction createError(statusCode: number, code: string, message: string): HttpError {\n const error = new Error(message) as HttpError;\n error.statusCode = statusCode;\n error.code = code;\n return error;\n}\n\nfunction getJobId(params: unknown): string {\n const id = (params as { id?: unknown } | undefined)?.id;\n if (!id || typeof id !== 'string') {\n throw createError(400, 'JOB_ID_REQUIRED', 'Job id must be provided');\n }\n return id;\n}\n\n// ============================================================================\n// Route Registration\n// ============================================================================\n\nexport async function registerJobsRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n cronManager: ICronManager | null,\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n // Encapsulate Zod compilers so they don't leak to other scopes (plugin routes use plain JSON schemas)\n await server.register(async (scope) => {\n scope.setValidatorCompiler(validatorCompiler);\n scope.setSerializerCompiler(serializerCompiler);\n const s = scope.withTypeProvider<ZodTypeProvider>();\n\n /**\n * GET /api/v1/jobs\n * List all scheduled jobs\n */\n s.route({\n method: 'GET',\n url: `${basePath}/jobs`,\n schema: {\n tags: ['Jobs'],\n summary: 'List scheduled jobs',\n querystring: ListJobsQuerySchema,\n response: {\n 200: JobsListResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n let jobs = cronManager.list();\n\n const query = request.query as { status?: string };\n if (query.status) {\n jobs = jobs.filter((job) => job.status === query.status);\n }\n\n return reply.send({ jobs: jobs as unknown as ZodType.infer<typeof JobSchema>[] });\n },\n });\n\n /**\n * GET /api/v1/jobs/stats\n * Get cron jobs statistics (must be before /:id to avoid route conflict)\n */\n s.route({\n method: 'GET',\n url: `${basePath}/jobs/stats`,\n schema: {\n tags: ['Jobs'],\n summary: 'Get cron jobs statistics',\n response: {\n 200: JobStatsResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobs = cronManager.list();\n return reply.send({ stats: { total: jobs.length, jobs: jobs as unknown as ZodType.infer<typeof JobSchema>[] } });\n },\n });\n\n /**\n * GET /api/v1/jobs/:id\n * Get job details\n */\n s.route({\n method: 'GET',\n url: `${basePath}/jobs/:id`,\n schema: {\n tags: ['Jobs'],\n summary: 'Get job details',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n const jobs = cronManager.list();\n const job = jobs.find((j) => j.id === jobId);\n\n if (!job) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n\n return reply.send({ job: job as unknown as ZodType.infer<typeof JobSchema> });\n },\n });\n\n /**\n * POST /api/v1/jobs/:id/trigger\n * Trigger job execution immediately\n */\n s.route({\n method: 'POST',\n url: `${basePath}/jobs/:id/trigger`,\n schema: {\n tags: ['Jobs'],\n summary: 'Trigger job execution immediately',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobActionResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n\n try {\n await cronManager.trigger(jobId);\n return reply.send({ success: true as const, message: `Job ${jobId} triggered successfully` });\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found')) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n throw error;\n }\n },\n });\n\n /**\n * POST /api/v1/jobs/:id/pause\n * Pause job execution\n */\n s.route({\n method: 'POST',\n url: `${basePath}/jobs/:id/pause`,\n schema: {\n tags: ['Jobs'],\n summary: 'Pause job execution',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobActionResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n const jobs = cronManager.list();\n const job = jobs.find((j) => j.id === jobId);\n if (!job) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n\n cronManager.pause(jobId);\n return reply.send({ success: true as const, message: `Job ${jobId} paused successfully` });\n },\n });\n\n /**\n * POST /api/v1/jobs/:id/resume\n * Resume paused job\n */\n s.route({\n method: 'POST',\n url: `${basePath}/jobs/:id/resume`,\n schema: {\n tags: ['Jobs'],\n summary: 'Resume paused job',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobActionResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n const jobs = cronManager.list();\n const job = jobs.find((j) => j.id === jobId);\n if (!job) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n\n cronManager.resume(jobId);\n return reply.send({ success: true as const, message: `Job ${jobId} resumed successfully` });\n },\n });\n\n }); // end encapsulated scope\n}\n","import { platform } from '@kb-labs/core-runtime';\n/**\n * @module @kb-labs/rest-api-app/routes/cache\n * Cache management routes\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { normalizeBasePath } from './path-helpers';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n/**\n * Register cache management routes\n */\nexport async function registerCacheRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n registry: IEntityRegistry\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n /**\n * POST /api/v1/cache/invalidate\n * Force cache invalidation and registry refresh\n */\n server.post(`${basePath}/cache/invalidate`, async (request, reply) => {\n const start = Date.now();\n\n try {\n // Capture current state\n const beforeSnapshot = registry.snapshot();\n const previousRev = beforeSnapshot.rev;\n\n platform.logger.info('Manual cache invalidation requested', {\n requestId: request.id,\n previousRev,\n });\n // Force cache invalidation and refresh discovery\n // This will trigger re-discovery and clear stale cache\n await restDomainOperationMetrics.observeOperation('cache.invalidate', async () => {\n await registry.refresh();\n });\n\n // Get new state\n const afterSnapshot = await restDomainOperationMetrics.observeOperation('plugin.registry.snapshot', async () =>\n registry.snapshot(),\n );\n const plugins = await restDomainOperationMetrics.observeOperation('plugin.registry.list', async () =>\n registry.listPlugins(),\n );\n\n const elapsed = Date.now() - start;\n\n platform.logger.info('Cache invalidated successfully', {\n requestId: request.id,\n previousRev,\n newRev: afterSnapshot.rev,\n pluginsDiscovered: plugins.length,\n elapsedMs: elapsed,\n });\n\n return reply.code(200).send({\n ok: true,\n data: {\n invalidated: true,\n timestamp: new Date().toISOString(),\n previousRev,\n newRev: afterSnapshot.rev,\n pluginsDiscovered: plugins.length,\n },\n meta: {\n requestId: request.id,\n durationMs: elapsed,\n apiVersion: '1.0.0',\n },\n });\n } catch (error) {\n const elapsed = Date.now() - start;\n\n platform.logger.error(\n 'Cache invalidation failed',\n error instanceof Error ? error : new Error(String(error)),\n {\n requestId: request.id as string,\n elapsedMs: elapsed,\n }\n );\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'CACHE_INVALIDATION_FAILED',\n message: error instanceof Error ? error.message : 'Cache invalidation failed',\n },\n meta: {\n requestId: request.id,\n durationMs: elapsed,\n apiVersion: '1.0.0',\n },\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/observability\n * Observability endpoints for monitoring system internals\n */\n\nimport type { FastifyInstance, FastifyReply } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { hostname } from 'node:os';\nimport type { HistoricalMetricsCollector } from '../daemon/metrics';\nimport type { SystemMetrics } from '../daemon/metrics';\nimport { metricsCollector } from '../middleware/metrics.js';\n\n\n/**\n * Register observability routes\n *\n * These are system-level observability endpoints that expose internal metrics\n * and health information about platform components (State Broker, DevKit, etc.)\n */\nexport async function registerObservabilityRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n historicalMetrics?: HistoricalMetricsCollector,\n platform?: PlatformServices\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const stateBrokerPaths = resolvePaths(basePath, '/observability/state-broker');\n const systemMetricsPaths = resolvePaths(basePath, '/observability/system-metrics');\n const metricsHistoryPaths = resolvePaths(basePath, '/observability/metrics/history');\n const metricsHeatmapPaths = resolvePaths(basePath, '/observability/metrics/heatmap');\n const insightsChatPaths = resolvePaths(basePath, '/observability/insights/chat');\n\n // GET /api/v1/observability/state-broker\n // Returns statistics from State Broker daemon (cache hits, namespaces, etc.)\n for (const path of stateBrokerPaths) {\n fastify.get(path, { schema: { tags: ['Observability'], summary: 'State Broker statistics' } }, async (_request, reply) => {\n try {\n const stateBrokerUrl = process.env.KB_STATE_DAEMON_URL || 'http://localhost:7777';\n\n fastify.log.debug({ url: stateBrokerUrl }, 'Fetching State Broker stats');\n\n const response = await fetch(`${stateBrokerUrl}/stats`, {\n signal: AbortSignal.timeout(5000), // 5s timeout\n });\n\n if (!response.ok) {\n fastify.log.warn({\n status: response.status,\n url: stateBrokerUrl,\n }, 'State Broker responded with error');\n\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'STATE_BROKER_UNAVAILABLE',\n message: 'State Broker daemon is not available',\n details: {\n url: stateBrokerUrl,\n status: response.status,\n },\n },\n });\n }\n\n const stats = await response.json() as Record<string, unknown>;\n\n fastify.log.debug({\n totalEntries: stats.totalEntries,\n hitRate: stats.hitRate,\n }, 'State Broker stats retrieved successfully');\n\n return {\n ok: true,\n data: stats,\n meta: {\n source: 'state-broker',\n daemonUrl: stateBrokerUrl,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to fetch State Broker stats', error instanceof Error ? error : new Error(String(error)));\n\n // Check if it's a timeout error\n const isTimeout = error instanceof Error && error.name === 'AbortError';\n\n return reply.code(503).send({\n ok: false,\n error: {\n code: isTimeout ? 'STATE_BROKER_TIMEOUT' : 'STATE_BROKER_ERROR',\n message: isTimeout\n ? 'State Broker daemon did not respond in time'\n : error instanceof Error ? error.message : String(error),\n details: {\n isTimeout,\n },\n },\n });\n }\n });\n }\n\n\n // GET /api/v1/observability/system-metrics\n // Returns system resource metrics (CPU, memory, uptime, load) from all REST API instances\n for (const path of systemMetricsPaths) {\n fastify.get(path, { schema: { tags: ['Observability'], summary: 'System resource metrics' } }, async (_request, reply) => {\n try {\n if (!platform?.cache) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'PLATFORM_CACHE_UNAVAILABLE',\n message: 'Platform cache is not available',\n },\n });\n }\n\n fastify.log.debug('Fetching system metrics from all instances');\n\n // Get all system-metrics:* keys from platform.cache\n const allMetrics: SystemMetrics[] = [];\n\n // Try to scan for all system-metrics keys\n // Note: platform.cache may not have scan(), so we'll handle both cases\n try {\n // Try to use scan if available (Redis adapter)\n const cacheWithScan = platform.cache as { scan?: (pattern: string) => Promise<string[]> };\n if ('scan' in platform.cache && typeof cacheWithScan.scan === 'function') {\n const keys = await cacheWithScan.scan('system-metrics:*');\n\n for (const key of keys) {\n const metrics = await platform.cache.get<SystemMetrics>(key);\n if (metrics) {\n allMetrics.push(metrics);\n }\n }\n } else {\n // Fallback: InMemory adapter doesn't have scan, but we can try common instance IDs\n // This is a limitation - we won't see all instances unless we track them separately\n // For now, we'll just try to get the current instance's metrics\n const currentInstanceId = hostname();\n const metrics = await platform.cache.get<SystemMetrics>(`system-metrics:${currentInstanceId}`);\n\n if (metrics) {\n allMetrics.push(metrics);\n }\n\n fastify.log.debug('Platform cache does not support scan(), showing current instance only');\n }\n } catch (scanError) {\n fastify.log.warn({ err: scanError }, 'Failed to scan platform.cache for system metrics');\n\n // Fallback: try current instance\n const currentInstanceId = hostname();\n const metrics = await platform.cache.get<SystemMetrics>(`system-metrics:${currentInstanceId}`);\n\n if (metrics) {\n allMetrics.push(metrics);\n }\n }\n\n if (allMetrics.length === 0) {\n return reply.code(404).send({\n ok: false,\n error: {\n code: 'NO_METRICS_FOUND',\n message: 'No system metrics found. Metrics collector may not be running.',\n },\n });\n }\n\n // Sort by timestamp (newest first)\n allMetrics.sort((a, b) => b.timestamp - a.timestamp);\n\n // Calculate aggregated metrics\n const now = Date.now();\n const avgCpu = allMetrics.reduce((sum, m) => sum + m.cpu.percentage, 0) / allMetrics.length;\n const avgMemory = allMetrics.reduce((sum, m) => sum + m.memory.rssPercentage, 0) / allMetrics.length;\n const avgHeap = allMetrics.reduce((sum, m) => sum + m.memory.heapPercentage, 0) / allMetrics.length;\n\n // Categorize instances by health status based on age\n const activeInstances = allMetrics.filter(m => (now - m.timestamp) < 30000); // Active if updated in last 30s\n const staleInstances = allMetrics.filter(m => (now - m.timestamp) >= 30000 && (now - m.timestamp) < 60000); // Stale if 30-60s old\n const deadInstances = allMetrics.filter(m => (now - m.timestamp) >= 60000); // Dead if >60s old\n\n fastify.log.debug({\n totalInstances: allMetrics.length,\n activeInstances: activeInstances.length,\n staleInstances: staleInstances.length,\n deadInstances: deadInstances.length,\n }, 'System metrics retrieved');\n\n return {\n ok: true,\n data: {\n instances: allMetrics,\n summary: {\n totalInstances: allMetrics.length,\n activeInstances: activeInstances.length,\n staleInstances: staleInstances.length,\n deadInstances: deadInstances.length,\n avgCpu: parseFloat(avgCpu.toFixed(2)),\n avgMemory: parseFloat(avgMemory.toFixed(2)),\n avgHeap: parseFloat(avgHeap.toFixed(2)),\n },\n },\n meta: {\n source: 'platform-cache',\n timestamp: now,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to fetch system metrics', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'SYSTEM_METRICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch system metrics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/observability/metrics/history\n // Returns historical time-series metrics data\n for (const path of metricsHistoryPaths) {\n fastify.get(path, {\n schema: {\n tags: ['Observability'],\n summary: 'Historical time-series metrics',\n querystring: {\n type: 'object',\n properties: {\n metric: {\n type: 'string',\n enum: ['requests', 'errors', 'latency', 'uptime'],\n },\n range: {\n type: 'string',\n enum: ['1m', '5m', '10m', '30m', '1h'],\n },\n interval: {\n type: 'string',\n enum: ['5s', '1m', '5m'],\n },\n },\n required: ['metric', 'range'],\n },\n response: {\n 200: {\n type: 'object',\n properties: {\n ok: { type: 'boolean' },\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n timestamp: { type: 'number' },\n value: { type: 'number' },\n },\n },\n },\n meta: {\n type: 'object',\n properties: {\n source: { type: 'string' },\n metric: { type: 'string' },\n range: { type: 'string' },\n interval: { type: 'string' },\n points: { type: 'number' },\n },\n },\n },\n },\n },\n },\n }, async (request, reply: FastifyReply) => {\n if (!historicalMetrics) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'HISTORICAL_METRICS_UNAVAILABLE',\n message: 'Historical metrics collector is not initialized',\n },\n });\n }\n\n const query = request.query as {\n metric: 'requests' | 'errors' | 'latency' | 'uptime';\n range: '1m' | '5m' | '10m' | '30m' | '1h';\n interval?: '5s' | '1m' | '5m';\n };\n\n try {\n fastify.log.debug({ query }, 'Querying historical metrics');\n\n const data = await historicalMetrics.queryHistory({\n metric: query.metric,\n range: query.range,\n interval: query.interval,\n });\n\n fastify.log.debug({\n metric: query.metric,\n range: query.range,\n points: data.length,\n }, 'Historical metrics retrieved');\n\n return {\n ok: true,\n data,\n meta: {\n source: 'historical-metrics-collector',\n metric: query.metric,\n range: query.range,\n interval: query.interval ?? '5s',\n points: data.length,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to query historical metrics', error instanceof Error ? error : new Error(String(error)), { query });\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'HISTORICAL_METRICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to query historical metrics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/observability/metrics/heatmap\n // Returns heatmap aggregated data (7 days × 24 hours)\n for (const path of metricsHeatmapPaths) {\n fastify.get(path, {\n schema: {\n tags: ['Observability'],\n summary: 'Metrics heatmap data',\n querystring: {\n type: 'object',\n properties: {\n metric: {\n type: 'string',\n enum: ['latency', 'errors', 'requests'],\n },\n days: {\n type: 'integer',\n enum: [7, 14, 30],\n },\n },\n required: ['metric'],\n },\n response: {\n 200: {\n type: 'object',\n properties: {\n ok: { type: 'boolean' },\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n day: { type: 'string' },\n hour: { type: 'number' },\n value: { type: 'number' },\n },\n },\n },\n meta: {\n type: 'object',\n properties: {\n source: { type: 'string' },\n metric: { type: 'string' },\n days: { type: 'number' },\n cells: { type: 'number' },\n },\n },\n },\n },\n },\n },\n }, async (request, reply: FastifyReply) => {\n if (!historicalMetrics) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'HISTORICAL_METRICS_UNAVAILABLE',\n message: 'Historical metrics collector is not initialized',\n },\n });\n }\n\n const query = request.query as {\n metric: 'latency' | 'errors' | 'requests';\n days?: 7 | 14 | 30;\n };\n\n try {\n fastify.log.debug({ query }, 'Querying heatmap data');\n\n const data = await historicalMetrics.queryHeatmap({\n metric: query.metric,\n days: query.days ?? 7,\n });\n\n fastify.log.debug({\n metric: query.metric,\n cells: data.length,\n }, 'Heatmap data retrieved');\n\n return {\n ok: true,\n data,\n meta: {\n source: 'historical-metrics-collector',\n metric: query.metric,\n days: query.days ?? 7,\n cells: data.length,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to query heatmap data', error instanceof Error ? error : new Error(String(error)), { query });\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'HEATMAP_ERROR',\n message: error instanceof Error ? error.message : 'Failed to query heatmap data',\n },\n });\n }\n });\n }\n\n // POST /api/v1/observability/insights/chat\n // AI-powered insights chat using LLM with system metrics as context\n for (const path of insightsChatPaths) {\n fastify.post(path, {\n schema: {\n tags: ['Observability'],\n summary: 'AI-powered observability insights chat',\n body: {\n type: 'object',\n properties: {\n question: { type: 'string', minLength: 1 },\n context: {\n type: 'object',\n properties: {\n includeMetrics: { type: 'boolean' },\n includeHistory: { type: 'boolean' },\n timeRange: { type: 'string', enum: ['1h', '6h', '24h', '7d'] },\n plugins: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n required: ['question'],\n },\n },\n }, async (request, reply) => {\n if (!platform?.llm) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'LLM_UNAVAILABLE',\n message: 'LLM adapter is not configured. AI Insights requires an LLM adapter.',\n },\n });\n }\n\n try {\n const body = request.body as {\n question: string;\n context?: {\n includeMetrics?: boolean;\n includeIncidents?: boolean;\n includeHistory?: boolean;\n timeRange?: '1h' | '6h' | '24h' | '7d';\n plugins?: string[];\n };\n };\n\n const contextConfig = {\n includeMetrics: body.context?.includeMetrics ?? true,\n includeHistory: body.context?.includeHistory ?? true,\n timeRange: body.context?.timeRange ?? '24h',\n plugins: body.context?.plugins ?? [],\n };\n\n // Build context from real data\n let contextText = '';\n\n // Fetch current metrics\n if (contextConfig.includeMetrics) {\n try {\n const metrics = metricsCollector.getMetrics();\n\n const errorRate = metrics.requests.total\n ? (((metrics.requests.clientErrors ?? 0) + (metrics.requests.serverErrors ?? 0)) / metrics.requests.total * 100)\n : 0;\n\n contextText += `\\n## Current System Metrics\\n`;\n contextText += `- Total requests: ${metrics.requests.total}\\n`;\n contextText += `- Active requests: ${metrics.requests.active}\\n`;\n contextText += `- Error rate: ${errorRate.toFixed(2)}%\\n`;\n contextText += `- Average latency: ${metrics.latency.average.toFixed(0)}ms\\n`;\n contextText += `- Max latency: ${metrics.latency.max.toFixed(0)}ms\\n`;\n\n if (metrics.perPlugin.length > 0) {\n contextText += `\\n### Per-Plugin Metrics\\n`;\n const pluginsToShow = contextConfig.plugins.length > 0\n ? metrics.perPlugin.filter(plugin => plugin.pluginId && contextConfig.plugins.includes(plugin.pluginId))\n : metrics.perPlugin.slice(0, 10);\n\n for (const plugin of pluginsToShow) {\n const totalRequests = plugin.total ?? 0;\n const errorCount = Object.entries(plugin.statuses ?? {})\n .filter(([statusGroup]) => statusGroup.startsWith('4') || statusGroup.startsWith('5'))\n .reduce((sum, [, count]) => sum + count, 0);\n const pluginErrorRate = totalRequests > 0\n ? (errorCount / totalRequests * 100).toFixed(2)\n : '0.00';\n const avgLatency = totalRequests > 0 ? plugin.totalDuration / totalRequests : 0;\n contextText += `- ${plugin.pluginId ?? 'unknown'}: ${totalRequests} requests, ${pluginErrorRate}% errors, ${avgLatency.toFixed(0)}ms avg latency\\n`;\n }\n }\n } catch (metricsError) {\n fastify.log.warn({ err: metricsError }, 'Failed to build metrics context for insights');\n }\n }\n\n // Build prompt\n const prompt = `You are an AI assistant analyzing a software platform's observability data.\n\n${contextText}\n\nUser Question: ${body.question}\n\nProvide a clear, actionable response based on the data above. Include:\n1. Direct answer to the question\n2. Supporting evidence from the metrics/incidents\n3. Recommendations if applicable\n\nBe concise but thorough. Use markdown formatting.`;\n\n fastify.log.debug({ question: body.question, contextLength: contextText.length }, 'Calling LLM for insights');\n\n const result = await platform.llm.complete(prompt, {\n systemPrompt: 'You are a DevOps and SRE expert assistant. Analyze system metrics and provide actionable insights. Be concise, technical, and helpful.',\n temperature: 0.7,\n maxTokens: 1000,\n });\n\n const totalTokens = result.usage.promptTokens + result.usage.completionTokens;\n\n fastify.log.debug({ tokensUsed: totalTokens }, 'LLM response received for insights');\n\n // Track analytics\n if (platform.analytics) {\n platform.analytics.track('ai_insights.chat', {\n questionLength: body.question.length,\n contextIncluded: Object.keys(contextConfig).filter(k => (contextConfig as Record<string, unknown>)[k]),\n timeRange: contextConfig.timeRange,\n pluginsFiltered: contextConfig.plugins.length,\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens,\n model: result.model,\n }).catch(() => {\n // Silently ignore analytics errors\n });\n }\n\n return {\n ok: true,\n data: {\n answer: result.content.trim(),\n context: Object.keys(contextConfig).filter(k => (contextConfig as Record<string, unknown>)[k]),\n usage: {\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens,\n },\n },\n meta: {\n source: 'llm-insights',\n model: result.model,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to generate insights', error instanceof Error ? error : new Error(String(error)));\n\n // Track error analytics\n if (platform?.analytics) {\n platform.analytics.track('ai_insights.error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n questionLength: (request.body as { question?: string })?.question?.length ?? 0,\n }).catch(() => {\n // Silently ignore analytics errors\n });\n }\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'INSIGHTS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to generate insights',\n },\n });\n }\n });\n }\n\n fastify.log.info('Observability routes registered');\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/analytics\n * Analytics endpoints for querying events, stats, and monitoring\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { platform } from '@kb-labs/core-runtime';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\nimport type {\n EventsQuery,\n EventsResponse,\n EventsStats,\n BufferStatus,\n DlqStatus,\n} from '@kb-labs/core-platform/adapters';\n\n/**\n * Register analytics routes\n *\n * These are system-level analytics endpoints that expose events and statistics\n * from the platform's analytics adapter (if configured).\n *\n * Returns 501 Not Implemented if analytics adapter doesn't support read methods.\n */\nexport async function registerAnalyticsRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n // GET /api/v1/analytics/events\n // Query analytics events with optional filters\n const eventsPaths = resolvePaths(basePath, '/analytics/events');\n for (const path of eventsPaths) {\n fastify.get<{\n Querystring: {\n type?: string | string[];\n source?: string;\n actor?: string;\n from?: string;\n to?: string;\n limit?: string;\n offset?: string;\n };\n }>(path, async (request, reply) => {\n try {\n const analytics = platform.analytics;\n\n // Check if analytics adapter supports read methods\n const getEvents = analytics.getEvents;\n if (!getEvents) {\n fastify.log.debug('Analytics adapter does not implement getEvents()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n // Build query from request params\n const query: EventsQuery = {};\n\n if (request.query.type !== undefined) {\n query.type = request.query.type;\n }\n if (request.query.source) {\n query.source = request.query.source;\n }\n if (request.query.actor) {\n query.actor = request.query.actor;\n }\n if (request.query.from) {\n query.from = request.query.from;\n }\n if (request.query.to) {\n query.to = request.query.to;\n }\n if (request.query.limit) {\n query.limit = Number.parseInt(request.query.limit, 10);\n }\n if (request.query.offset) {\n query.offset = Number.parseInt(request.query.offset, 10);\n }\n\n fastify.log.debug({ query }, 'Fetching analytics events');\n\n const response: EventsResponse = await restDomainOperationMetrics.observeOperation(\n 'analytics.events.query',\n () => getEvents.call(analytics, query),\n );\n\n fastify.log.debug(\n {\n total: response.total,\n count: response.events.length,\n hasMore: response.hasMore,\n },\n 'Analytics events fetched successfully'\n );\n\n return {\n ok: true,\n data: response,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics events', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch analytics events',\n },\n });\n }\n });\n }\n\n // GET /api/v1/analytics/stats\n // Get aggregated statistics\n const statsPaths = resolvePaths(basePath, '/analytics/stats');\n for (const path of statsPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const analytics = platform.analytics;\n\n const getStats = analytics.getStats;\n if (!getStats) {\n fastify.log.debug('Analytics adapter does not implement getStats()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading stats',\n },\n });\n }\n\n fastify.log.debug('Fetching analytics stats');\n\n // Cache stats for 60 seconds to avoid reprocessing 50k+ events on every request\n const cacheKey = 'analytics:stats';\n let stats = await platform.cache.get<EventsStats>(cacheKey);\n\n if (!stats) {\n fastify.log.debug('Cache miss, fetching stats from adapter');\n stats = await restDomainOperationMetrics.observeOperation('analytics.stats.get', () => getStats.call(analytics));\n await platform.cache.set(cacheKey, stats, 60 * 1000); // 60 second TTL\n } else {\n fastify.log.debug('Cache hit, returning cached stats');\n }\n\n fastify.log.debug(\n {\n totalEvents: stats.totalEvents,\n timeRange: stats.timeRange,\n },\n 'Analytics stats fetched successfully'\n );\n\n return {\n ok: true,\n data: stats,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics stats', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch analytics stats',\n },\n });\n }\n });\n }\n\n // GET /api/v1/analytics/buffer/status\n // Get WAL buffer status (if applicable)\n const bufferPaths = resolvePaths(basePath, '/analytics/buffer/status');\n for (const path of bufferPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const analytics = platform.analytics;\n\n const getBufferStatus = analytics.getBufferStatus;\n if (!getBufferStatus) {\n fastify.log.debug('Analytics adapter does not implement getBufferStatus()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support buffer status',\n },\n });\n }\n\n fastify.log.debug('Fetching analytics buffer status');\n\n const status: BufferStatus | null = await restDomainOperationMetrics.observeOperation(\n 'analytics.buffer.status',\n () => getBufferStatus.call(analytics),\n );\n\n if (status === null) {\n fastify.log.debug('Buffer status not applicable for current analytics backend');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'BUFFER_NOT_APPLICABLE',\n message: 'Buffer status not applicable for current analytics backend',\n },\n });\n }\n\n fastify.log.debug(\n {\n segments: status.segments,\n totalSizeBytes: status.totalSizeBytes,\n },\n 'Analytics buffer status fetched successfully'\n );\n\n return {\n ok: true,\n data: status,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics buffer status', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to fetch analytics buffer status',\n },\n });\n }\n });\n }\n\n // GET /api/v1/analytics/dlq/status\n // Get Dead-Letter Queue status (if applicable)\n const dlqPaths = resolvePaths(basePath, '/analytics/dlq/status');\n for (const path of dlqPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const analytics = platform.analytics;\n\n const getDlqStatus = analytics.getDlqStatus;\n if (!getDlqStatus) {\n fastify.log.debug('Analytics adapter does not implement getDlqStatus()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support DLQ status',\n },\n });\n }\n\n fastify.log.debug('Fetching analytics DLQ status');\n\n const status: DlqStatus | null = await restDomainOperationMetrics.observeOperation(\n 'analytics.dlq.status',\n () => getDlqStatus.call(analytics),\n );\n\n if (status === null) {\n fastify.log.debug('DLQ status not applicable for current analytics backend');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DLQ_NOT_APPLICABLE',\n message: 'DLQ status not applicable for current analytics backend',\n },\n });\n }\n\n fastify.log.debug(\n {\n failedEvents: status.failedEvents,\n oldestFailureTs: status.oldestFailureTs,\n },\n 'Analytics DLQ status fetched successfully'\n );\n\n return {\n ok: true,\n data: status,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics DLQ status', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message:\n error instanceof Error ? error.message : 'Failed to fetch analytics DLQ status',\n },\n });\n }\n });\n }\n\n fastify.log.info('Analytics routes registered');\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/adapters\n * Platform adapter analytics endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { IAnalytics } from '@kb-labs/core-platform';\nimport type { AnalyticsEvent } from '@kb-labs/core-platform/adapters';\n\n/**\n * LLM usage statistics response\n */\ninterface LLMUsageStats {\n totalRequests: number;\n totalTokens: number;\n totalCost: number;\n costPer1KTokens: number; // Enhanced: Cost efficiency metric\n // Cache savings\n totalCacheReadTokens: number;\n totalBillableTokens: number;\n totalCacheSavingsUsd: number;\n byModel: Record<\n string,\n {\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n cost: number;\n costPer1KTokens: number; // Enhanced: Cost per 1K tokens for this model\n tokensPerRequest: number; // Enhanced: Average tokens per request\n errorRate: number; // Enhanced: Error rate percentage (0-100)\n avgDurationMs: number;\n // Enhanced: Latency percentiles\n p50DurationMs: number;\n p95DurationMs: number;\n p99DurationMs: number;\n // Cache savings per model\n cacheReadTokens: number;\n billableTokens: number;\n cacheSavingsUsd: number;\n }\n >;\n errors: number;\n // Enhanced: Error breakdown by type\n errorBreakdown: {\n timeout: number;\n rateLimit: number;\n invalidRequest: number;\n serverError: number;\n other: number;\n };\n timeRange: {\n from: string;\n to: string;\n };\n}\n\n/** Analytics event extended with legacy `properties` field */\ntype AnyAnalyticsEvent = AnalyticsEvent & { properties?: Record<string, unknown> };\n\n/**\n * Helper to get event data, supporting both kb.v1 (payload) and legacy (properties) formats\n */\nfunction getEventData(event: AnyAnalyticsEvent): Record<string, unknown> {\n // kb.v1 format uses 'payload'\n if (event.schema === 'kb.v1' && event.payload) {\n return event.payload as Record<string, unknown>;\n }\n // Legacy format uses 'properties'\n return event.properties ?? {};\n}\n\n/**\n * Extract date range from query parameters\n */\nfunction extractDateRange(query: unknown): { from?: string; to?: string } {\n // Handle null/undefined query\n if (!query || typeof query !== 'object') {\n return { from: undefined, to: undefined };\n }\n const q = query as Record<string, unknown>;\n\n const from = q.from as string | undefined;\n const to = q.to as string | undefined;\n\n // Validate ISO 8601 format\n if (from && !isValidISODate(from)) {\n throw new Error('Invalid \"from\" date format. Expected ISO 8601 datetime (e.g., 2026-01-01T00:00:00Z)');\n }\n if (to && !isValidISODate(to)) {\n throw new Error('Invalid \"to\" date format. Expected ISO 8601 datetime (e.g., 2026-01-31T23:59:59Z)');\n }\n\n return { from, to };\n}\n\n/**\n * Extract model filter from query parameters\n * Supports both single model (?models=gpt-4) and multiple (?models=gpt-4,claude-sonnet)\n */\nfunction extractModelFilter(query: unknown): string[] | undefined {\n if (!query || typeof query !== 'object') {\n return undefined;\n }\n const q = query as Record<string, unknown>;\n if (!q.models) {\n return undefined;\n }\n\n const modelsParam = q.models as string;\n\n // Split by comma and trim whitespace\n const models = modelsParam\n .split(',')\n .map((m) => m.trim())\n .filter((m) => m.length > 0);\n\n return models.length > 0 ? models : undefined;\n}\n\n/**\n * Extract StatsQuery fields (groupBy, breakdownBy, metrics) from query parameters.\n * These are optional — adapters silently ignore fields they don't support.\n */\nfunction extractStatsOptions(query: unknown): {\n groupBy?: 'hour' | 'day' | 'week' | 'month';\n breakdownBy?: string;\n metrics?: string[];\n} {\n if (!query || typeof query !== 'object') {return {};}\n const q = query as Record<string, unknown>;\n\n const groupBy = q.groupBy as string | undefined;\n const validGroupBy = ['hour', 'day', 'week', 'month'];\n const resolvedGroupBy =\n groupBy && validGroupBy.includes(groupBy)\n ? (groupBy as 'hour' | 'day' | 'week' | 'month')\n : undefined;\n\n const breakdownBy = q.breakdownBy as string | undefined;\n\n const metricsParam = q.metrics as string | undefined;\n const metrics = metricsParam\n ? metricsParam\n .split(',')\n .map((m) => m.trim())\n .filter((m) => m.length > 0)\n : undefined;\n\n return {\n groupBy: resolvedGroupBy,\n breakdownBy: breakdownBy || undefined,\n metrics: metrics && metrics.length > 0 ? metrics : undefined,\n };\n}\n\n/**\n * Fetch all events for a given query in batches to avoid memory issues.\n *\n * Backend handles pagination internally:\n * - PAGE_SIZE: 10,000 events per request\n * - MAX_EVENTS: 100,000 total events to process\n *\n * Frontend just sends date range, backend fetches all events in that range.\n *\n * @param analytics - Analytics adapter\n * @param query - Event query (type, from, to)\n * @param fastify - Fastify instance for logging\n * @returns All events (up to MAX_EVENTS)\n */\nasync function fetchAllEventsBatched(\n analytics: IAnalytics,\n query: { type: string | string[]; from?: string; to?: string },\n fastify: FastifyInstance\n): Promise<AnyAnalyticsEvent[]> {\n const PAGE_SIZE = 10000;\n const MAX_EVENTS = 100000;\n\n const allEvents: AnyAnalyticsEvent[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore && allEvents.length < MAX_EVENTS) {\n const response = await analytics.getEvents!({\n ...query,\n limit: PAGE_SIZE,\n offset,\n });\n\n allEvents.push(...response.events);\n hasMore = response.hasMore;\n offset += PAGE_SIZE;\n\n // Stop if we've fetched all events or page not full\n if (!hasMore || response.events.length < PAGE_SIZE) {\n break;\n }\n }\n\n // Warn if we hit the safety limit\n if (allEvents.length >= MAX_EVENTS) {\n fastify.log.warn({ query }, `Hit max events limit (${MAX_EVENTS}) for query. Some events excluded from stats.`);\n }\n\n return allEvents;\n}\n\n/**\n * Basic ISO 8601 validation\n */\nfunction isValidISODate(dateString: string): boolean {\n // Check if it's a string\n if (typeof dateString !== 'string' || dateString.length === 0) {\n return false;\n }\n\n const date = new Date(dateString);\n return !isNaN(date.getTime());\n}\n\n/**\n * Register platform adapter analytics routes\n */\nexport async function registerAdaptersRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n // GET /api/v1/adapters/llm/usage\n // Returns aggregated LLM usage statistics\n const llmUsagePaths = resolvePaths(basePath, '/adapters/llm/usage');\n for (const path of llmUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n // Check if analytics supports reading\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n // Fetch ALL LLM completion events in batches (backend handles pagination)\n const completedEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['llm.completion.completed', 'llm.chatWithTools.completed'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n // Fetch ALL error events in batches\n const errorEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['llm.completion.error', 'llm.chatWithTools.error'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n // Aggregate statistics\n const stats: LLMUsageStats = {\n totalRequests: 0,\n totalTokens: 0,\n totalCost: 0,\n costPer1KTokens: 0,\n totalCacheReadTokens: 0,\n totalBillableTokens: 0,\n totalCacheSavingsUsd: 0,\n byModel: {},\n errors: errorEvents.length,\n errorBreakdown: {\n timeout: 0,\n rateLimit: 0,\n invalidRequest: 0,\n serverError: 0,\n other: 0,\n },\n timeRange: {\n from: '',\n to: '',\n },\n };\n\n // Collect durations per model for percentile calculation\n const durationsByModel: Record<string, number[]> = {};\n\n // Track errors per model\n const errorsByModel: Record<string, number> = {};\n\n // Process completed events\n for (const event of completedEvents) {\n const props = getEventData(event);\n\n const model = (props.model || 'unknown') as string;\n const promptTokens = Number(props.promptTokens || 0);\n const completionTokens = Number(props.completionTokens || 0);\n const totalTokens = Number(props.totalTokens || promptTokens + completionTokens);\n const estimatedCost = Number(props.estimatedCost || 0);\n const durationMs = Number(props.durationMs || 0);\n const cacheReadTokens = Number(props.cacheReadTokens || 0);\n const billableTokens = Number(props.billableTotalTokens || totalTokens);\n const cacheSavingsUsd = Number(props.estimatedCacheSavingsUsd || 0);\n\n stats.totalRequests++;\n stats.totalTokens += totalTokens;\n stats.totalCost += estimatedCost;\n stats.totalCacheReadTokens += cacheReadTokens;\n stats.totalBillableTokens += billableTokens;\n stats.totalCacheSavingsUsd += cacheSavingsUsd;\n\n if (!stats.byModel[model]) {\n stats.byModel[model] = {\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: 0,\n costPer1KTokens: 0,\n tokensPerRequest: 0,\n errorRate: 0,\n avgDurationMs: 0,\n p50DurationMs: 0,\n p95DurationMs: 0,\n p99DurationMs: 0,\n cacheReadTokens: 0,\n billableTokens: 0,\n cacheSavingsUsd: 0,\n };\n durationsByModel[model] = [];\n }\n\n const modelStats = stats.byModel[model]!;\n modelStats.requests++;\n modelStats.promptTokens += promptTokens;\n modelStats.completionTokens += completionTokens;\n modelStats.totalTokens += totalTokens;\n modelStats.cost += estimatedCost;\n modelStats.cacheReadTokens += cacheReadTokens;\n modelStats.billableTokens += billableTokens;\n modelStats.cacheSavingsUsd += cacheSavingsUsd;\n modelStats.avgDurationMs =\n (modelStats.avgDurationMs * (modelStats.requests - 1) + durationMs) / modelStats.requests;\n\n // Collect duration for percentile calculation\n durationsByModel[model]!.push(durationMs);\n }\n\n // Process error events for breakdown\n for (const event of errorEvents) {\n const props = getEventData(event);\n const errorType = String(props.errorType || props.errorCode || '').toLowerCase();\n const errorMessage = String(props.error || props.message || '').toLowerCase();\n const model = (props.model || 'unknown') as string;\n\n // Track errors per model\n errorsByModel[model] = (errorsByModel[model] || 0) + 1;\n\n // Categorize error by type\n if (errorType.includes('timeout') || errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n stats.errorBreakdown.timeout++;\n } else if (errorType.includes('rate') || errorType.includes('quota') || errorMessage.includes('rate limit') || errorMessage.includes('quota exceeded')) {\n stats.errorBreakdown.rateLimit++;\n } else if (errorType.includes('invalid') || errorType.includes('validation') || errorMessage.includes('invalid request') || errorMessage.includes('bad request')) {\n stats.errorBreakdown.invalidRequest++;\n } else if (errorType.includes('server') || errorType.includes('5xx') || errorMessage.includes('internal error') || errorMessage.includes('server error')) {\n stats.errorBreakdown.serverError++;\n } else {\n stats.errorBreakdown.other++;\n }\n }\n\n // Calculate percentiles and cost per 1K tokens for each model\n for (const [model, durations] of Object.entries(durationsByModel)) {\n const modelStats = stats.byModel[model]!;\n\n // Calculate percentiles\n if (durations.length > 0) {\n const sorted = durations.slice().sort((a, b) => a - b);\n const p50Index = Math.floor(sorted.length * 0.5);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p99Index = Math.floor(sorted.length * 0.99);\n\n modelStats.p50DurationMs = sorted[p50Index] ?? 0;\n modelStats.p95DurationMs = sorted[p95Index] ?? 0;\n modelStats.p99DurationMs = sorted[p99Index] ?? 0;\n }\n\n // Calculate cost per 1K tokens\n if (modelStats.totalTokens > 0) {\n modelStats.costPer1KTokens = (modelStats.cost / modelStats.totalTokens) * 1000;\n }\n\n // Calculate tokens per request\n if (modelStats.requests > 0) {\n modelStats.tokensPerRequest = modelStats.totalTokens / modelStats.requests;\n }\n\n // Calculate error rate percentage\n const modelErrors = errorsByModel[model] || 0;\n const totalModelRequests = modelStats.requests + modelErrors;\n if (totalModelRequests > 0) {\n modelStats.errorRate = (modelErrors / totalModelRequests) * 100;\n }\n }\n\n // Calculate overall cost per 1K tokens\n if (stats.totalTokens > 0) {\n stats.costPer1KTokens = (stats.totalCost / stats.totalTokens) * 1000;\n }\n\n // Calculate time range\n const allTimestamps = completedEvents.map((e) => e.ts);\n if (allTimestamps.length > 0) {\n stats.timeRange.from = allTimestamps[allTimestamps.length - 1]!; // oldest\n stats.timeRange.to = allTimestamps[0]!; // newest\n }\n\n return {\n ok: true,\n data: stats,\n meta: {\n source: 'analytics-adapter',\n totalEvents: completedEvents.length,\n },\n };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch LLM usage stats', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'LLM_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch LLM usage statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/llm/daily-stats\n // Returns time-bucketed aggregated LLM statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv), models (csv, legacy filter)\n const llmDailyStatsPaths = resolvePaths(basePath, '/adapters/llm/daily-stats');\n for (const path of llmDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n const modelFilter = extractModelFilter(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['llm.completion.completed', 'llm.chatWithTools.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n // Legacy ?models= filter maps to source filter via getEvents inside the adapter.\n // When breakdownBy is provided explicitly it takes precedence.\n // Models filter is handled post-aggregation below for backward compat.\n ...statsOptions,\n });\n\n // Legacy model filter: post-filter rows by breakdown value when models param is used\n // without an explicit breakdownBy (backward compatibility with existing Studio pages)\n const result =\n modelFilter && modelFilter.length > 0 && !statsOptions.breakdownBy\n ? dailyStats.filter((s) => !s.breakdown || modelFilter.includes(s.breakdown))\n : dailyStats;\n\n return reply.send({ ok: true, data: result });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/embeddings/daily-stats\n // Returns time-bucketed aggregated Embeddings statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const embeddingsDailyStatsPaths = resolvePaths(basePath, '/adapters/embeddings/daily-stats');\n for (const path of embeddingsDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['embeddings.embed.completed', 'embeddings.embedBatch.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/embeddings/usage\n // Returns aggregated Embeddings usage statistics\n const embeddingsUsagePaths = resolvePaths(basePath, '/adapters/embeddings/usage');\n for (const path of embeddingsUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const completedEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['embeddings.embed.completed', 'embeddings.embedBatch.completed'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const errorEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['embeddings.embed.error', 'embeddings.embedBatch.error'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const stats = {\n totalRequests: completedEvents.length,\n totalTextLength: 0,\n totalCost: 0,\n costPer1KChars: 0, // Enhanced: Cost efficiency metric\n errors: errorEvents.length,\n // Enhanced: Error breakdown by type\n errorBreakdown: {\n timeout: 0,\n rateLimit: 0,\n invalidRequest: 0,\n serverError: 0,\n other: 0,\n },\n avgDurationMs: 0,\n // Enhanced: Latency percentiles\n p50DurationMs: 0,\n p95DurationMs: 0,\n p99DurationMs: 0,\n batchRequests: 0,\n singleRequests: 0,\n avgBatchSize: 0,\n };\n\n let totalDuration = 0;\n let totalBatchSize = 0;\n const durations: number[] = [];\n\n for (const event of completedEvents) {\n const props = getEventData(event);\n\n const textLength = Number(props.textLength || props.totalTextLength || 0);\n const cost = Number(props.estimatedCost || 0);\n const duration = Number(props.durationMs || 0);\n const batchSize = Number(props.batchSize || 1);\n\n stats.totalTextLength += textLength;\n stats.totalCost += cost;\n totalDuration += duration;\n durations.push(duration);\n\n if (batchSize > 1) {\n stats.batchRequests++;\n totalBatchSize += batchSize;\n } else {\n stats.singleRequests++;\n }\n }\n\n stats.avgDurationMs = stats.totalRequests > 0 ? totalDuration / stats.totalRequests : 0;\n stats.avgBatchSize = stats.batchRequests > 0 ? totalBatchSize / stats.batchRequests : 0;\n\n // Calculate percentiles\n if (durations.length > 0) {\n const sorted = durations.slice().sort((a, b) => a - b);\n const p50Index = Math.floor(sorted.length * 0.5);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p99Index = Math.floor(sorted.length * 0.99);\n\n stats.p50DurationMs = sorted[p50Index] ?? 0;\n stats.p95DurationMs = sorted[p95Index] ?? 0;\n stats.p99DurationMs = sorted[p99Index] ?? 0;\n }\n\n // Calculate cost per 1K characters\n if (stats.totalTextLength > 0) {\n stats.costPer1KChars = (stats.totalCost / stats.totalTextLength) * 1000;\n }\n\n // Process error events for breakdown\n for (const event of errorEvents) {\n const props = getEventData(event);\n const errorType = String(props.errorType || props.errorCode || '').toLowerCase();\n const errorMessage = String(props.error || props.message || '').toLowerCase();\n\n // Categorize error by type\n if (errorType.includes('timeout') || errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n stats.errorBreakdown.timeout++;\n } else if (errorType.includes('rate') || errorType.includes('quota') || errorMessage.includes('rate limit') || errorMessage.includes('quota exceeded')) {\n stats.errorBreakdown.rateLimit++;\n } else if (errorType.includes('invalid') || errorType.includes('validation') || errorMessage.includes('invalid request') || errorMessage.includes('bad request')) {\n stats.errorBreakdown.invalidRequest++;\n } else if (errorType.includes('server') || errorType.includes('5xx') || errorMessage.includes('internal error') || errorMessage.includes('server error')) {\n stats.errorBreakdown.serverError++;\n } else {\n stats.errorBreakdown.other++;\n }\n }\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch Embeddings usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'EMBEDDINGS_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch embeddings statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/vectorstore/daily-stats\n // Returns time-bucketed aggregated VectorStore statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const vectorstoreDailyStatsPaths = resolvePaths(basePath, '/adapters/vectorstore/daily-stats');\n for (const path of vectorstoreDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['vectorstore.search.completed', 'vectorstore.upsert.completed', 'vectorstore.delete.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/vectorstore/usage\n // Returns aggregated VectorStore usage statistics\n const vectorstoreUsagePaths = resolvePaths(basePath, '/adapters/vectorstore/usage');\n for (const path of vectorstoreUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const searchEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'vectorstore.search.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const upsertEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'vectorstore.upsert.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const deleteEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'vectorstore.delete.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const stats = {\n searchQueries: searchEvents.length,\n upsertOperations: upsertEvents.length,\n deleteOperations: deleteEvents.length,\n avgSearchDuration: 0,\n // Enhanced: Search latency percentiles\n p50SearchDuration: 0,\n p95SearchDuration: 0,\n p99SearchDuration: 0,\n avgSearchScore: 0,\n avgResultsCount: 0,\n totalVectorsUpserted: 0,\n totalVectorsDeleted: 0,\n };\n\n let totalSearchDuration = 0;\n let totalSearchScore = 0;\n let totalResultsCount = 0;\n const searchDurations: number[] = [];\n\n for (const event of searchEvents) {\n const props = getEventData(event);\n\n const duration = Number(props.durationMs || 0);\n const avgScore = Number(props.avgScore || 0);\n const resultsCount = Number(props.resultsCount || 0);\n\n totalSearchDuration += duration;\n totalSearchScore += avgScore;\n totalResultsCount += resultsCount;\n searchDurations.push(duration);\n }\n\n stats.avgSearchDuration = stats.searchQueries > 0 ? totalSearchDuration / stats.searchQueries : 0;\n stats.avgSearchScore = stats.searchQueries > 0 ? totalSearchScore / stats.searchQueries : 0;\n stats.avgResultsCount = stats.searchQueries > 0 ? totalResultsCount / stats.searchQueries : 0;\n\n // Calculate search latency percentiles\n if (searchDurations.length > 0) {\n const sorted = searchDurations.slice().sort((a, b) => a - b);\n const p50Index = Math.floor(sorted.length * 0.5);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p99Index = Math.floor(sorted.length * 0.99);\n\n stats.p50SearchDuration = sorted[p50Index] ?? 0;\n stats.p95SearchDuration = sorted[p95Index] ?? 0;\n stats.p99SearchDuration = sorted[p99Index] ?? 0;\n }\n\n for (const event of upsertEvents) {\n const props = getEventData(event);\n stats.totalVectorsUpserted += Number(props.vectorCount || 0);\n }\n\n for (const event of deleteEvents) {\n const props = getEventData(event);\n stats.totalVectorsDeleted += Number(props.idsCount || 0);\n }\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch VectorStore usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'VECTORSTORE_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch vectorstore statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/cache/daily-stats\n // Returns time-bucketed aggregated Cache statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const cacheDailyStatsPaths = resolvePaths(basePath, '/adapters/cache/daily-stats');\n for (const path of cacheDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['cache.get.hit', 'cache.get.miss', 'cache.set.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/cache/usage\n // Returns aggregated Cache usage statistics\n const cacheUsagePaths = resolvePaths(basePath, '/adapters/cache/usage');\n for (const path of cacheUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const hitEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'cache.get.hit',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const missEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'cache.get.miss',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const setEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'cache.set.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const totalGets = hitEvents.length + missEvents.length;\n const hitRate = totalGets > 0 ? (hitEvents.length / totalGets) * 100 : 0;\n\n const stats = {\n totalGets,\n hits: hitEvents.length,\n misses: missEvents.length,\n hitRate,\n sets: setEvents.length,\n avgGetDuration: 0,\n avgSetDuration: 0,\n };\n\n let totalGetDuration = 0;\n for (const event of [...hitEvents, ...missEvents]) {\n const props = getEventData(event);\n totalGetDuration += Number(props.durationMs || 0);\n }\n stats.avgGetDuration = totalGets > 0 ? totalGetDuration / totalGets : 0;\n\n let totalSetDuration = 0;\n for (const event of setEvents) {\n const props = getEventData(event);\n totalSetDuration += Number(props.durationMs || 0);\n }\n stats.avgSetDuration = stats.sets > 0 ? totalSetDuration / stats.sets : 0;\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch Cache usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'CACHE_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch cache statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/storage/daily-stats\n // Returns time-bucketed aggregated Storage statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const storageDailyStatsPaths = resolvePaths(basePath, '/adapters/storage/daily-stats');\n for (const path of storageDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['storage.read.completed', 'storage.write.completed', 'storage.delete.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/storage/usage\n // Returns aggregated Storage usage statistics\n const storageUsagePaths = resolvePaths(basePath, '/adapters/storage/usage');\n for (const path of storageUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const readEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'storage.read.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const writeEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'storage.write.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const deleteEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'storage.delete.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const stats = {\n readOperations: readEvents.length,\n writeOperations: writeEvents.length,\n deleteOperations: deleteEvents.length,\n totalBytesRead: 0,\n totalBytesWritten: 0,\n avgReadDuration: 0,\n avgWriteDuration: 0,\n };\n\n let totalReadDuration = 0;\n for (const event of readEvents) {\n const props = getEventData(event);\n stats.totalBytesRead += Number(props.bytesRead || 0);\n totalReadDuration += Number(props.durationMs || 0);\n }\n stats.avgReadDuration = stats.readOperations > 0 ? totalReadDuration / stats.readOperations : 0;\n\n let totalWriteDuration = 0;\n for (const event of writeEvents) {\n const props = getEventData(event);\n stats.totalBytesWritten += Number(props.bytesWritten || 0);\n totalWriteDuration += Number(props.durationMs || 0);\n }\n stats.avgWriteDuration = stats.writeOperations > 0 ? totalWriteDuration / stats.writeOperations : 0;\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch Storage usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'STORAGE_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch storage statistics',\n },\n });\n }\n });\n }\n\n fastify.log.info('Platform adapter routes registered');\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/logs\n * Live log streaming and querying endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { LogQuery, LogRecord, LogLevel } from '@kb-labs/core-platform';\nimport type { EventHub } from '../events/hub';\n\n/** Frontend-shaped log record returned by toFrontendLogRecord */\ninterface FrontendLogRecord {\n id: string;\n time: string;\n level: string;\n msg: string;\n plugin?: string;\n [key: string]: unknown;\n}\n\n/** Statistics shape used in summarization */\ninterface LogStats {\n total: number;\n byLevel: Record<string, number>;\n byPlugin: Record<string, number>;\n topErrors: Array<{ message: string; count: number }>;\n timeRange: { from: string | null; to: string | null };\n}\n\n/** Error entry shape used in topErrors iteration */\ninterface TopError {\n message: string;\n count: number;\n}\n\n/**\n * Map Pino numeric level to string level\n */\nfunction mapPinoLevelToString(level: number | string): string {\n if (typeof level === 'string') {return level;}\n\n // Pino levels: 10=trace, 20=debug, 30=info, 40=warn, 50=error, 60=fatal\n if (level <= 10) {return 'trace';}\n if (level <= 20) {return 'debug';}\n if (level <= 30) {return 'info';}\n if (level <= 40) {return 'warn';}\n if (level <= 50) {return 'error';}\n return 'fatal';\n}\n\n/**\n * Convert internal LogRecord to frontend LogRecord format\n */\nfunction toFrontendLogRecord(record: LogRecord): FrontendLogRecord {\n // Extract level from fields if it's a Pino log (numeric level)\n const pinoLevel = record.fields.level;\n const levelStr = typeof pinoLevel === 'number'\n ? mapPinoLevelToString(pinoLevel)\n : record.level;\n\n // Ensure message is a string\n const messageStr = typeof record.message === 'string'\n ? record.message\n : JSON.stringify(record.message);\n\n // Remove 'level' and 'time' from fields to avoid overwriting our converted values\n const { level: _level, time: _time, ...restFields } = record.fields;\n\n return {\n id: record.id, // Include ID for navigation to detail page\n time: new Date(record.timestamp).toISOString(),\n level: levelStr,\n msg: messageStr,\n ...restFields,\n };\n}\n\n/**\n * Build LLM prompt for log summarization\n */\nfunction buildLogSummaryPrompt(\n question: string,\n logs: FrontendLogRecord[],\n stats: LogStats,\n includeContext: { errors?: boolean; warnings?: boolean; info?: boolean; metadata?: boolean; stackTraces?: boolean }\n): string {\n let prompt = `You are analyzing application logs. User question: \"${question}\"\\n\\n`;\n\n // Add statistics\n prompt += `Statistics:\\n`;\n prompt += `Total logs: ${stats.total}\\n`;\n prompt += `Errors: ${stats.byLevel.error || 0}\\n`;\n prompt += `Warnings: ${stats.byLevel.warn || 0}\\n`;\n prompt += `Info: ${stats.byLevel.info || 0}\\n`;\n\n if (stats.timeRange.from && stats.timeRange.to) {\n prompt += `Time range: ${stats.timeRange.from} to ${stats.timeRange.to}\\n`;\n }\n\n if (stats.topErrors.length > 0) {\n prompt += `\\nTop Errors:\\n`;\n stats.topErrors.slice(0, 5).forEach((err: TopError, idx: number) => {\n prompt += `${idx + 1}. \"${err.message}\" (${err.count} occurrences)\\n`;\n });\n }\n\n // Filter logs based on includeContext\n const relevantLogs = logs.filter(log => {\n if (!includeContext.errors && log.level === 'error') {return false;}\n if (!includeContext.warnings && log.level === 'warn') {return false;}\n if (!includeContext.info && log.level === 'info') {return false;}\n return true;\n });\n\n // Add log entries (limit to 100 most recent)\n prompt += `\\nLog Entries (${Math.min(relevantLogs.length, 100)} most recent):\\n`;\n relevantLogs.slice(-100).forEach(log => {\n prompt += `[${log.time}] ${log.level.toUpperCase()}`;\n\n if (includeContext.metadata && log.plugin) {\n prompt += ` [${log.plugin}]`;\n }\n\n prompt += `: ${log.msg || '(no message)'}\\n`;\n\n if (includeContext.metadata && (log.traceId || log.executionId)) {\n if (log.traceId) {prompt += ` traceId: ${log.traceId}\\n`;}\n if (log.executionId) {prompt += ` executionId: ${log.executionId}\\n`;}\n }\n\n const logErr = log.err as { stack?: string } | undefined;\n if (includeContext.stackTraces && logErr?.stack) {\n prompt += ` stack: ${logErr.stack.split('\\n').slice(0, 5).join('\\n ')}\\n`;\n }\n });\n\n // Add instructions\n prompt += `\\nInstructions:\\n`;\n prompt += `Provide a clear, concise summary answering the user's question as plain text. Focus on:\\n`;\n prompt += `1. What happened (timeline of events)\\n`;\n prompt += `2. Root causes if errors are present\\n`;\n prompt += `3. Patterns or trends you notice\\n`;\n prompt += `4. Actionable recommendations if applicable\\n`;\n prompt += `\\nKeep the summary under 300 words. Use simple paragraphs separated by double newlines. Do not use markdown formatting (no **, ##, -, or other markdown syntax). Write in clear, professional language.\\n`;\n\n return prompt;\n}\n\n/**\n * Extract correlation keys from log for finding related logs\n */\nfunction extractCorrelationKeys(log: LogRecord): {\n requestId?: string;\n traceId?: string;\n executionId?: string;\n sessionId?: string;\n} {\n return {\n requestId: log.fields.requestId as string | undefined ??\n log.fields.reqId as string | undefined,\n traceId: log.fields.traceId as string | undefined,\n executionId: log.fields.executionId as string | undefined,\n sessionId: log.fields.sessionId as string | undefined,\n };\n}\n\n/**\n * Find logs related to the given log\n * Strategy:\n * 1. Try requestId/traceId/executionId (most specific)\n * 2. Fallback to time window + same source\n */\nasync function findRelatedLogs(targetLog: LogRecord): Promise<FrontendLogRecord[]> {\n const correlationKeys = extractCorrelationKeys(targetLog);\n const timeWindow = 60000; // 1 minute before/after\n\n // Strategy 1: Find by correlation IDs (most precise)\n if (correlationKeys.requestId || correlationKeys.traceId || correlationKeys.executionId) {\n const relatedLogs: LogRecord[] = [];\n\n // Query all logs in time window\n const result = await platform.logs.query({\n from: targetLog.timestamp - timeWindow,\n to: targetLog.timestamp + timeWindow,\n }, {\n limit: 1000,\n });\n\n // Filter in-memory by correlation keys\n for (const log of result.logs) {\n if (log.id === targetLog.id) {continue;} // Skip self\n\n const logKeys = extractCorrelationKeys(log);\n\n // Match any correlation key\n if (\n (correlationKeys.requestId && logKeys.requestId === correlationKeys.requestId) ||\n (correlationKeys.traceId && logKeys.traceId === correlationKeys.traceId) ||\n (correlationKeys.executionId && logKeys.executionId === correlationKeys.executionId) ||\n (correlationKeys.sessionId && logKeys.sessionId === correlationKeys.sessionId)\n ) {\n relatedLogs.push(log);\n }\n }\n\n if (relatedLogs.length > 0) {\n return relatedLogs\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(toFrontendLogRecord);\n }\n }\n\n // Strategy 2: Fallback to time window + same source\n const result = await platform.logs.query({\n source: targetLog.source,\n from: targetLog.timestamp - timeWindow,\n to: targetLog.timestamp + timeWindow,\n }, {\n limit: 50,\n });\n\n return result.logs\n .filter(log => log.id !== targetLog.id)\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(toFrontendLogRecord);\n}\n\n/**\n * Generate fallback summary when LLM is unavailable\n */\nfunction generateFallbackSummary(stats: LogStats, logs: FrontendLogRecord[]): string {\n let summary = `Log Summary\\n\\n`;\n\n summary += `Total Logs: ${stats.total}\\n\\n`;\n\n // Level breakdown\n summary += `By Level:\\n`;\n Object.entries(stats.byLevel).forEach(([level, count]) => {\n summary += `${level}: ${count}\\n`;\n });\n summary += `\\n`;\n\n // Plugin breakdown\n if (Object.keys(stats.byPlugin).length > 0) {\n summary += `By Plugin:\\n`;\n Object.entries(stats.byPlugin)\n .sort((a: [string, unknown], b: [string, unknown]) => (b[1] as number) - (a[1] as number))\n .slice(0, 5)\n .forEach(([plugin, count]) => {\n summary += `${plugin}: ${count}\\n`;\n });\n summary += `\\n`;\n }\n\n // Top errors\n if (stats.topErrors.length > 0) {\n summary += `Top Errors:\\n`;\n stats.topErrors.slice(0, 5).forEach((err: TopError, idx: number) => {\n summary += `${idx + 1}. \"${err.message}\" (${err.count} times)\\n`;\n });\n summary += `\\n`;\n }\n\n // Time range\n if (stats.timeRange.from && stats.timeRange.to) {\n summary += `Time Range: ${stats.timeRange.from} to ${stats.timeRange.to}\\n\\n`;\n }\n\n summary += `Note: LLM summarization is not available. This is a basic statistical summary.`;\n\n return summary;\n}\n\n/**\n * Register log observability routes\n */\nexport async function registerLogRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n eventHub: EventHub\n): Promise<void> {\n /**\n * GET /api/v1/logs\n * Query logs with filters\n */\n server.get<{\n Querystring: {\n from?: string;\n to?: string;\n level?: string;\n plugin?: string;\n executionId?: string;\n tenantId?: string;\n search?: string;\n limit?: string;\n offset?: string;\n };\n }>('/api/v1/logs', { schema: { tags: ['Logs'], summary: 'Query logs with filters' } }, async (request, reply) => {\n try {\n // Parse numeric query params (Fastify doesn't parse them automatically)\n const limit = request.query.limit ? parseInt(request.query.limit, 10) : 100;\n const offset = request.query.offset ? parseInt(request.query.offset, 10) : 0;\n\n // Build query from request params\n const query: LogQuery = {\n level: request.query.level as LogLevel,\n source: request.query.plugin,\n from: request.query.from ? new Date(request.query.from).getTime() : undefined,\n to: request.query.to ? new Date(request.query.to).getTime() : undefined,\n };\n\n // Query logs using unified service\n let result;\n if (request.query.search) {\n // Use full-text search if search query provided\n result = await platform.logs.search(request.query.search, {\n limit,\n offset,\n });\n } else {\n // Regular query with filters\n result = await platform.logs.query(query, {\n limit,\n offset,\n });\n }\n\n // Convert to frontend format\n const frontendLogs = result.logs.map(toFrontendLogRecord);\n\n // Get stats for response metadata\n const stats = await platform.logs.getStats();\n\n return {\n ok: true,\n data: {\n logs: frontendLogs,\n total: result.total,\n hasMore: result.hasMore,\n filters: request.query,\n source: 'source' in result ? result.source : undefined,\n stats: {\n buffer: stats.buffer ? {\n size: stats.buffer.size,\n maxSize: stats.buffer.maxSize,\n oldest: stats.buffer.oldestTimestamp ? new Date(stats.buffer.oldestTimestamp).toISOString() : undefined,\n newest: stats.buffer.newestTimestamp ? new Date(stats.buffer.newestTimestamp).toISOString() : undefined,\n } : undefined,\n persistence: stats.persistence ? {\n totalLogs: stats.persistence.totalLogs,\n oldestTimestamp: stats.persistence.oldestTimestamp ? new Date(stats.persistence.oldestTimestamp).toISOString() : undefined,\n newestTimestamp: stats.persistence.newestTimestamp ? new Date(stats.persistence.newestTimestamp).toISOString() : undefined,\n sizeBytes: stats.persistence.sizeBytes,\n } : undefined,\n },\n },\n };\n } catch (error: unknown) {\n return reply.code(503).send({\n ok: false,\n error: 'Log query failed',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n });\n\n /**\n * GET /api/v1/logs/:id\n * Get single log by ID with related logs\n */\n server.get<{\n Params: { id: string };\n Querystring: { includeRelated?: string };\n }>(\n '/api/v1/logs/:id',\n { schema: { tags: ['Logs'], summary: 'Get log entry by ID' } },\n async (request, reply) => {\n try {\n const log = await platform.logs.getById(request.params.id);\n\n if (!log) {\n return reply.code(404).send({\n ok: false,\n error: 'Log not found',\n message: `Log with ID '${request.params.id}' does not exist`,\n });\n }\n\n const frontendLog = toFrontendLogRecord(log);\n\n // Optionally include related logs\n let relatedLogs: FrontendLogRecord[] = [];\n if (request.query.includeRelated === 'true') {\n relatedLogs = await findRelatedLogs(log);\n }\n\n return {\n ok: true,\n data: {\n log: frontendLog,\n related: relatedLogs.length > 0 ? relatedLogs : undefined,\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: 'Failed to fetch log',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n );\n\n /**\n * GET /api/v1/logs/:id/related\n * Get logs related to a specific log (same trace/execution/request)\n */\n server.get<{ Params: { id: string } }>(\n '/api/v1/logs/:id/related',\n { schema: { tags: ['Logs'], summary: 'Get logs related to a specific entry' } },\n async (request, reply) => {\n try {\n const log = await platform.logs.getById(request.params.id);\n\n if (!log) {\n return reply.code(404).send({\n ok: false,\n error: 'Log not found',\n message: `Log with ID '${request.params.id}' does not exist`,\n });\n }\n\n const relatedLogs = await findRelatedLogs(log);\n\n return {\n ok: true,\n data: {\n total: relatedLogs.length,\n logs: relatedLogs,\n correlationKeys: extractCorrelationKeys(log),\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: 'Failed to fetch related logs',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n }\n );\n\n /**\n * GET /api/v1/logs/stream\n * Server-Sent Events stream for real-time logs\n */\n server.get('/api/v1/logs/stream', { schema: { hide: true } }, async (request, reply) => {\n // Check if streaming is supported\n const caps = platform.logs.getCapabilities();\n if (!caps.hasStreaming) {\n return reply.code(503).send({\n error: 'Log streaming not enabled',\n message: 'Logger adapter does not support streaming. Enable logRingBuffer in kb.config.json',\n });\n }\n\n // Tell Fastify we're manually managing the response\n reply.hijack();\n\n // Track if stream is closed to prevent double-end\n let streamClosed = false;\n\n // Explicit CORS headers for EventSource\n const origin = request.headers.origin;\n if (origin === 'http://localhost:3000' || origin === 'http://localhost:5173') {\n reply.raw.setHeader('Access-Control-Allow-Origin', origin);\n reply.raw.setHeader('Access-Control-Allow-Credentials', 'true');\n } else {\n reply.raw.setHeader('Access-Control-Allow-Origin', '*');\n }\n\n // Setup SSE headers\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache, no-transform');\n reply.raw.setHeader('Connection', 'keep-alive');\n\n try {\n reply.raw.flushHeaders?.();\n reply.raw.write(': connected\\n\\n');\n } catch (err) {\n // Headers already sent or connection closed\n streamClosed = true;\n return;\n }\n\n // Subscribe to log stream using unified service\n const unsubscribe = platform.logs.subscribe((log) => {\n // Check if connection is still alive before writing\n if (!streamClosed && !reply.raw.writableEnded && !reply.raw.destroyed) {\n try {\n // Frontend expects event name 'log'\n const frontendLog = toFrontendLogRecord(log);\n reply.raw.write(`event: log\\n`);\n reply.raw.write(`data: ${JSON.stringify(frontendLog)}\\n\\n`);\n } catch (err) {\n // Connection closed while writing - ignore\n streamClosed = true;\n }\n }\n });\n\n // Cleanup on disconnect\n const cleanup = () => {\n if (!streamClosed) {\n streamClosed = true;\n unsubscribe();\n try {\n if (!reply.raw.writableEnded && !reply.raw.destroyed) {\n reply.raw.end();\n }\n } catch (err) {\n // Already closed - ignore\n }\n }\n };\n\n request.raw.on('close', cleanup);\n request.raw.on('error', cleanup);\n\n // Keep connection alive indefinitely\n await new Promise<void>(() => {});\n });\n\n /**\n * GET /api/v1/logs/stats\n * Get combined log statistics from all backends\n */\n server.get('/api/v1/logs/stats', { schema: { tags: ['Logs'], summary: 'Get log storage statistics' } }, async (request, reply) => {\n try {\n const stats = await platform.logs.getStats();\n const caps = platform.logs.getCapabilities();\n\n return {\n ok: true,\n data: {\n capabilities: caps,\n buffer: stats.buffer ? {\n size: stats.buffer.size,\n maxSize: stats.buffer.maxSize,\n oldest: stats.buffer.oldestTimestamp ? new Date(stats.buffer.oldestTimestamp).toISOString() : undefined,\n newest: stats.buffer.newestTimestamp ? new Date(stats.buffer.newestTimestamp).toISOString() : undefined,\n } : undefined,\n persistence: stats.persistence ? {\n totalLogs: stats.persistence.totalLogs,\n oldest: stats.persistence.oldestTimestamp ? new Date(stats.persistence.oldestTimestamp).toISOString() : undefined,\n newest: stats.persistence.newestTimestamp ? new Date(stats.persistence.newestTimestamp).toISOString() : undefined,\n sizeBytes: stats.persistence.sizeBytes,\n } : undefined,\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: 'Failed to fetch stats',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n });\n\n /**\n * POST /api/v1/logs/summarize\n * AI-powered log summarization (placeholder for future implementation)\n *\n * Expected request body:\n * {\n * \"timeRange\": { \"from\": \"ISO timestamp\", \"to\": \"ISO timestamp\" },\n * \"filters\": { \"level\": \"error\", \"plugin\": \"rest\", \"traceId\": \"...\" },\n * \"groupBy\": \"trace\" | \"execution\" | \"plugin\",\n * \"question\": \"What happened in the last 5 minutes?\" (optional)\n * }\n */\n server.post<{\n Body: {\n timeRange?: { from?: string; to?: string };\n filters?: {\n level?: string;\n plugin?: string;\n traceId?: string;\n executionId?: string;\n };\n groupBy?: 'trace' | 'execution' | 'plugin';\n question?: string;\n includeContext?: {\n errors?: boolean;\n warnings?: boolean;\n info?: boolean;\n metadata?: boolean;\n stackTraces?: boolean;\n };\n };\n }>('/api/v1/logs/summarize', { schema: { tags: ['Logs'], summary: 'AI-powered log summarization' } }, async (request, reply) => {\n const { timeRange, filters, groupBy, question, includeContext } = request.body;\n\n try {\n // Build query from request\n const query: LogQuery = {\n level: filters?.level as LogLevel,\n source: filters?.plugin,\n from: timeRange?.from ? new Date(timeRange.from).getTime() : undefined,\n to: timeRange?.to ? new Date(timeRange.to).getTime() : undefined,\n };\n\n // Query logs using unified service\n const result = await platform.logs.query(query, { limit: 1000 });\n const frontendLogs = result.logs.map(toFrontendLogRecord);\n\n // Additional filters (traceId, executionId)\n let filteredLogs = frontendLogs;\n if (filters?.traceId) {\n filteredLogs = filteredLogs.filter((log) => log.traceId === filters.traceId);\n }\n if (filters?.executionId) {\n filteredLogs = filteredLogs.filter((log) => log.executionId === filters.executionId);\n }\n\n // Calculate aggregated statistics\n const stats = {\n total: filteredLogs.length,\n byLevel: {} as Record<string, number>,\n byPlugin: {} as Record<string, number>,\n topErrors: [] as Array<{ message: string; count: number }>,\n timeRange: {\n from: filteredLogs.length > 0 ? filteredLogs[0]!.time : null,\n to: filteredLogs.length > 0 ? filteredLogs[filteredLogs.length - 1]!.time : null,\n },\n };\n\n const errorMessages = new Map<string, number>();\n\n for (const log of filteredLogs) {\n // Count by level\n stats.byLevel[log.level] = (stats.byLevel[log.level] || 0) + 1;\n\n // Count by plugin\n if (log.plugin) {\n stats.byPlugin[log.plugin] = (stats.byPlugin[log.plugin] || 0) + 1;\n }\n\n // Track error messages\n if (log.level === 'error' && log.msg) {\n errorMessages.set(log.msg, (errorMessages.get(log.msg) || 0) + 1);\n }\n }\n\n // Top 10 errors\n stats.topErrors = Array.from(errorMessages.entries())\n .map(([message, count]) => ({ message, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n // Group logs if requested\n let groups: Record<string, FrontendLogRecord[]> | null = null;\n if (groupBy) {\n // Map frontend groupBy values to actual log field names\n const fieldMap: Record<string, string> = {\n trace: 'traceId',\n execution: 'executionId',\n plugin: 'plugin',\n };\n\n const groupMap = new Map<string, FrontendLogRecord[]>();\n for (const log of filteredLogs) {\n const fieldName = fieldMap[groupBy] || groupBy;\n const key = String(log[fieldName] || 'unknown');\n if (!groupMap.has(key)) {\n groupMap.set(key, []);\n }\n groupMap.get(key)!.push(log);\n }\n groups = Object.fromEntries(groupMap.entries());\n }\n\n // AI Summarization\n let aiSummary: string | null = null;\n let message: string | null = null;\n\n if (platform.llm && question) {\n try {\n const context = includeContext || {\n errors: true,\n warnings: true,\n info: false,\n metadata: true,\n stackTraces: true,\n };\n\n const prompt = buildLogSummaryPrompt(question, filteredLogs, stats, context);\n\n const response = await platform.llm.complete(prompt, {\n temperature: 0.7,\n maxTokens: 1000,\n systemPrompt: 'You are a technical log analysis assistant. Provide clear, actionable insights based on application logs.',\n });\n\n aiSummary = response.content.trim();\n\n } catch (error) {\n // Graceful degradation\n platform.logger.warn('LLM summarization failed, using fallback', {\n error: error instanceof Error ? error.message : String(error),\n });\n aiSummary = generateFallbackSummary(stats, filteredLogs);\n message = 'AI summarization unavailable, showing statistical summary';\n }\n } else {\n // No LLM or no question - return fallback\n aiSummary = generateFallbackSummary(stats, filteredLogs);\n message = platform.llm ? 'No question provided' : 'LLM not configured';\n }\n\n // Return structured data with AI summary\n return {\n ok: true,\n data: {\n summary: {\n question: question || 'General log summary',\n timeRange: stats.timeRange,\n total: stats.total,\n stats,\n groups,\n },\n aiSummary,\n message,\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: 'Log summarization failed',\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/platform\n * Platform configuration endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { PlatformConfigResponse, PlatformConfigPayload } from '@kb-labs/rest-api-contracts';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { readKbConfig } from '@kb-labs/core-config';\nimport { platform } from '@kb-labs/core-runtime';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n/**\n * Sensitive keys to redact from adapterOptions\n */\nconst SENSITIVE_KEYS = [\n 'apiKey',\n 'secret',\n 'password',\n 'token',\n 'key',\n 'credentials',\n 'auth',\n];\n\n/**\n * Recursively redact sensitive keys from an object\n */\nfunction redactSensitiveData(\n obj: Record<string, any>,\n redacted: string[] = [],\n path: string = ''\n): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = path ? `${path}.${key}` : key;\n const lowerKey = key.toLowerCase();\n\n // Check if key contains sensitive patterns\n const isSensitive = SENSITIVE_KEYS.some(pattern => lowerKey.includes(pattern.toLowerCase()));\n\n if (isSensitive && typeof value === 'string') {\n result[key] = '***REDACTED***';\n redacted.push(currentPath);\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = redactSensitiveData(value, redacted, currentPath);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Load platform configuration from kb.config.json using core-config utilities\n */\nasync function loadPlatformConfig(repoRoot: string): Promise<{\n adapters: Record<string, string | null>;\n adapterOptions: Record<string, unknown>;\n execution: { mode: string };\n}> {\n try {\n const configResult = await readKbConfig(repoRoot);\n\n if (!configResult || !configResult.data) {\n // Return empty/default values if config not found\n return {\n adapters: {},\n adapterOptions: {},\n execution: { mode: 'in-process' },\n };\n }\n\n const config = configResult.data as Record<string, unknown>;\n const configPlatform = (typeof config.platform === 'object' && config.platform !== null)\n ? config.platform as Record<string, unknown>\n : {} as Record<string, unknown>;\n\n return {\n adapters: (configPlatform.adapters ?? {}) as Record<string, string | null>,\n adapterOptions: (configPlatform.adapterOptions ?? {}) as Record<string, unknown>,\n execution: (configPlatform.execution ?? { mode: 'in-process' }) as { mode: string },\n };\n } catch (error) {\n // Return empty/default values on error\n return {\n adapters: {},\n adapterOptions: {},\n execution: { mode: 'in-process' },\n };\n }\n}\n\n/**\n * Register platform configuration routes\n */\nexport async function registerPlatformRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const configPaths = resolvePaths(basePath, '/platform/config');\n\n for (const path of configPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const { adapters, adapterOptions, execution } = await restDomainOperationMetrics.observeOperation(\n 'platform.config.get',\n () => loadPlatformConfig(repoRoot),\n );\n\n const redacted: string[] = [];\n const sanitizedOptions = redactSensitiveData(adapterOptions as Record<string, any>, redacted);\n\n const payload: PlatformConfigPayload = {\n schema: 'kb.platform.config/1',\n ts: new Date().toISOString(),\n adapters,\n adapterOptions: sanitizedOptions,\n execution,\n redacted,\n };\n\n const response: PlatformConfigResponse = {\n ok: true,\n data: payload,\n };\n\n return reply.send(response);\n } catch (error) {\n platform.logger.error('Failed to load platform config', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to load platform configuration',\n },\n });\n }\n });\n }\n}\n","/**\n * Internal adapter-call endpoint — reverse proxy for Workspace Agent.\n *\n * Receives adapter:call from Gateway (forwarded from Host via WS),\n * executes against platform services, returns result.\n *\n * Flow: Host → WS adapter:call → Gateway → HTTP POST here → platform.adapter.method()\n *\n * Security:\n * - Auth: x-internal-secret (server-to-server, same as /internal/dispatch)\n * - Adapter allowlist enforced (AdapterNameSchema)\n * - Method allowlist per adapter (AdapterRegistry)\n * - Zod validation on input/output\n * - Audit logging on every call\n *\n * @see ADR-0051: Bidirectional Gateway Protocol\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { z } from 'zod';\nimport { platform } from '@kb-labs/core-runtime';\nimport { AdapterNameSchema, type AdapterName } from '@kb-labs/gateway-contracts';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n// ── Adapter Registry ──\n\ninterface AdapterMethodEntry {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType;\n execute: (args: unknown[], context: AdapterCallContext) => Promise<unknown>;\n}\n\ninterface AdapterCallContext {\n namespaceId: string;\n hostId: string;\n workspaceId?: string;\n environmentId?: string;\n executionRequestId?: string;\n userId?: string;\n sessionId?: string;\n}\n\nclass AdapterRegistry {\n private methods = new Map<string, AdapterMethodEntry>();\n\n register(\n adapter: AdapterName,\n method: string,\n entry: AdapterMethodEntry,\n ): void {\n this.methods.set(`${adapter}.${method}`, entry);\n }\n\n get(adapter: string, method: string): AdapterMethodEntry | undefined {\n return this.methods.get(`${adapter}.${method}`);\n }\n\n has(adapter: string, method: string): boolean {\n return this.methods.has(`${adapter}.${method}`);\n }\n}\n\n// ── Request schema ──\n\nconst AdapterCallRequestSchema = z.object({\n requestId: z.string(),\n adapter: AdapterNameSchema,\n method: z.string(),\n args: z.array(z.unknown()),\n context: z.object({\n namespaceId: z.string(),\n hostId: z.string(),\n workspaceId: z.string().optional(),\n environmentId: z.string().optional(),\n executionRequestId: z.string().optional(),\n userId: z.string().optional(),\n sessionId: z.string().optional(),\n }),\n});\n\n// ── Registry initialization ──\n\nfunction createAdapterRegistry(): AdapterRegistry {\n const registry = new AdapterRegistry();\n\n // LLM\n registry.register('llm', 'complete', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const llm = platform.getAdapter<any>('llm');\n if (!llm) { throw new Error('LLM adapter not available'); }\n return llm.complete(...args);\n },\n });\n\n // Cache\n registry.register('cache', 'get', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown().nullable(),\n execute: async (args) => platform.cache.get(args[0] as string),\n });\n\n registry.register('cache', 'set', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.void(),\n execute: async (args) => platform.cache.set(args[0] as string, args[1], args[2] as number | undefined),\n });\n\n registry.register('cache', 'delete', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.void(),\n execute: async (args) => platform.cache.delete(args[0] as string),\n });\n\n // VectorStore\n registry.register('vectorStore', 'search', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const vs = platform.getAdapter<any>('vectorStore');\n if (!vs) { throw new Error('VectorStore adapter not available'); }\n return vs.search(...args);\n },\n });\n\n // Embeddings\n registry.register('embeddings', 'embed', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const emb = platform.getAdapter<any>('embeddings');\n if (!emb) { throw new Error('Embeddings adapter not available'); }\n return emb.embed(...args);\n },\n });\n\n // Storage\n registry.register('storage', 'read', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const storage = platform.getAdapter<any>('storage');\n if (!storage) { throw new Error('Storage adapter not available'); }\n return storage.read(...args);\n },\n });\n\n registry.register('storage', 'write', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.void(),\n execute: async (args) => {\n const storage = platform.getAdapter<any>('storage');\n if (!storage) { throw new Error('Storage adapter not available'); }\n return storage.write(...args);\n },\n });\n\n return registry;\n}\n\n// ── Route registration ──\n\nexport async function registerAdapterCallRoutes(\n server: FastifyInstance,\n): Promise<void> {\n const registry = createAdapterRegistry();\n const internalSecret = process.env.GATEWAY_INTERNAL_SECRET;\n const logger = platform.logger.child({ layer: 'rest', route: 'adapter-call' });\n\n server.post('/api/v1/internal/adapter-call', async (\n request: FastifyRequest,\n reply: FastifyReply,\n ) => {\n // 1. Auth: x-internal-secret\n const provided = request.headers['x-internal-secret'] as string | undefined;\n if (!internalSecret || provided !== internalSecret) {\n return reply.code(403).send({ ok: false, error: { code: 'FORBIDDEN', message: 'Invalid internal secret', retryable: false } });\n }\n\n // 2. Parse & validate request\n const parsed = AdapterCallRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ ok: false, error: { code: 'VALIDATION_ERROR', message: parsed.error.message, retryable: false } });\n }\n\n const { requestId, adapter, method, args, context } = parsed.data;\n const startMs = Date.now();\n\n // 3. Check registry\n const entry = registry.get(adapter as string, method);\n if (!entry) {\n logger.warn('Adapter call rejected', { requestId, adapter, method, hostId: context.hostId });\n return reply.code(403).send({ ok: false, error: { code: 'ADAPTER_CALL_REJECTED', message: `Method not allowed: ${adapter}.${method}`, retryable: false } });\n }\n\n // 4. Execute\n try {\n const operation = `adapter.call.${adapter}.${method}`;\n const result = await restDomainOperationMetrics.observeOperation(operation, async () =>\n entry.execute(args, context),\n );\n const latencyMs = Date.now() - startMs;\n\n logger.info('Adapter call success', { requestId, adapter, method, hostId: context.hostId, latencyMs });\n\n return { ok: true, result };\n } catch (err) {\n const latencyMs = Date.now() - startMs;\n const message = err instanceof Error ? err.message : String(err);\n\n logger.error('Adapter call failed', err instanceof Error ? err : undefined, { requestId, adapter, method, hostId: context.hostId, latencyMs });\n\n return reply.code(500).send({\n ok: false,\n error: { code: 'ADAPTER_ERROR', message, retryable: false },\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/debug-routes\n * Debug endpoint to list all registered routes\n *\n * GET /api/v1/routes - List all registered routes with methods\n */\n\nimport type { FastifyInstance, RouteOptions } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\n\ninterface RouteInfo {\n method: string;\n url: string;\n}\n\n// Store for collected routes (populated via onRoute hook)\nconst collectedRoutes: RouteInfo[] = [];\nconst seenRoutes = new Set<string>();\n\n/**\n * Hook to collect routes as they are registered\n */\nfunction collectRoute(routeOptions: RouteOptions): void {\n const methods = Array.isArray(routeOptions.method)\n ? routeOptions.method\n : [routeOptions.method];\n\n for (const method of methods) {\n // Skip HEAD (auto-generated for GET routes) and internal routes\n if (method === 'HEAD') {continue;}\n\n const url = routeOptions.url;\n const key = `${method}:${url}`;\n\n if (!seenRoutes.has(key)) {\n seenRoutes.add(key);\n collectedRoutes.push({ method, url });\n }\n }\n}\n\n/**\n * Register the onRoute hook to collect routes\n * Must be called early, before other routes are registered\n */\nexport function registerRouteCollector(fastify: FastifyInstance): void {\n fastify.addHook('onRoute', collectRoute);\n}\n\n/**\n * Register debug routes endpoint\n */\nexport async function registerDebugRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const routesPaths = resolvePaths(basePath, '/routes');\n\n for (const path of routesPaths) {\n fastify.get(path, async (_request, reply) => {\n // Filter to only show /api/v1 routes (skip duplicates without prefix)\n let routes = collectedRoutes.filter(r => r.url.startsWith('/api/'));\n\n // If no API routes found, show all (fallback)\n if (routes.length === 0) {\n routes = [...collectedRoutes];\n }\n\n // Sort routes by URL, then by method\n routes.sort((a, b) => {\n const urlCompare = a.url.localeCompare(b.url);\n if (urlCompare !== 0) {return urlCompare;}\n return a.method.localeCompare(b.method);\n });\n\n // Get raw printRoutes for debugging (optional)\n let raw: string | null = null;\n try {\n raw = fastify.printRoutes({ commonPrefix: false });\n } catch {\n // Ignore if not available\n }\n\n return reply.send({\n schema: 'kb.routes/1',\n ts: new Date().toISOString(),\n count: routes.length,\n routes,\n raw,\n });\n });\n }\n}\n","/**\n * @module @kb-labs/rest-api-app/routes\n * Route registration\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { ICronManager } from '@kb-labs/core-platform';\n\ntype RedisStatus = {\n enabled: boolean;\n healthy: boolean;\n roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null };\n};\nimport { platform } from '@kb-labs/core-runtime';\nimport { EventHub } from '../events/hub';\nimport { registerEventRoutes } from './events';\nimport { registerHealthRoutes } from './health';\nimport { registerOpenAPIRoutes } from './openapi';\nimport { registerMetricsRoutes } from './metrics';\nimport { registerPluginRoutes, registerPluginSnapshotRoutes } from './plugins';\nimport { registerWorkflowRoutes } from './workflows';\nimport { registerJobsRoutes } from './jobs';\nimport { registerCacheRoutes } from './cache';\nimport { registerObservabilityRoutes } from './observability';\nimport { registerAnalyticsRoutes } from './analytics';\nimport { registerAdaptersRoutes } from './adapters';\nimport { registerLogRoutes } from './logs';\nimport { registerPlatformRoutes } from './platform';\nimport { registerAdapterCallRoutes } from './adapter-call';\nimport { registerDebugRoutes, registerRouteCollector } from './debug';\nimport type { ReadinessState } from './readiness';\nimport { isReady, resolveReadinessReason } from './readiness';\nimport { metricsCollector } from '../middleware/metrics.js';\nimport { HistoricalMetricsCollector } from '../daemon/metrics';\n\nfunction normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n return basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n}\n\n/**\n * Register all routes\n */\nexport async function registerRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry\n): Promise<void> {\n // Register route collector hook FIRST, before any routes are registered\n // This allows us to collect all routes for the /routes endpoint\n registerRouteCollector(server);\n\n const initialSnapshot = registry.snapshot();\n const initialRedisStatus = ('getRedisStatus' in registry && typeof (registry as { getRedisStatus?: () => RedisStatus }).getRedisStatus === 'function')\n ? (registry as { getRedisStatus: () => RedisStatus }).getRedisStatus()\n : undefined;\n const initialRedisStates = {\n publisher: initialRedisStatus?.roles.publisher ?? null,\n subscriber: initialRedisStatus?.roles.subscriber ?? null,\n cache: initialRedisStatus?.roles.cache ?? null,\n };\n\n const registryLoaded =\n initialSnapshot.plugins.length > 0 && !initialSnapshot.partial && !initialSnapshot.stale;\n\n const readiness: ReadinessState = {\n cliApiInitialized: true,\n registryLoaded,\n registryPartial: initialSnapshot.partial,\n registryStale: initialSnapshot.stale,\n pluginRoutesMounted: false,\n pluginMountInProgress: true,\n pluginRoutesCount: 0,\n pluginRouteErrors: 0,\n pluginRouteFailures: [],\n lastPluginMountTs: null,\n pluginRoutesLastDurationMs: null,\n redisEnabled: initialRedisStatus?.enabled ?? false,\n redisConnected: initialRedisStatus?.healthy ?? true,\n redisStates: initialRedisStates,\n };\n\n const handleRedisUpdate = (status: RedisStatus) => {\n metricsCollector.recordRedisStatus(status);\n if (!readiness.redisEnabled && status.enabled) {\n platform.logger.info('Redis support enabled', { redis: status });\n }\n if (readiness.redisConnected !== status.healthy) {\n const message = 'Redis health status changed';\n if (status.healthy) {\n platform.logger.info(message, { redis: status });\n } else {\n platform.logger.warn(message, { redis: status });\n }\n }\n const prevStates = readiness.redisStates;\n if (\n prevStates.publisher !== (status.roles.publisher ?? null) ||\n prevStates.subscriber !== (status.roles.subscriber ?? null) ||\n prevStates.cache !== (status.roles.cache ?? null)\n ) {\n platform.logger.info('Redis role state changed', { redis: status.roles });\n }\n };\n\n if (initialRedisStatus) {\n handleRedisUpdate(initialRedisStatus);\n }\n server.kbReadiness = readiness;\n\n const eventHub = server.kbEventHub ?? new EventHub();\n server.kbEventHub = eventHub;\n\n const broadcastState = async (): Promise<void> => {\n const pluginsSnapshot = metricsCollector.getLastPluginMountSnapshot();\n const redisStatus = ('getRedisStatus' in registry && typeof (registry as { getRedisStatus?: () => RedisStatus }).getRedisStatus === 'function')\n ? (registry as { getRedisStatus: () => RedisStatus }).getRedisStatus()\n : undefined;\n if (redisStatus) {\n handleRedisUpdate(redisStatus);\n readiness.redisEnabled = redisStatus.enabled;\n readiness.redisConnected = redisStatus.healthy;\n readiness.redisStates = {\n publisher: redisStatus.roles.publisher ?? null,\n subscriber: redisStatus.roles.subscriber ?? null,\n cache: redisStatus.roles.cache ?? null,\n };\n }\n try {\n const snapshot = registry.snapshot();\n eventHub.publish({\n type: 'registry',\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n partial: snapshot.partial,\n stale: snapshot.stale,\n expiresAt: snapshot.expiresAt ?? null,\n ttlMs: snapshot.ttlMs ?? null,\n checksum: snapshot.checksum ?? undefined,\n checksumAlgorithm: snapshot.checksumAlgorithm,\n previousChecksum: snapshot.previousChecksum ?? null,\n });\n } catch (error) {\n platform.logger.warn('Failed to publish registry snapshot event', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n const health = await registry.getSystemHealth();\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n eventHub.publish({\n type: 'health',\n status: health.status,\n ts: health.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n pluginsMounted: pluginsSnapshot?.succeeded ?? 0,\n pluginsFailed: pluginsSnapshot?.failed ?? 0,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n lastPluginMountTs: readiness.lastPluginMountTs ?? null,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n redisEnabled: readiness.redisEnabled,\n redisHealthy: readiness.redisConnected,\n redisStates: readiness.redisStates,\n });\n } catch (error) {\n platform.logger.warn('Failed to publish health event', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n await broadcastState();\n\n const runMount = async (): Promise<void> => {\n try {\n await registerPluginRoutes(server, config, repoRoot, registry, readiness);\n } finally {\n await broadcastState();\n }\n };\n\n // Initial mount - wait for completion before server starts listening\n platform.logger.info('Starting initial plugin route mounting');\n try {\n await runMount();\n platform.logger.info('Plugin route mounting completed');\n } catch (error) {\n platform.logger.error(\n 'Plugin route mounting failed',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n\n // Create a resolved promise for initial mount (already completed)\n let mountPromise = Promise.resolve();\n\n const scheduleRemount = (): void => {\n // Check if server is already listening - Fastify doesn't allow adding routes after listen()\n // Check both Fastify's listening property and underlying Node.js server\n const isListening = server.listening ||\n (server.server && (server.server as { listening?: boolean }).listening);\n \n if (isListening) {\n platform.logger.warn(\n 'Cannot remount plugin routes: server is already listening. Restart required.'\n );\n return;\n }\n\n readiness.pluginMountInProgress = true;\n mountPromise = mountPromise\n .catch(() => void 0)\n .then(async () => {\n // Double-check server is not listening before remount\n const stillListening = server.listening ||\n (server.server && (server.server as { listening?: boolean }).listening);\n \n if (stillListening) {\n platform.logger.warn(\n 'Cannot remount plugin routes: server started listening during remount. Restart required.'\n );\n return;\n }\n platform.logger.info('Registry change detected, remounting plugin routes');\n await runMount();\n })\n .then(() => {\n platform.logger.info('Plugin route remount completed');\n })\n .catch(error => {\n platform.logger.error(\n 'Plugin route remount failed',\n error instanceof Error ? error : new Error(String(error))\n );\n });\n\n server.kbPluginMountPromise = mountPromise;\n };\n\n registry.onChange(() => {\n scheduleRemount();\n });\n\n const basePath = normalizeBasePath(config.basePath);\n\n await registerHealthRoutes(server, config, repoRoot, registry, readiness);\n\n await registerOpenAPIRoutes(server, config, repoRoot, registry);\n\n registerMetricsRoutes(server, config);\n\n await registerPluginSnapshotRoutes(server, config, registry);\n\n // Workflow SSE streaming (long-lived connections that can't go through plugin execution)\n // All CRUD operations are handled by the workflow plugin routes (/plugins/workflow/...)\n await registerWorkflowRoutes(server, config);\n\n // Register jobs management endpoints (scheduled jobs)\n const cronManager = (platform as { cron?: ICronManager }).cron ?? null;\n await registerJobsRoutes(server, config, cronManager);\n\n const platformServices = platform;\n\n await registerCacheRoutes(server, config, registry);\n\n // Initialize historical metrics collector\n const historicalCollector = new HistoricalMetricsCollector(\n platformServices.cache,\n {\n intervalMs: 5000, // Collect every 5 seconds\n debug: process.env.NODE_ENV !== 'production',\n },\n platformServices.logger\n );\n\n // Start background collection\n historicalCollector.start();\n platform.logger.info('Historical metrics collector started');\n\n // Stop collector on server close\n server.addHook('onClose', async () => {\n historicalCollector.stop();\n platform.logger.info('Historical metrics collector stopped');\n });\n\n await registerObservabilityRoutes(server, config, repoRoot, historicalCollector, platformServices);\n\n await registerAnalyticsRoutes(server, config);\n\n await registerAdaptersRoutes(server, config);\n\n await registerLogRoutes(server, config, eventHub);\n\n await registerPlatformRoutes(server, config, repoRoot);\n\n await registerAdapterCallRoutes(server);\n\n await registerDebugRoutes(server, config);\n\n await registerEventRoutes(server, basePath, registry, readiness, eventHub, config);\n}\n","/**\n * @module @kb-labs/rest-api-app/plugins\n * Fastify plugins registration\n */\n\nimport type {\n FastifyInstance,\n FastifyPluginCallback,\n FastifyBaseLogger,\n RawServerDefault,\n FastifyTypeProviderDefault,\n} from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport fastifyCors, { type FastifyCorsOptions } from '@fastify/cors';\nimport fastifyRateLimit, { type RateLimitPluginOptions } from '@fastify/rate-limit';\nimport { registerOpenAPI } from '@kb-labs/shared-http';\n\n/**\n * Register all Fastify plugins\n */\nexport async function registerPlugins(\n server: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n // CORS plugin with profile support\n const corsProfile = config.cors.profile || 'dev';\n let corsOrigins: string[] | boolean = config.cors.origins;\n \n if (corsProfile === 'dev') {\n // Dev: allow localhost origins\n corsOrigins = config.cors.origins.length > 0 \n ? config.cors.origins \n : ['http://localhost:3000', 'http://localhost:5173']; // Vite default + Studio\n } else if (corsProfile === 'preview') {\n // Preview: specific staging domains\n corsOrigins = config.cors.origins.length > 0 \n ? config.cors.origins \n : false; // Disable if not configured\n } else if (corsProfile === 'prod') {\n // Prod: strict whitelist\n corsOrigins = config.cors.origins.length > 0 \n ? config.cors.origins \n : false; // Disable if not configured\n }\n\n const corsOptions: FastifyCorsOptions = {\n origin: corsOrigins,\n credentials: config.cors.allowCredentials,\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'HEAD'],\n allowedHeaders: [\n 'Content-Type', \n 'Authorization', \n 'X-Request-Id', \n 'X-Trace-Id', // Added for Studio widget tracing\n 'Idempotency-Key', \n 'X-Client-Version'\n ],\n exposedHeaders: ['X-Request-Id', 'X-Schema-Version', 'X-RateLimit-Limit', 'X-RateLimit-Remaining', 'Retry-After'],\n preflightContinue: false,\n };\n\n const corsPlugin: FastifyPluginCallback<\n FastifyCorsOptions,\n RawServerDefault,\n FastifyTypeProviderDefault,\n FastifyBaseLogger\n > = fastifyCors;\n\n await server.register(corsPlugin, corsOptions);\n\n // Add Vary: Origin header for CORS caching\n server.addHook('onSend', async (request, reply) => {\n if (corsProfile !== 'prod') {\n try {\n if (!reply.raw.headersSent) {\n reply.header('Vary', 'Origin');\n }\n } catch (err) {\n // Headers already sent, ignore\n }\n }\n });\n\n // Rate limit plugin\n if (config.rateLimit) {\n const rateLimitOpts: RateLimitPluginOptions = {\n max: config.rateLimit.max,\n timeWindow: config.rateLimit.timeWindow,\n allowList: (req) => {\n // Health/ready/studio-registry must never be rate-limited — kb-dev uses them for health checks\n const url = (req.url ?? '').split('?')[0] ?? '';\n return (\n url === '/health' ||\n url === '/api/v1/health' ||\n url === '/api/v1/ready' ||\n url === '/api/v1/observability/health' ||\n url === '/api/v1/studio/registry' ||\n url === '/api/v1/logs/stream' ||\n url.startsWith('/plugins/')\n );\n },\n addHeaders: {\n 'x-ratelimit-limit': true,\n 'x-ratelimit-remaining': true,\n 'x-ratelimit-reset': true,\n },\n };\n\n const rateLimitPlugin: FastifyPluginCallback<\n RateLimitPluginOptions,\n RawServerDefault,\n FastifyTypeProviderDefault,\n FastifyBaseLogger\n > = fastifyRateLimit;\n\n await server.register(rateLimitPlugin, rateLimitOpts);\n }\n\n // OpenAPI / Swagger UI\n // Must be registered after other plugins and before routes.\n // Spec is at /openapi.json — canonical across all services.\n // UI is disabled in production (hideUntagged: true keeps internal routes invisible).\n await registerOpenAPI(server, {\n title: 'KB Labs REST API',\n description: 'Main platform REST API — jobs, workflows, plugins, adapters',\n version: '1.0.0',\n servers: [{ url: 'http://localhost:5050', description: 'Local dev' }],\n ui: corsProfile !== 'prod',\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/envelope\n * Response envelope wrapper middleware — single source of truth for error formatting.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { errorEnvelopeSchema, type PluginErrorEnvelope } from '@kb-labs/rest-api-contracts';\n\nfunction isPluginErrorEnvelope(err: unknown): err is PluginErrorEnvelope {\n return (\n err !== null &&\n typeof err === 'object' &&\n 'status' in err &&\n (err as PluginErrorEnvelope).status === 'error' &&\n 'meta' in err &&\n typeof (err as PluginErrorEnvelope).meta === 'object' &&\n 'pluginId' in (err as PluginErrorEnvelope).meta\n );\n}\n\n/**\n * Register envelope middleware\n */\nexport function registerEnvelopeMiddleware(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n // Add response schema version header and wrap in envelope\n // Use 'onSend' hook to modify payload after Fastify serializes it but before sending\n // This ensures we get the serialized JSON string and can wrap it properly\n server.addHook('onSend', async (request, reply, payload) => {\n // Set header with try-catch to prevent ERR_HTTP_HEADERS_SENT\n try {\n if (!reply.raw.headersSent) {\n reply.header('x-schema-version', config.apiVersion);\n }\n } catch (err) {\n // Headers already sent, ignore\n }\n\n // Skip envelope wrapping for streaming responses\n if (reply.getHeader('content-type') === 'text/event-stream') {\n return payload;\n }\n\n // Serialize plain objects that reached onSend without going through\n // Fastify's serializer (happens with non-JSON content-type or in error\n // handler fallback chains). Buffer/stream/null pass through unchanged.\n if (typeof payload !== 'string') {\n if (\n payload === null ||\n payload === undefined ||\n Buffer.isBuffer(payload) ||\n typeof (payload as { pipe?: unknown }).pipe === 'function' ||\n typeof (payload as { getReader?: unknown }).getReader === 'function'\n ) {\n return payload;\n }\n // Plain object — serialize so onSendEnd receives a string\n try {\n return JSON.stringify(payload);\n } catch {\n return payload;\n }\n }\n\n // Parse the serialized JSON payload\n let parsedPayload: unknown;\n try {\n parsedPayload = JSON.parse(payload);\n } catch {\n // If not JSON, return as is\n return payload;\n }\n\n // If payload is already an envelope (has 'ok' field), return as is\n if (parsedPayload && typeof parsedPayload === 'object' && 'ok' in parsedPayload) {\n return payload;\n }\n\n // Skip raw OpenAPI spec — marked by x-openapi-spec header set in shared-http\n if (reply.getHeader('x-openapi-spec')) {\n return payload;\n }\n\n // Wrap all non-streaming responses in envelope\n // Note: Even 4xx/5xx responses with data should be wrapped with ok: true\n // (e.g., 503 for health/ready still contains useful data)\n\n // Handle empty payloads\n let dataToWrap = parsedPayload;\n\n // If payload is undefined or null, wrap as null\n if (parsedPayload === null || parsedPayload === undefined) {\n dataToWrap = null;\n }\n\n // For responses with data (including 4xx/5xx with payload), wrap with ok: true\n // The HTTP status code indicates the result, but envelope.ok indicates successful request processing\n // Only responses without payload (handled by error handler) should have ok: false\n const envelope = {\n ok: true as const,\n data: dataToWrap,\n meta: {\n requestId: request.id || '',\n durationMs: reply.elapsedTime || 0,\n apiVersion: config.apiVersion,\n },\n };\n\n // Set Content-Type header if not set\n if (!reply.getHeader('content-type')) {\n try {\n if (!reply.raw.headersSent) {\n reply.header('content-type', 'application/json');\n }\n } catch (err) {\n // Headers already sent, ignore\n }\n }\n\n // Serialize and return envelope as string\n return JSON.stringify(envelope);\n });\n\n // Single error handler: normalises both PluginErrorEnvelope (from plugin runtime)\n // and plain Errors into the canonical ErrorEnvelope { ok: false, error, meta }.\n server.setErrorHandler(async (error: unknown, request, reply) => {\n let statusCode: number;\n let errorCode: string;\n let message: string;\n let details: Record<string, unknown>;\n let cause: unknown;\n let traceId: string | undefined;\n\n if (isPluginErrorEnvelope(error)) {\n statusCode = error.http || 500;\n errorCode = error.code || 'E_PLUGIN';\n message = error.message || 'Plugin error';\n details = {\n ...(error.details ?? {}),\n pluginId: error.meta.pluginId,\n pluginVersion: error.meta.pluginVersion,\n routeOrCommand: error.meta.routeOrCommand,\n ...(error.trace ? { trace: error.trace } : {}),\n };\n cause = undefined;\n traceId = undefined;\n } else {\n const err = error as Error & { statusCode?: number; code?: string; details?: unknown; cause?: unknown; traceId?: string };\n statusCode = err.statusCode || 500;\n errorCode = err.code || 'E_INTERNAL';\n message = err.message || 'Internal server error';\n details = (err.details as Record<string, unknown>) || {};\n cause = err.cause;\n traceId = err.traceId;\n }\n\n reply.errorCode = errorCode;\n\n if (request.kbLogger) {\n request.kbLogger.error('Request error', error instanceof Error ? error : new Error(String(error)), {\n errorCode,\n statusCode,\n });\n }\n\n const errorEnvelope = errorEnvelopeSchema.parse({\n ok: false,\n error: { code: errorCode, message, details, cause, traceId },\n meta: {\n requestId: request.id,\n durationMs: reply.elapsedTime || 0,\n apiVersion: config.apiVersion,\n },\n });\n\n reply.status(statusCode).send(errorEnvelope);\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/request-id\n * Request ID generation and correlation middleware\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { ulid } from 'ulid';\nimport { platform } from '@kb-labs/core-runtime';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\n\n// ADDS: request.id, request.kbLogger | SETS REPLY: X-Request-Id, X-Trace-Id\nexport function registerRequestIdMiddleware(server: FastifyInstance): void {\n server.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || ulid();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || ulid();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n // Store logger metadata on request for metrics middleware to use\n request.kbLogger = createCorrelatedLogger(platform.logger, {\n serviceId: 'rest',\n logsSource: 'rest',\n layer: 'rest',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n\n // Log request received\n const method = request.method.toUpperCase();\n const fullUrl = request.url;\n request.kbLogger.info(`→ ${method} ${fullUrl}`);\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/middleware/mock-mode\n * Mock mode middleware (per-request)\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IncomingHttpHeaders } from 'http';\n\ntype MockableRequest = {\n headers: IncomingHttpHeaders;\n mockMode?: boolean;\n};\n\n/**\n * Check if mock mode should be enabled for this request\n */\nexport function isMockModeEnabled(\n request: MockableRequest,\n config: RestApiConfig\n): boolean {\n // Check per-request header\n const headerMock = request.headers['kb-mock'];\n if (headerMock === 'true' || headerMock === '1') {\n return true;\n }\n\n // Check global config\n return config.mockMode || false;\n}\n\n/**\n * Register mock mode middleware\n */\nexport function registerMockModeMiddleware(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n server.addHook('onRequest', async (request) => {\n const mockableRequest = request as MockableRequest;\n mockableRequest.mockMode = isMockModeEnabled(mockableRequest, config);\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/security-headers\n * Security headers middleware\n */\n\nimport type { FastifyInstance } from 'fastify';\n\n/**\n * Register security headers middleware\n */\nexport function registerSecurityHeadersMiddleware(server: FastifyInstance): void {\n server.addHook('onRequest', async (request, reply) => {\n reply.header('X-Content-Type-Options', 'nosniff');\n reply.header('X-Frame-Options', 'DENY');\n reply.header('X-XSS-Protection', '1; mode=block');\n reply.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n reply.header('Permissions-Policy', 'geolocation=(), microphone=(), camera=()');\n\n if (request.protocol === 'https') {\n reply.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');\n }\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/cache\n * Cache middleware for ETag/Last-Modified support\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { createHash } from 'crypto';\n\n/**\n * Generate ETag from content\n */\nexport function generateETag(content: string | Buffer | object): string {\n const contentStr = typeof content === 'object' ? JSON.stringify(content) : content.toString();\n const hash = createHash('sha256').update(contentStr).digest('hex');\n return `\"${hash.substring(0, 16)}\"`; // Short hash for ETag\n}\n\n/**\n * Register cache middleware\n */\nexport function registerCacheMiddleware(server: FastifyInstance): void {\n server.addHook('onSend', async (request, reply, payload) => {\n // Only cache successful GET requests\n if (request.method !== 'GET' || reply.statusCode >= 300) {\n return payload;\n }\n\n // Skip cache for streaming responses\n if (reply.getHeader('content-type') === 'text/event-stream') {\n return payload;\n }\n\n // Check If-None-Match header (ETag)\n const ifNoneMatch = request.headers['if-none-match'];\n if (ifNoneMatch && payload) {\n const payloadStr = typeof payload === 'object' ? JSON.stringify(payload) : String(payload);\n const etag = generateETag(payloadStr);\n \n if (ifNoneMatch === etag || ifNoneMatch === `W/${etag}`) {\n reply.code(304).header('ETag', etag);\n return undefined; // Not Modified\n }\n \n reply.header('ETag', etag);\n }\n\n // Check If-Modified-Since header (Last-Modified)\n const ifModifiedSince = request.headers['if-modified-since'];\n if (ifModifiedSince && payload) {\n // For now, we'll use finishedAt from job metadata if available\n // This is a simplified implementation - in production, use actual modification time\n const lastModified = new Date().toUTCString();\n reply.header('Last-Modified', lastModified);\n \n const ifModifiedSinceDate = new Date(ifModifiedSince);\n const lastModifiedDate = new Date(lastModified);\n \n if (lastModifiedDate <= ifModifiedSinceDate) {\n reply.code(304);\n return undefined; // Not Modified\n }\n }\n\n return payload;\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/process-error-guard\n * Process-level error guard: catches uncaught exceptions and unhandled rejections.\n * Request-level error formatting is handled by envelope middleware.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\n\n// NOT a request hook — installs process.on('uncaughtException', 'unhandledRejection')\nexport function registerProcessErrorGuard(server: FastifyInstance): void {\n // Keep a reference to server so the signature stays compatible,\n // but request errors are handled by envelope.ts setErrorHandler.\n void server;\n\n process.on('uncaughtException', (error: Error) => {\n platform.logger.fatal('Uncaught exception', error, { source: 'process-error-guard' });\n });\n\n process.on('unhandledRejection', (reason: unknown) => {\n const error = reason instanceof Error ? reason : new Error(String(reason));\n platform.logger.error('Unhandled rejection', error, { source: 'process-error-guard' });\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/middleware/startup-throttle\n * Throttles concurrent requests during service startup to prevent request storms.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { isReady } from '../routes/readiness';\n\ntype StartupCounters = {\n inFlight: number;\n};\n\ntype StartupConfig = {\n maxConcurrent?: number;\n queueLimit?: number;\n timeoutMs?: number;\n retryAfterSeconds?: number;\n};\n\n// ADDS: request.kbStartupGuardActive, request.kbStartupGuardTimer\nexport function registerStartupThrottle(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n const startupConfig = (config as RestApiConfig & { startup?: StartupConfig }).startup;\n if (!startupConfig) {\n return;\n }\n\n const counters: StartupCounters = {\n inFlight: 0,\n };\n\n server.kbStartupGuard = counters;\n\n const maxConcurrent = startupConfig.maxConcurrent ?? 32;\n const queueLimit = startupConfig.queueLimit ?? 128;\n const timeoutMs = startupConfig.timeoutMs ?? 5000;\n const retryAfterSeconds = startupConfig.retryAfterSeconds ?? 2;\n\n server.addHook('onRequest', (request, reply, done) => {\n const readiness = server.kbReadiness;\n const infraReady = readiness ? isReady(readiness) : false;\n\n if (infraReady) {\n done();\n return;\n }\n\n if (counters.inFlight >= queueLimit) {\n reply\n .code(503)\n .header('Retry-After', retryAfterSeconds.toString())\n .send({\n schema: 'kb.startup/1',\n status: 'initializing',\n reason: 'startup_queue_limit',\n maxConcurrent,\n queueLimit,\n });\n return;\n }\n\n counters.inFlight += 1;\n request.kbStartupGuardActive = true;\n\n const timer = setTimeout(() => {\n if (!reply.sent) {\n reply\n .code(504)\n .header('Retry-After', retryAfterSeconds.toString())\n .send({\n schema: 'kb.startup/1',\n status: 'timeout',\n reason: 'startup_timeout',\n timeoutMs,\n });\n }\n }, timeoutMs);\n timer.unref();\n request.kbStartupGuardTimer = timer;\n\n if (counters.inFlight > maxConcurrent) {\n if (request.kbLogger) {\n request.kbLogger.warn('Startup guard concurrency threshold exceeded', {\n inFlight: counters.inFlight,\n maxConcurrent,\n });\n }\n }\n\n done();\n });\n\n server.addHook('onResponse', (request, _reply, done) => {\n if (request.kbStartupGuardActive) {\n counters.inFlight = Math.max(0, counters.inFlight - 1);\n if (request.kbStartupGuardTimer) {\n clearTimeout(request.kbStartupGuardTimer);\n request.kbStartupGuardTimer = undefined;\n }\n request.kbStartupGuardActive = false;\n }\n done();\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/request-timeout\n * Enforce route-level request timeouts\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { metricsCollector } from './metrics';\n\ntype RouteConfig = {\n kbRouteBudgetMs?: number | null;\n};\n\nexport function registerRequestTimeoutGuard(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n const defaultTimeout = config.timeouts?.requestTimeout ?? 30_000;\n\n server.addHook('onRequest', (request, reply, done) => {\n const routeConfig = (request.routeOptions?.config || {}) as RouteConfig;\n let budget = typeof routeConfig.kbRouteBudgetMs === 'number' && routeConfig.kbRouteBudgetMs > 0\n ? routeConfig.kbRouteBudgetMs\n : null;\n\n if (!budget) {\n const normalized =\n request.routeOptions?.url ??\n request.url;\n const inferred = normalized ? metricsCollector.getRouteBudget(request.method, normalized) : null;\n if (inferred && inferred > 0) {\n budget = inferred;\n }\n }\n\n if (!budget || budget <= 0) {\n budget = defaultTimeout;\n }\n\n if (!budget || budget <= 0) {\n done();\n return;\n }\n\n reply.raw.setTimeout(budget, () => {\n if (reply.sent) {\n return;\n }\n reply\n .code(504)\n .header('Content-Type', 'application/json')\n .send({\n schema: 'kb.errors/timeout/1',\n status: 'error',\n http: 504,\n code: 'E_GATEWAY_TIMEOUT',\n message: 'Request timed out',\n meta: {\n method: request.method,\n route: request.routeOptions?.url ?? request.url,\n timeoutMs: budget,\n },\n });\n });\n\n done();\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/tenant-rate-limit\n * Wires TenantRateLimiter (backed by platform.cache) into Fastify.\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport type { ICache } from '@kb-labs/core-platform';\nimport { TenantRateLimiter, getDefaultTenantTier } from '@kb-labs/core-tenant';\n\ninterface TenantRateLimiterLike {\n checkLimit(tenantId: string, resource: string): Promise<{\n allowed: boolean;\n limit: number;\n remaining: number;\n resetAt: number;\n }>;\n}\n\nexport function extractTenantId(request: FastifyRequest): string {\n return (\n (request.headers['x-tenant-id'] as string) ||\n process.env.KB_TENANT_ID ||\n 'default'\n );\n}\n\nexport function createRateLimitMiddleware(rateLimiter: TenantRateLimiterLike) {\n return async function rateLimitMiddleware(\n request: FastifyRequest,\n reply: FastifyReply,\n ) {\n const tenantId = extractTenantId(request);\n const result = await rateLimiter.checkLimit(tenantId, 'requests');\n\n reply.header('X-RateLimit-Limit', result.limit);\n reply.header('X-RateLimit-Remaining', result.remaining);\n reply.header('X-RateLimit-Reset', result.resetAt);\n\n if (!result.allowed) {\n const retryAfter = Math.ceil((result.resetAt - Date.now()) / 1000);\n reply.header('Retry-After', retryAfter);\n return reply.code(429).send({\n error: 'RATE_LIMIT_EXCEEDED',\n message: 'Too many requests. Please try again later.',\n retryAfter,\n limit: result.limit,\n resetAt: new Date(result.resetAt).toISOString(),\n });\n }\n\n request.tenantId = tenantId;\n };\n}\n\n/**\n * Register tenant-aware rate limiting as a global preHandler hook.\n *\n * Uses platform.cache as the backing store — same adapter that all other\n * platform components use (memory in dev, Redis in prod, etc.).\n *\n * The 'default' tenant (used when no X-Tenant-ID header is present) gets the\n * tier from KB_TENANT_DEFAULT_TIER env var (defaults to 'free' if unset).\n * In E2E / self-hosted environments set KB_TENANT_DEFAULT_TIER=enterprise to\n * avoid hitting the 10 req/min free-tier rate limit.\n */\nexport function registerTenantRateLimitMiddleware(\n server: FastifyInstance,\n cache: ICache\n): void {\n const limiter = new TenantRateLimiter(cache);\n // Apply the environment-configured tier to the 'default' tenant so that\n // unauthenticated / single-tenant deployments respect KB_TENANT_DEFAULT_TIER.\n limiter.setTier('default', getDefaultTenantTier());\n const handler = createRateLimitMiddleware(limiter);\n server.addHook('preHandler', handler);\n}\n\nexport { TenantRateLimiter };\n","/**\n * @module @kb-labs/rest-api-app/middleware\n * Middleware registration\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { platform } from '@kb-labs/core-runtime';\nimport { registerEnvelopeMiddleware } from './envelope';\nimport { registerRequestIdMiddleware } from './request-id';\nimport { registerMockModeMiddleware } from './mock-mode';\nimport { registerSecurityHeadersMiddleware } from './security-headers';\nimport { registerCacheMiddleware } from './cache';\nimport { registerMetricsMiddleware } from './metrics';\nimport { registerProcessErrorGuard } from './process-error-guard';\nimport { registerStartupThrottle } from './startup-throttle';\nimport { registerRequestTimeoutGuard } from './request-timeout';\nimport { registerTenantRateLimitMiddleware } from './tenant-rate-limit';\n\n/**\n * Middleware chain — порядок регистрации = порядок выполнения\n * (onRequest: top→bottom, onSend: bottom→top)\n *\n * # File Adds to request\n * ─── ──────────────────────── ─────────────────────────────────────────\n * 1 startup-throttle kbStartupGuardActive, kbStartupGuardTimer\n * 2 security-headers (only reply headers)\n * 3 request-id request.id, kbLogger\n * 4 tenant-rate-limit tenantId\n * 5 mock-mode (short-circuits to mock response)\n * 6 request-timeout (reads kbLogger)\n * 7 metrics kbMetricsStart\n * 8 envelope (wraps errors; must run before cache)\n * 9 cache (reads ETag; may return 304)\n * ── process-error-guard NOT a request hook — process.on handlers\n */\nexport function registerMiddleware(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n registerStartupThrottle(server, config);\n registerSecurityHeadersMiddleware(server);\n registerRequestIdMiddleware(server);\n registerTenantRateLimitMiddleware(server, platform.cache);\n registerMockModeMiddleware(server, config);\n registerRequestTimeoutGuard(server, config);\n registerMetricsMiddleware(server);\n // Envelope runs before cache: ETag is computed on the final wrapped payload\n registerEnvelopeMiddleware(server, config);\n registerCacheMiddleware(server);\n // Process-level guard (uncaughtException / unhandledRejection) — not a request hook\n registerProcessErrorGuard(server);\n}\n","/**\n * @module @kb-labs/rest-api-app/server\n * Fastify server setup\n */\n\nimport Fastify from 'fastify';\nimport type { FastifyInstance } from 'fastify';\nimport type { FastifyBaseLogger } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { registerRoutes } from './routes/index';\nimport { registerPlugins } from './plugins';\nimport { registerMiddleware } from './middleware/index';\nimport { platform } from '@kb-labs/core-runtime';\nimport { randomUUID } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { existsSync } from 'node:fs';\nimport type { ILogger } from '@kb-labs/core-platform';\n\n/**\n * Fastify internal symbol to disable request logging\n */\nconst kDisableRequestLogging = Symbol.for('fastify.disableRequestLogging');\n\nfunction serializeForLog(meta: object): string {\n return JSON.stringify(meta, (_key, value) => {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack };\n }\n return value;\n });\n}\n\n/**\n * Create a Pino-compatible wrapper for ILogger\n * Fastify 5 expects a Pino instance, but we want vendor independence\n */\nfunction createPinoCompatibleLogger(logger: ILogger): FastifyBaseLogger {\n const levels = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n };\n\n return {\n // Pino log levels\n trace: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.debug(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.debug(msg, meta);\n }\n },\n debug: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.debug(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.debug(msg, meta);\n }\n },\n info: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.info(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.info(msg, meta);\n }\n },\n warn: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.warn(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.warn(msg, meta);\n }\n },\n error: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.error(serializeForLog(msg), msg instanceof Error ? msg : undefined);\n } else {\n logger.error(msg, args[0] instanceof Error ? args[0] : undefined);\n }\n },\n fatal: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.error(`[FATAL] ${serializeForLog(msg)}`, msg instanceof Error ? msg : undefined);\n } else {\n logger.error(`[FATAL] ${msg}`, args[0] instanceof Error ? args[0] : undefined);\n }\n },\n // Pino child method\n child: (bindings: Record<string, unknown>) => {\n const childLogger = logger.child(bindings);\n return createPinoCompatibleLogger(childLogger);\n },\n // Pino required properties for Fastify 5\n level: 'info',\n levels: {\n values: levels,\n labels: { 10: 'trace', 20: 'debug', 30: 'info', 40: 'warn', 50: 'error', 60: 'fatal' },\n },\n silent: () => {},\n // Pino version symbol (required by Fastify 5 validation)\n [Symbol.for('pino.version')]: '8.0.0',\n } as unknown as FastifyBaseLogger;\n}\n\n/**\n * Create and configure Fastify server\n */\nexport async function createServer(\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry\n): Promise<FastifyInstance> {\n // HTTP/2 configuration (requires HTTPS)\n const useHttp2 = config.http2?.enabled ?? false;\n const allowHTTP1 = config.http2?.allowHTTP1 ?? true;\n\n // SSL configuration\n let httpsOptions: { allowHTTP1: boolean; key: Buffer; cert: Buffer } | undefined;\n if (useHttp2 && config.ssl?.keyPath && config.ssl?.certPath) {\n const keyPath = config.ssl.keyPath;\n const certPath = config.ssl.certPath;\n\n if (existsSync(keyPath) && existsSync(certPath)) {\n httpsOptions = {\n allowHTTP1,\n key: readFileSync(keyPath),\n cert: readFileSync(certPath),\n };\n } else {\n platform.logger.warn('HTTP/2 enabled but SSL certificates not found, falling back to HTTP/1.1', {\n keyPath,\n certPath,\n });\n }\n }\n\n // Create platform logger child for REST layer\n const restLogger = platform.logger.child({\n layer: 'rest',\n service: 'server',\n traceId: randomUUID(),\n });\n\n // Fastify 5 is too strict with logger validation, so disable it and use hooks\n const server = useHttp2 && httpsOptions\n ? Fastify({\n logger: false,\n requestIdHeader: 'X-Request-Id',\n requestIdLogLabel: 'requestId',\n disableRequestLogging: true,\n requestTimeout: config.timeouts?.requestTimeout || 30000,\n bodyLimit: config.timeouts?.bodyLimit || 10485760,\n http2: true,\n https: httpsOptions,\n })\n : Fastify({\n logger: false,\n requestIdHeader: 'X-Request-Id',\n requestIdLogLabel: 'requestId',\n disableRequestLogging: true,\n requestTimeout: config.timeouts?.requestTimeout || 30000,\n bodyLimit: config.timeouts?.bodyLimit || 10485760,\n });\n\n // Add our own logger to server instance\n (server as { log: ILogger }).log = restLogger;\n\n // Override child logger factory to return our custom logger with disable flag\n server.setChildLoggerFactory((logger, bindings, opts, rawReq) => {\n const customLogger = {\n [kDisableRequestLogging]: true, // Disable Fastify's built-in request logging\n debug: (_obj: unknown, _msg?: string) => {},\n info: (_obj: unknown, _msg?: string) => {},\n warn: (_obj: unknown, _msg?: string) => {},\n error: (_obj: unknown, _msg?: string) => {},\n fatal: (_obj: unknown, _msg?: string) => {},\n trace: (_obj: unknown, _msg?: string) => {},\n silent: (_obj: unknown, _msg?: string) => {},\n child: () => customLogger,\n level: 'silent',\n };\n return customLogger as unknown as FastifyBaseLogger;\n });\n\n // Log protocol being used\n if (useHttp2 && httpsOptions) {\n restLogger.info('HTTP/2 enabled with HTTPS', {\n allowHTTP1Fallback: allowHTTP1,\n });\n } else if (useHttp2) {\n restLogger.warn('HTTP/2 requested but SSL certificates missing, using HTTP/1.1');\n } else {\n restLogger.info('Using HTTP/1.1');\n }\n\n // Store registry in server instance\n server.registry = registry;\n\n // Register plugins\n await registerPlugins(server as unknown as FastifyInstance, config);\n\n // Register middleware\n registerMiddleware(server as unknown as FastifyInstance, config);\n\n // Register routes\n await registerRoutes(server as unknown as FastifyInstance, config, repoRoot, registry);\n\n return server as unknown as FastifyInstance;\n}\n\n","/**\n * @module @kb-labs/rest-api-app/bootstrap\n * Server bootstrap and startup\n */\n\nimport { loadRestApiConfig } from '@kb-labs/rest-api-core';\nimport { createServer } from './server';\nimport { findRepoRoot } from '@kb-labs/core-sys';\nimport { createRegistry, type IEntityRegistry } from '@kb-labs/core-registry';\nimport { platform, createServiceBootstrap, loadEnvFromRoot, getPlatformRoot } from '@kb-labs/core-runtime';\nimport type { IServiceTransport } from '@kb-labs/core-platform';\nimport { makeAssemblyHook } from '@kb-labs/plugin-runtime';\nimport { getListenOptions } from '@kb-labs/shared-http';\nimport { SystemMetricsCollector } from './daemon/metrics';\nimport { metricsCollector as requestMetricsCollector, restDomainOperationMetrics } from './middleware/metrics.js';\nimport * as path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\n\n// Singleton CLI API instance for cleanup\nlet registryInstance: IEntityRegistry | null = null;\n\n// System metrics collector instance for cleanup\nlet metricsCollector: SystemMetricsCollector | null = null;\n\n/**\n * Find the monorepo root: the NEAREST ancestor of `startDir` that owns a\n * `pnpm-workspace.yaml`.\n *\n * \"Nearest\" is deliberate. In a normal checkout there is exactly one\n * `pnpm-workspace.yaml` (at the repo root), so nearest == that root. In a git\n * **worktree** nested under the main checkout (e.g.\n * `<main>/.claude/worktrees/<id>/`) BOTH the worktree and the main checkout\n * have a `pnpm-workspace.yaml`; the process is running in the worktree, so the\n * worktree is the correct root. The previous implementation preferred the\n * *topmost* match (and gated on a stale `kb-*` literal that no longer appears\n * in the workspace globs), which always resolved a nested worktree back to the\n * main checkout — so plugin discovery loaded the main branch's plugins instead\n * of the worktree's. That silently served stale plugin manifests/routes.\n */\nexport async function findMonorepoRoot(startDir: string): Promise<string> {\n let dir = path.resolve(startDir);\n while (true) {\n const hasWorkspace = await fs\n .access(path.join(dir, 'pnpm-workspace.yaml'))\n .then(() => true)\n .catch(() => false);\n if (hasWorkspace) {\n return dir;\n }\n\n const parent = path.dirname(dir);\n if (parent === dir) {\n break;\n }\n dir = parent;\n }\n\n // No pnpm-workspace.yaml anywhere up the tree — fall back to git repo root.\n return findRepoRoot(startDir);\n}\n\n/**\n * Bootstrap REST API server\n */\nexport async function bootstrap(cwd: string = process.cwd()): Promise<void> {\n // Detect repo root first so we can load .env before any config reads\n const repoRoot = await findMonorepoRoot(cwd);\n\n // Load .env early — must happen before loadRestApiConfig() so that\n // KB_REST_* env overrides (port, redis, etc.) are available to the config mapper\n loadEnvFromRoot(repoRoot);\n\n // Load configuration (envMapper now sees fully-populated process.env)\n const { config, diagnostics } = await loadRestApiConfig(cwd);\n\n // Initialize platform (adapters from kb.config.json; .env already loaded above)\n await createServiceBootstrap({ appId: 'rest-api', repoRoot, assemblyHook: makeAssemblyHook() });\n\n // Now we can use platform.logger (configured from kb.config.json)\n const startupRequestId = `rest-startup-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const startupTraceId = randomUUID();\n const startupSpanId = randomUUID();\n const bootstrapLogger = platform.logger.child({\n layer: 'rest',\n service: 'bootstrap',\n requestId: startupRequestId,\n reqId: startupRequestId,\n traceId: startupTraceId,\n spanId: startupSpanId,\n invocationId: startupSpanId,\n executionId: startupSpanId,\n });\n\n if (diagnostics.length > 0) {\n bootstrapLogger.warn('Configuration diagnostics', { diagnosticsCount: diagnostics.length });\n for (const diagnostic of diagnostics) {\n bootstrapLogger.warn('Configuration diagnostic', {\n level: diagnostic.level,\n message: diagnostic.message,\n });\n }\n }\n\n bootstrapLogger.info('Resolved repo root', { cwd, repoRoot });\n bootstrapLogger.info('Platform adapters initialized');\n\n // Initialize entity registry\n bootstrapLogger.info('Initializing entity registry');\n\n const isDevelopment = process.env.NODE_ENV !== 'production';\n const snapshotTTL = isDevelopment\n ? 10 * 60 * 1000 // 10 minutes for development\n : 60 * 60 * 1000; // 1 hour for production\n\n // Project root is always the primary source for plugin discovery.\n // In installed mode (platform.dir set), the platform lock fills gaps —\n // but project marketplace.lock wins on conflict (project overrides platform).\n const platformRoot = getPlatformRoot();\n const registryInitStart = performance.now();\n const registry = await createRegistry({\n root: repoRoot,\n platformRoot: platformRoot !== repoRoot ? platformRoot : undefined,\n cache: {\n ttlMs: snapshotTTL,\n adapter: platform.cache,\n },\n });\n restDomainOperationMetrics.recordOperation('registry.init', performance.now() - registryInitStart, 'ok');\n\n const plugins = registry.listPlugins();\n bootstrapLogger.info('Entity registry initialized', {\n pluginsFound: plugins.length,\n pluginIds: plugins.map(p => `${p.id}@${p.version}`),\n });\n\n registryInstance = registry;\n\n registry.onChange((diff) => {\n restDomainOperationMetrics.recordOperation('registry.refresh', 0, 'ok');\n bootstrapLogger.info('Registry changed', {\n added: diff.added.length,\n removed: diff.removed.length,\n changed: diff.changed.length,\n });\n });\n\n const server = await createServer(config, repoRoot, registry);\n\n // Start system metrics collector\n bootstrapLogger.info('Starting system metrics collector');\n metricsCollector = new SystemMetricsCollector('rest', () => requestMetricsCollector.getActiveRequests());\n await metricsCollector.start(10000, 60000); // Collect every 10s, TTL 60s\n\n // Bind port from the transport (single declarative network source): rest is a\n // TCP service in the serviceTransport map, so it listens on exactly the port\n // the transport publishes for 'rest' — keeping bind and route consistent\n // (incl. any KB_NET_OFFSET shift). Falls back to config.port when no transport.\n const restTransport = platform.getAdapter<IServiceTransport>('serviceTransport');\n const restAddr = restTransport?.listenAddress?.('rest');\n const listenPort = restAddr && 'port' in restAddr ? restAddr.port : config.port;\n const restAddrHost = restAddr && 'host' in restAddr ? restAddr.host : undefined;\n\n // Start server. Host precedence: REST_API_HOST env > transport's advisory host\n // > 0.0.0.0 (0.0.0.0 keeps Docker port-forwarding working; set\n // REST_API_HOST=127.0.0.1 to restrict to loopback when all traffic is routed\n // through the gateway).\n const restHost = process.env.REST_API_HOST ?? restAddrHost ?? '0.0.0.0';\n const address = await server.listen(getListenOptions(listenPort, restHost));\n\n bootstrapLogger.info('REST API server listening', { address });\n\n // Setup graceful shutdown\n const shutdown = async (signal: string) => {\n bootstrapLogger.warn('Received shutdown signal', { signal });\n\n // Stop metrics collector\n if (metricsCollector) {\n metricsCollector.stop();\n metricsCollector = null;\n }\n\n // Dispose CLI API\n if (registryInstance) {\n await registryInstance.dispose();\n registryInstance = null;\n }\n\n // Shutdown platform (includes ExecutionBackend and all adapters)\n await platform.shutdown();\n bootstrapLogger.info('Platform shutdown complete');\n\n // Close server\n await server.close();\n bootstrapLogger.info('Server closed');\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n}\n","/**\n * @module @kb-labs/rest-api-app\n * REST API application entry point\n */\n\nimport { bootstrap } from './bootstrap';\n\n// process.cwd() = workspace root when launched via `node ./platform/kb-labs-rest-api/.../dist/index.js`\nbootstrap(process.cwd()).catch((error) => {\n console.error('Failed to start server:', error);\n process.exit(1);\n});\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/events/hub.ts","../src/routes/readiness.ts","../src/observability/prometheus-registry.ts","../src/middleware/metrics.ts","../src/routes/sse-auth.ts","../src/routes/events.ts","../src/routes/path-helpers.ts","../src/daemon/metrics/system-metrics-collector.ts","../src/daemon/metrics/historical-metrics.ts","../src/observability/service-contract.ts","../src/routes/health.ts","../src/routes/openapi.ts","../src/diagnostics/header-debug.ts","../src/routes/metrics.ts","../src/routes/plugins.ts","../src/routes/workflows.ts","../src/routes/jobs.ts","../src/routes/cache.ts","../src/routes/observability.ts","../src/routes/analytics.ts","../src/routes/adapters.ts","../src/routes/logs.ts","../src/routes/platform.ts","../src/routes/adapter-call.ts","../src/routes/debug.ts","../src/routes/index.ts","../src/plugins.ts","../src/middleware/envelope.ts","../src/middleware/request-id.ts","../src/middleware/mock-mode.ts","../src/middleware/security-headers.ts","../src/middleware/cache.ts","../src/middleware/process-error-guard.ts","../src/middleware/startup-throttle.ts","../src/middleware/request-timeout.ts","../src/middleware/tenant-rate-limit.ts","../src/middleware/index.ts","../src/server.ts","../src/bootstrap.ts","../src/index.ts"],"names":["resolve","memoryUsage","platform","hostname","REST_VERSION","path","performance","join","existsSync","result","message","z","normalizeBasePath","metricsCollector","randomUUID"],"mappings":"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","file":"index.js","sourcesContent":["import { EventEmitter } from 'node:events';\n\nexport type RegistryBroadcast = {\n type: 'registry';\n rev: number;\n generatedAt?: string;\n partial?: boolean;\n stale?: boolean;\n expiresAt?: string | null;\n ttlMs?: number | null;\n checksum?: string;\n checksumAlgorithm?: 'sha256';\n previousChecksum?: string | null;\n};\n\nexport type HealthBroadcast = {\n type: 'health';\n status: 'healthy' | 'degraded';\n ts: string;\n ready: boolean;\n reason?: string;\n registryPartial?: boolean;\n registryStale?: boolean;\n registryLoaded?: boolean;\n pluginMountInProgress?: boolean;\n pluginRoutesMounted?: boolean;\n pluginsMounted?: number;\n pluginsFailed?: number;\n lastPluginMountTs?: string | null;\n pluginRoutesLastDurationMs?: number | null;\n redisEnabled?: boolean;\n redisHealthy?: boolean;\n redisStates?: {\n publisher: string | null;\n subscriber: string | null;\n cache: string | null;\n };\n};\n\nexport type BroadcastEvent = RegistryBroadcast | HealthBroadcast;\n\nexport class EventHub {\n private emitter: EventEmitter;\n\n constructor() {\n this.emitter = new EventEmitter();\n this.emitter.setMaxListeners(0);\n }\n\n publish(event: BroadcastEvent): void {\n this.emitter.emit('broadcast', event);\n }\n\n subscribe(handler: (event: BroadcastEvent) => void): () => void {\n this.emitter.on('broadcast', handler);\n return () => {\n this.emitter.off('broadcast', handler);\n };\n }\n}\n","// Shared readiness state for health and plugin routes\nexport interface ReadinessState {\n cliApiInitialized: boolean;\n registryLoaded: boolean;\n registryPartial: boolean;\n registryStale: boolean;\n pluginRoutesMounted: boolean;\n pluginMountInProgress: boolean;\n pluginRoutesCount: number;\n pluginRouteErrors: number;\n pluginRouteFailures: Array<{ id: string; error: string }>;\n lastPluginMountTs?: string | null;\n pluginRoutesLastDurationMs?: number | null;\n redisEnabled: boolean;\n redisConnected: boolean;\n redisStates: {\n publisher: string | null;\n subscriber: string | null;\n cache: string | null;\n };\n}\n\nexport function createInitialReadinessState(): ReadinessState {\n return {\n cliApiInitialized: false,\n registryLoaded: false,\n registryPartial: false,\n registryStale: false,\n pluginRoutesMounted: false,\n pluginMountInProgress: true,\n pluginRoutesCount: 0,\n pluginRouteErrors: 0,\n pluginRouteFailures: [],\n lastPluginMountTs: null,\n pluginRoutesLastDurationMs: null,\n redisEnabled: false,\n redisConnected: true,\n redisStates: {\n publisher: null,\n subscriber: null,\n cache: null,\n },\n };\n}\n\nexport function isReady(readiness: ReadinessState): boolean {\n return (\n readiness.cliApiInitialized &&\n readiness.registryLoaded &&\n !readiness.registryPartial &&\n !readiness.registryStale &&\n (!readiness.redisEnabled || readiness.redisConnected)\n );\n}\n\nexport function resolveReadinessReason(readiness: ReadinessState):\n | 'ready'\n | 'cli_api_not_initialized'\n | 'registry_not_loaded'\n | 'registry_partial'\n | 'registry_snapshot_stale'\n | 'redis_unavailable'\n | 'plugin_mount_in_progress' {\n if (!readiness.cliApiInitialized) {\n return 'cli_api_not_initialized';\n }\n if (!readiness.registryLoaded) {\n if (readiness.registryStale) {\n return 'registry_snapshot_stale';\n }\n if (readiness.registryPartial) {\n return 'registry_partial';\n }\n return 'registry_not_loaded';\n }\n if (readiness.redisEnabled && !readiness.redisConnected) {\n return 'redis_unavailable';\n }\n if (readiness.pluginMountInProgress) {\n return 'plugin_mount_in_progress';\n }\n return 'ready';\n}\n","/**\n * @module @kb-labs/rest-api-app/observability/prometheus-registry\n * Prometheus metric definitions for the REST API service.\n * These are definitions only — not a Fastify hook.\n */\n\nimport { Registry, Histogram, Counter, Gauge } from 'prom-client';\n\n/**\n * Prometheus metrics registry\n */\nexport const promRegistry = new Registry();\n\n/**\n * HTTP request duration histogram with percentiles\n * Automatically calculates p50, p95, p99\n */\nexport const httpRequestDuration = new Histogram({\n name: 'http_request_duration_ms',\n help: 'HTTP request duration in milliseconds',\n labelNames: ['method', 'route', 'status_code', 'tenant', 'plugin'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000], // milliseconds\n registers: [promRegistry],\n});\n\n/**\n * HTTP requests total counter\n */\nexport const httpRequestsTotal = new Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'route', 'status_code', 'tenant', 'plugin'],\n registers: [promRegistry],\n});\n\n/**\n * HTTP errors total counter\n */\nexport const httpErrorsTotal = new Counter({\n name: 'http_errors_total',\n help: 'Total number of HTTP errors (4xx, 5xx)',\n labelNames: ['status_code', 'error_code', 'tenant'],\n registers: [promRegistry],\n});\n\n/**\n * Process uptime gauge\n */\nexport const processUptime = new Gauge({\n name: 'process_uptime_seconds',\n help: 'Process uptime in seconds',\n registers: [promRegistry],\n});\n\nexport const processCpuPercent = new Gauge({\n name: 'process_cpu_percent',\n help: 'Current process CPU usage percentage',\n registers: [promRegistry],\n});\n\nexport const processRssBytes = new Gauge({\n name: 'process_rss_bytes',\n help: 'Current process resident set size in bytes',\n registers: [promRegistry],\n});\n\nexport const processHeapUsedBytes = new Gauge({\n name: 'process_heap_used_bytes',\n help: 'Current process heap used in bytes',\n registers: [promRegistry],\n});\n\nexport const processEventLoopLagMs = new Gauge({\n name: 'process_event_loop_lag_ms',\n help: 'Current event loop lag in milliseconds',\n registers: [promRegistry],\n});\n\nexport const serviceHealthStatus = new Gauge({\n name: 'service_health_status',\n help: 'Service health status (2=healthy, 1=degraded, 0=unhealthy)',\n registers: [promRegistry],\n});\n\nexport const serviceRestartsTotal = new Gauge({\n name: 'service_restarts_total',\n help: 'Service restart counter within current process lifetime',\n registers: [promRegistry],\n});\n\nexport const serviceActiveOperations = new Gauge({\n name: 'service_active_operations',\n help: 'Current number of active operations',\n registers: [promRegistry],\n});\n\nexport const serviceOperationTotal = new Counter({\n name: 'service_operation_total',\n help: 'Total number of service operations',\n labelNames: ['operation', 'status'],\n registers: [promRegistry],\n});\n\nexport const serviceOperationDuration = new Histogram({\n name: 'service_operation_duration_ms',\n help: 'Service operation duration in milliseconds',\n labelNames: ['operation', 'status'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000],\n registers: [promRegistry],\n});\n\n/**\n * Header policy metrics\n */\nexport const headersFiltered = new Counter({\n name: 'kb_headers_filtered_total',\n help: 'Total headers filtered by policy enforcement',\n labelNames: ['direction', 'plugin'],\n registers: [promRegistry],\n});\n\nexport const headersSensitiveInbound = new Counter({\n name: 'kb_headers_sensitive_inbound_total',\n help: 'Sensitive inbound headers observed',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const headersValidationErrors = new Counter({\n name: 'kb_headers_validation_errors_total',\n help: 'Header validation errors encountered',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const headersVaryApplied = new Counter({\n name: 'kb_headers_vary_applied_total',\n help: 'Vary header entries applied by policy',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const headersDryRunDecisions = new Counter({\n name: 'kb_headers_dry_run_decisions_total',\n help: 'Header decisions skipped due to dry-run mode',\n registers: [promRegistry],\n});\n\n/**\n * Plugin metrics\n */\nexport const pluginRequestsTotal = new Counter({\n name: 'kb_plugin_request_total',\n help: 'Total HTTP requests per plugin',\n labelNames: ['plugin'],\n registers: [promRegistry],\n});\n\nexport const pluginRequestDuration = new Histogram({\n name: 'kb_plugin_request_duration_ms',\n help: 'Plugin request duration metrics',\n labelNames: ['plugin'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000],\n registers: [promRegistry],\n});\n\n/**\n * Tenant metrics\n */\nexport const tenantRequestsTotal = new Counter({\n name: 'kb_tenant_request_total',\n help: 'Total HTTP requests per tenant',\n labelNames: ['tenant'],\n registers: [promRegistry],\n});\n\nexport const tenantErrorsTotal = new Counter({\n name: 'kb_tenant_request_errors_total',\n help: 'Total HTTP errors per tenant',\n labelNames: ['tenant'],\n registers: [promRegistry],\n});\n\nexport const tenantRequestDuration = new Histogram({\n name: 'kb_tenant_request_duration_ms',\n help: 'Tenant request duration',\n labelNames: ['tenant'],\n buckets: [5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000],\n registers: [promRegistry],\n});\n\n/**\n * Plugin mount metrics\n */\nexport const pluginsMountTotal = new Gauge({\n name: 'kb_plugins_mount_total',\n help: 'Plugins processed during last mount run',\n registers: [promRegistry],\n});\n\nexport const pluginsMountSucceeded = new Gauge({\n name: 'kb_plugins_mount_succeeded',\n help: 'Plugins successfully mounted',\n registers: [promRegistry],\n});\n\nexport const pluginsMountFailed = new Gauge({\n name: 'kb_plugins_mount_failed',\n help: 'Plugins failed to mount',\n registers: [promRegistry],\n});\n\nexport const pluginsMountElapsed = new Gauge({\n name: 'kb_plugins_mount_elapsed_ms',\n help: 'Plugin mount elapsed time in milliseconds',\n registers: [promRegistry],\n});\n\n/**\n * Redis metrics\n */\nexport const redisStatusUpdates = new Counter({\n name: 'kb_redis_status_updates_total',\n help: 'Redis status updates observed',\n registers: [promRegistry],\n});\n\nexport const redisStatusTransitions = new Counter({\n name: 'kb_redis_status_transitions_total',\n help: 'Redis health transitions',\n labelNames: ['state'],\n registers: [promRegistry],\n});\n\nexport const redisHealthy = new Gauge({\n name: 'kb_redis_healthy',\n help: 'Redis healthy flag (1 = healthy)',\n registers: [promRegistry],\n});\n\nexport const redisRoleState = new Gauge({\n name: 'kb_redis_role_state_total',\n help: 'Redis role state occurrences',\n labelNames: ['role', 'state'],\n registers: [promRegistry],\n});\n\n/**\n * Update process uptime metric\n */\nexport function updateProcessUptime(startTimeMs: number): void {\n const uptimeSeconds = (Date.now() - startTimeMs) / 1000;\n processUptime.set(uptimeSeconds);\n}\n\nexport function updateRuntimeObservabilityMetrics(input: {\n cpuPercent: number;\n rssBytes: number;\n heapUsedBytes: number;\n eventLoopLagMs: number;\n activeOperations: number;\n healthStatus?: 'healthy' | 'degraded' | 'unhealthy';\n}): void {\n processCpuPercent.set(input.cpuPercent);\n processRssBytes.set(input.rssBytes);\n processHeapUsedBytes.set(input.heapUsedBytes);\n processEventLoopLagMs.set(input.eventLoopLagMs);\n serviceActiveOperations.set(input.activeOperations);\n serviceRestartsTotal.set(0);\n\n if (input.healthStatus) {\n updateServiceHealthStatus(input.healthStatus);\n }\n}\n\nexport function updateServiceHealthStatus(status: 'healthy' | 'degraded' | 'unhealthy'): void {\n serviceHealthStatus.set(status === 'healthy' ? 2 : status === 'degraded' ? 1 : 0);\n}\n\n/**\n * Get all metrics in Prometheus format\n */\nexport async function getPrometheusMetrics(): Promise<string> {\n return promRegistry.metrics();\n}\n","import { performance } from 'node:perf_hooks';\nimport type { FastifyInstance } from 'fastify';\ntype RedisStatus = {\n enabled: boolean;\n healthy: boolean;\n roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null };\n};\nimport { OperationMetricsTracker } from '@kb-labs/shared-http';\nimport {\n httpRequestDuration,\n httpRequestsTotal,\n httpErrorsTotal,\n serviceActiveOperations,\n serviceOperationDuration,\n serviceOperationTotal,\n tenantRequestsTotal,\n tenantErrorsTotal,\n tenantRequestDuration,\n} from '../observability/prometheus-registry';\nimport { platform } from '@kb-labs/core-runtime';\n\n/**\n * @module @kb-labs/rest-api-app/middleware/metrics\n * Metrics collection middleware\n */\n\n/**\n * Metrics data\n */\ntype RedisRole = 'publisher' | 'subscriber' | 'cache';\n\ninterface RedisMetrics {\n updates: number;\n healthyTransitions: number;\n unhealthyTransitions: number;\n lastUpdateTs: number | null;\n lastHealthyTs: number | null;\n lastUnhealthyTs: number | null;\n lastStatus: {\n enabled: boolean;\n healthy: boolean;\n roles: Record<RedisRole, string | null>;\n } | null;\n roleStates: Record<RedisRole, Record<string, number>>;\n}\n\ninterface Metrics {\n requests: {\n total: number;\n active: number;\n byMethod: Record<string, number>;\n byStatus: Record<string, number>;\n byRoute: Record<string, number>;\n byTenant: Record<string, number>; // ← Multi-tenancy support\n };\n latency: {\n total: number;\n count: number;\n min: number;\n max: number;\n average: number;\n histogram: Map<string, RouteLatencyStats>;\n };\n errors: {\n total: number;\n byCode: Record<string, number>;\n };\n timestamps: {\n startTime: number;\n lastRequest: number;\n };\n headers: {\n filteredInbound: number;\n filteredOutbound: number;\n sensitiveInbound: number;\n validationErrors: number;\n varyApplied: number;\n dryRunDecisions: number;\n byPlugin: Record<string, HeaderPluginMetrics>;\n };\n redis: RedisMetrics;\n // ← Multi-tenancy support\n perTenant: Map<string, {\n total: number;\n errors: number;\n totalLatency: number;\n }>;\n}\n\ntype RouteLatencyStats = {\n count: number;\n total: number;\n max: number;\n byStatus: Record<string, number>;\n};\n\ntype HeaderPluginMetrics = {\n filteredInbound: number;\n filteredOutbound: number;\n validationErrors: number;\n varyApplied: number;\n sensitiveInbound: number;\n};\n\ntype HeaderMetricsEntry = {\n pluginId?: string;\n routeId?: string;\n filteredInbound: number;\n filteredOutbound: number;\n sensitiveInbound: number;\n validationErrors: number;\n varyApplied: number;\n dryRun: boolean;\n};\n\nexport type PluginsMetricsSnapshot = {\n total: number;\n succeeded: number;\n failed: number;\n elapsedMs: number;\n};\n\ntype PluginsMetricsDetails = Record<string, {\n routes: number;\n status: 'ok' | 'failed';\n durationMs: number;\n lastError?: string;\n}>;\n\nclass PluginsMetricsCollector {\n private metrics: PluginsMetricsSnapshot & { details: PluginsMetricsDetails } = this.createDefault();\n\n private createDefault(): PluginsMetricsSnapshot & { details: PluginsMetricsDetails } {\n return {\n total: 0,\n succeeded: 0,\n failed: 0,\n elapsedMs: 0,\n details: {},\n };\n }\n\n reset(): void {\n this.metrics = this.createDefault();\n }\n\n recordSuccess(pluginId: string, routes: number, durationMs: number): void {\n this.metrics.total += 1;\n this.metrics.succeeded += 1;\n this.metrics.elapsedMs += durationMs;\n this.metrics.details[pluginId] = {\n routes,\n status: 'ok',\n durationMs,\n };\n }\n\n recordFailure(pluginId: string, error: string): void {\n this.metrics.total += 1;\n this.metrics.failed += 1;\n this.metrics.details[pluginId] = {\n routes: 0,\n status: 'failed',\n durationMs: 0,\n lastError: error,\n };\n }\n\n getSnapshot(): PluginsMetricsSnapshot {\n return {\n total: this.metrics.total,\n succeeded: this.metrics.succeeded,\n failed: this.metrics.failed,\n elapsedMs: Number(this.metrics.elapsedMs.toFixed(2)),\n };\n }\n\n getDetails(): PluginsMetricsDetails {\n return this.metrics.details;\n }\n}\n\nexport interface MetricsSnapshot {\n requests: Metrics['requests'] & {\n success: number;\n clientErrors: number;\n serverErrors: number;\n };\n latency: Omit<Metrics['latency'], 'histogram'> & {\n histogram: Array<{\n route: string;\n count: number;\n total: number;\n max: number;\n byStatus: Record<string, number>;\n budgetMs: number | null;\n pluginId?: string;\n }>;\n };\n perPlugin: Array<{\n pluginId?: string;\n total: number;\n totalDuration: number;\n maxDuration: number;\n statuses: Record<string, number>;\n }>;\n perTenant: Array<{\n tenantId: string;\n total: number;\n errors: number;\n avgLatencyMs: number;\n }>;\n errors: Metrics['errors'];\n timestamps: Metrics['timestamps'];\n headers: {\n filteredInbound: number;\n filteredOutbound: number;\n sensitiveInbound: number;\n validationErrors: number;\n varyApplied: number;\n dryRunDecisions: number;\n perPlugin: Array<{\n pluginId: string;\n filteredInbound: number;\n filteredOutbound: number;\n validationErrors: number;\n varyApplied: number;\n sensitiveInbound: number;\n }>;\n };\n redis: {\n updates: number;\n healthyTransitions: number;\n unhealthyTransitions: number;\n lastUpdateTs: number | null;\n lastHealthyTs: number | null;\n lastUnhealthyTs: number | null;\n lastStatus: {\n enabled: boolean;\n healthy: boolean;\n roles: Record<RedisRole, string | null>;\n } | null;\n roleStates: Array<{\n role: RedisRole;\n states: Array<{ state: string; count: number }>;\n }>;\n };\n}\n\nclass MetricsCollector {\n private metrics: Metrics = this.createMetrics();\n private pluginsMetrics = new PluginsMetricsCollector();\n private lastPluginSnapshot: PluginsMetricsSnapshot | null = null;\n private pluginRouteBudgets = new Map<string, { budgetMs: number | null; pluginId?: string }>();\n\n private createMetrics(): Metrics {\n return {\n requests: {\n total: 0,\n active: 0,\n byMethod: {},\n byStatus: {},\n byRoute: {},\n byTenant: {}, // ← Multi-tenancy support\n },\n latency: {\n total: 0,\n count: 0,\n min: Infinity,\n max: 0,\n average: 0,\n histogram: new Map<string, RouteLatencyStats>(),\n },\n errors: {\n total: 0,\n byCode: {},\n },\n timestamps: {\n startTime: Date.now(),\n lastRequest: Date.now(),\n },\n headers: {\n filteredInbound: 0,\n filteredOutbound: 0,\n sensitiveInbound: 0,\n validationErrors: 0,\n varyApplied: 0,\n dryRunDecisions: 0,\n byPlugin: {},\n },\n redis: this.createRedisMetrics(),\n perTenant: new Map(), // ← Multi-tenancy support\n };\n }\n\n private createRedisMetrics(): RedisMetrics {\n return {\n updates: 0,\n healthyTransitions: 0,\n unhealthyTransitions: 0,\n lastUpdateTs: null,\n lastHealthyTs: null,\n lastUnhealthyTs: null,\n lastStatus: null,\n roleStates: {\n publisher: {},\n subscriber: {},\n cache: {},\n },\n };\n }\n\n recordRequest(method: string, route: string, statusCode: number, durationMs: number, tenantId?: string): void {\n this.metrics.requests.total++;\n this.metrics.requests.byMethod[method] = (this.metrics.requests.byMethod[method] || 0) + 1;\n const statusGroup = `${Math.floor(statusCode / 100)}xx`;\n this.metrics.requests.byStatus[statusGroup] = (this.metrics.requests.byStatus[statusGroup] || 0) + 1;\n\n const normalizedRoute = normalizeRoute(route);\n if (normalizedRoute) {\n const routeBucket = `${method} ${normalizedRoute}`;\n this.metrics.requests.byRoute[routeBucket] = (this.metrics.requests.byRoute[routeBucket] || 0) + 1;\n updateLatencyHistogram(this.metrics.latency.histogram, routeBucket, durationMs, statusCode);\n }\n\n // ← Multi-tenancy support: track by tenant\n if (tenantId) {\n this.metrics.requests.byTenant[tenantId] = (this.metrics.requests.byTenant[tenantId] || 0) + 1;\n\n const tenantStats = this.metrics.perTenant.get(tenantId) || {\n total: 0,\n errors: 0,\n totalLatency: 0,\n };\n tenantStats.total++;\n tenantStats.totalLatency += durationMs;\n if (statusCode >= 400) {\n tenantStats.errors++;\n }\n this.metrics.perTenant.set(tenantId, tenantStats);\n }\n\n this.metrics.latency.count++;\n this.metrics.latency.total += durationMs;\n this.metrics.latency.min = Math.min(this.metrics.latency.min, durationMs);\n this.metrics.latency.max = Math.max(this.metrics.latency.max, durationMs);\n this.metrics.latency.average = this.metrics.latency.total / this.metrics.latency.count;\n this.metrics.timestamps.lastRequest = Date.now();\n }\n\n incrementActiveRequests(): number {\n this.metrics.requests.active += 1;\n return this.metrics.requests.active;\n }\n\n decrementActiveRequests(): number {\n this.metrics.requests.active = Math.max(0, this.metrics.requests.active - 1);\n return this.metrics.requests.active;\n }\n\n getActiveRequests(): number {\n return this.metrics.requests.active;\n }\n\n recordError(errorCode: string): void {\n this.metrics.errors.total++;\n this.metrics.errors.byCode[errorCode] = (this.metrics.errors.byCode[errorCode] || 0) + 1;\n }\n\n recordHeaderMetrics(entry: HeaderMetricsEntry): void {\n const headers = this.metrics.headers;\n headers.filteredInbound += Math.max(0, entry.filteredInbound);\n headers.filteredOutbound += Math.max(0, entry.filteredOutbound);\n headers.sensitiveInbound += Math.max(0, entry.sensitiveInbound);\n headers.validationErrors += Math.max(0, entry.validationErrors);\n headers.varyApplied += Math.max(0, entry.varyApplied);\n if (entry.dryRun) {\n headers.dryRunDecisions += Math.max(\n 0,\n entry.filteredInbound + entry.filteredOutbound + entry.validationErrors\n );\n }\n\n if (entry.pluginId) {\n const existing: HeaderPluginMetrics = headers.byPlugin[entry.pluginId] ?? {\n filteredInbound: 0,\n filteredOutbound: 0,\n validationErrors: 0,\n varyApplied: 0,\n sensitiveInbound: 0,\n };\n existing.filteredInbound += Math.max(0, entry.filteredInbound);\n existing.filteredOutbound += Math.max(0, entry.filteredOutbound);\n existing.validationErrors += Math.max(0, entry.validationErrors);\n existing.varyApplied += Math.max(0, entry.varyApplied);\n existing.sensitiveInbound += Math.max(0, entry.sensitiveInbound);\n headers.byPlugin[entry.pluginId] = existing;\n }\n }\n\n recordRedisStatus(status: RedisStatus | null): void {\n if (!status) {\n return;\n }\n const now = Date.now();\n const redisMetrics = this.metrics.redis;\n const previous = redisMetrics.lastStatus;\n\n redisMetrics.updates += 1;\n redisMetrics.lastUpdateTs = now;\n if (status.healthy) {\n redisMetrics.lastHealthyTs = now;\n } else {\n redisMetrics.lastUnhealthyTs = now;\n }\n\n if (previous && previous.healthy !== status.healthy) {\n if (status.healthy) {\n redisMetrics.healthyTransitions += 1;\n } else {\n redisMetrics.unhealthyTransitions += 1;\n }\n }\n\n const normalizedRoles: Record<RedisRole, string | null> = {\n publisher: status.roles.publisher ?? null,\n subscriber: status.roles.subscriber ?? null,\n cache: status.roles.cache ?? null,\n };\n\n (Object.keys(normalizedRoles) as RedisRole[]).forEach((role) => {\n const state = normalizedRoles[role] ?? 'unknown';\n const bucket = state ?? 'unknown';\n redisMetrics.roleStates[role][bucket] =\n (redisMetrics.roleStates[role][bucket] ?? 0) + 1;\n });\n\n redisMetrics.lastStatus = {\n enabled: status.enabled,\n healthy: status.healthy,\n roles: normalizedRoles,\n };\n }\n\n getMetrics(): MetricsSnapshot {\n const avg = this.metrics.latency.count > 0\n ? this.metrics.latency.total / this.metrics.latency.count\n : 0;\n\n const perPluginMap = new Map<string, {\n pluginId?: string;\n total: number;\n totalDuration: number;\n maxDuration: number;\n statuses: Record<string, number>;\n }>();\n\n const histogramArray = Array.from(this.metrics.latency.histogram.entries()).map(([route, stats]) => {\n const entry = this.pluginRouteBudgets.get(route);\n const pluginId = entry?.pluginId;\n if (pluginId) {\n let aggregate = perPluginMap.get(pluginId);\n if (!aggregate) {\n aggregate = {\n pluginId,\n total: 0,\n totalDuration: 0,\n maxDuration: 0,\n statuses: {},\n };\n perPluginMap.set(pluginId, aggregate);\n }\n aggregate.total += stats.count;\n aggregate.totalDuration += stats.total;\n aggregate.maxDuration = Math.max(aggregate.maxDuration, stats.max);\n for (const [statusCode, count] of Object.entries(stats.byStatus)) {\n aggregate.statuses[statusCode] = (aggregate.statuses[statusCode] || 0) + count;\n }\n }\n\n return {\n route,\n count: stats.count,\n total: stats.total,\n max: stats.max,\n byStatus: { ...stats.byStatus },\n budgetMs: entry?.budgetMs ?? null,\n pluginId,\n };\n });\n\n const headerPerPlugin = Object.entries(this.metrics.headers.byPlugin).map(([pluginId, data]) => ({\n pluginId,\n filteredInbound: data.filteredInbound,\n filteredOutbound: data.filteredOutbound,\n validationErrors: data.validationErrors,\n varyApplied: data.varyApplied,\n sensitiveInbound: data.sensitiveInbound,\n }));\n\n const redisRoleStates = (Object.keys(this.metrics.redis.roleStates) as RedisRole[]).map((role) => ({\n role,\n states: Object.entries(this.metrics.redis.roleStates[role]).map(([state, count]) => ({\n state,\n count,\n })),\n }));\n\n const lastRedisStatus = this.metrics.redis.lastStatus\n ? {\n enabled: this.metrics.redis.lastStatus.enabled,\n healthy: this.metrics.redis.lastStatus.healthy,\n roles: { ...this.metrics.redis.lastStatus.roles },\n }\n : null;\n\n // Serialize perTenant Map to Array\n const perTenantArray = Array.from(this.metrics.perTenant.entries()).map(([tenantId, stats]) => ({\n tenantId,\n total: stats.total,\n errors: stats.errors,\n avgLatencyMs: stats.total > 0 ? stats.totalLatency / stats.total : 0,\n }));\n\n // Calculate success/error counts from byStatus\n const success = (this.metrics.requests.byStatus['2xx'] || 0) + (this.metrics.requests.byStatus['3xx'] || 0);\n const clientErrors = this.metrics.requests.byStatus['4xx'] || 0;\n const serverErrors = this.metrics.requests.byStatus['5xx'] || 0;\n\n return {\n requests: {\n ...this.metrics.requests,\n success,\n clientErrors,\n serverErrors,\n },\n latency: {\n total: this.metrics.latency.total,\n count: this.metrics.latency.count,\n min: this.metrics.latency.min,\n max: this.metrics.latency.max,\n average: avg,\n histogram: histogramArray,\n },\n perPlugin: Array.from(perPluginMap.values()),\n perTenant: perTenantArray,\n errors: { ...this.metrics.errors, byCode: { ...this.metrics.errors.byCode } },\n timestamps: { ...this.metrics.timestamps },\n headers: {\n filteredInbound: this.metrics.headers.filteredInbound,\n filteredOutbound: this.metrics.headers.filteredOutbound,\n sensitiveInbound: this.metrics.headers.sensitiveInbound,\n validationErrors: this.metrics.headers.validationErrors,\n varyApplied: this.metrics.headers.varyApplied,\n dryRunDecisions: this.metrics.headers.dryRunDecisions,\n perPlugin: headerPerPlugin,\n },\n redis: {\n updates: this.metrics.redis.updates,\n healthyTransitions: this.metrics.redis.healthyTransitions,\n unhealthyTransitions: this.metrics.redis.unhealthyTransitions,\n lastUpdateTs: this.metrics.redis.lastUpdateTs,\n lastHealthyTs: this.metrics.redis.lastHealthyTs,\n lastUnhealthyTs: this.metrics.redis.lastUnhealthyTs,\n lastStatus: lastRedisStatus,\n roleStates: redisRoleStates,\n },\n };\n }\n\n reset(): void {\n this.metrics = this.createMetrics();\n this.pluginsMetrics.reset();\n this.lastPluginSnapshot = null;\n }\n\n beginPluginMount(): PluginsMetricsCollector {\n this.pluginsMetrics.reset();\n return this.pluginsMetrics;\n }\n\n completePluginMount(logger: { info: (...args: unknown[]) => void; warn: (...args: unknown[]) => void }): PluginsMetricsSnapshot | null {\n const snapshot = this.pluginsMetrics.getSnapshot();\n this.lastPluginSnapshot = snapshot;\n if (snapshot.total === 0) {\n return snapshot;\n }\n\n logger.info('Plugin mount metrics', snapshot);\n if (snapshot.failed > 0) {\n logger.warn('Plugin mount failures', this.pluginsMetrics.getDetails());\n }\n\n this.pluginsMetrics.reset();\n return snapshot;\n }\n\n getLastPluginMountSnapshot(): PluginsMetricsSnapshot | null {\n return this.lastPluginSnapshot;\n }\n\n registerRouteBudget(\n method: string,\n routePath: string,\n budgetMs: number | null | undefined,\n pluginId?: string\n ): void {\n const normalized = normalizeRoute(routePath);\n if (!normalized) {\n return;\n }\n const bucket = `${method.toUpperCase()} ${normalized}`;\n this.pluginRouteBudgets.set(bucket, { budgetMs: budgetMs ?? null, pluginId });\n }\n\n resetPluginRouteBudgets(): void {\n this.pluginRouteBudgets.clear();\n }\n\n getRouteBudget(method: string, routePath: string): number | null {\n const normalized = normalizeRoute(routePath);\n if (!normalized) {\n return null;\n }\n const bucket = `${method.toUpperCase()} ${normalized}`;\n const entry = this.pluginRouteBudgets.get(bucket);\n return entry ? entry.budgetMs ?? null : null;\n }\n}\n\nexport const metricsCollector = new MetricsCollector();\nexport const restDomainOperationMetrics = new OperationMetricsTracker();\n\n/**\n * Sampling strategy for high-frequency endpoints to prevent analytics overload.\n *\n * - /metrics: 1:100 (Prometheus scraping happens every few seconds)\n * - /health, /ready, /observability/health, /observability/describe: 1:10\n * - All other endpoints: 1:1 (track everything)\n *\n * Uses deterministic sampling based on request counter to ensure even distribution.\n */\nlet requestCounter = 0;\nfunction shouldSampleRequest(route: string): boolean {\n requestCounter = (requestCounter + 1) % 100;\n\n // High-frequency metrics endpoints (Prometheus scraping) - sample 1:100\n if (route === '/metrics' || route === '/api/v1/metrics') {\n return requestCounter === 0; // Only track every 100th request\n }\n\n // Medium-frequency health and observability probes - sample 1:10\n if (\n route === '/api/v1/health' ||\n route === '/api/v1/ready' ||\n route === '/api/v1/observability/health' ||\n route === '/api/v1/observability/describe'\n ) {\n return requestCounter % 10 === 0; // Only track every 10th request\n }\n\n // All other endpoints - track every request (1:1)\n return true;\n}\n\n// ADDS: request.kbMetricsStart | READS: kbLogger, kbPluginId, tenantId (onResponse)\nexport function registerMetricsMiddleware(server: FastifyInstance): void {\n server.addHook('onRequest', (request, _reply, done) => {\n request.kbMetricsStart = performance.now();\n serviceActiveOperations.set(metricsCollector.incrementActiveRequests());\n done();\n });\n\n server.addHook('onResponse', (request, reply, done) => {\n const start = request.kbMetricsStart ?? performance.now();\n const duration = Math.max(performance.now() - start, 0);\n const method = (request.method || request.raw.method || 'GET').toUpperCase();\n const routePath = request.routeOptions?.url ?? request.url;\n\n // Extract tenantId from header or env var\n const tenantId = (request.headers['x-tenant-id'] as string | undefined) ?? process.env.KB_TENANT_ID ?? 'default';\n\n // Log request completion with method + full URL + status code + duration\n if (request.kbLogger) {\n const fullUrl = request.url;\n const durationMs = Math.round(duration);\n request.kbLogger.info(`✓ ${method} ${fullUrl} ${reply.statusCode} ${durationMs}ms`, {\n statusCode: reply.statusCode,\n durationMs,\n });\n }\n\n // Record to legacy collector\n metricsCollector.recordRequest(method, routePath ?? request.url, reply.statusCode, duration, tenantId);\n if (reply.statusCode >= 400) {\n metricsCollector.recordError(String(reply.statusCode));\n }\n\n // Record to prom-client metrics\n const normalizedRoute = normalizeRoute(routePath ?? request.url) ?? 'unknown';\n const statusCode = String(reply.statusCode);\n const operation = `http.${method} ${normalizedRoute}`;\n\n // Record request duration histogram (automatically calculates p50/p95/p99)\n httpRequestDuration.observe(\n {\n method,\n route: normalizedRoute,\n status_code: statusCode,\n tenant: tenantId,\n plugin: '', // Will be populated from route metadata if available\n },\n duration\n );\n\n // Record request counter\n httpRequestsTotal.inc({\n method,\n route: normalizedRoute,\n status_code: statusCode,\n tenant: tenantId,\n plugin: '',\n });\n\n // Record errors\n if (reply.statusCode >= 400) {\n httpErrorsTotal.inc({\n status_code: statusCode,\n error_code: String(reply.errorCode ?? reply.statusCode),\n tenant: tenantId,\n });\n tenantErrorsTotal.inc({ tenant: tenantId });\n }\n\n serviceOperationTotal.inc({\n operation,\n status: reply.statusCode >= 400 ? 'error' : 'ok',\n });\n serviceOperationDuration.observe(\n {\n operation,\n status: reply.statusCode >= 400 ? 'error' : 'ok',\n },\n duration,\n );\n\n // Record tenant metrics\n tenantRequestsTotal.inc({ tenant: tenantId });\n tenantRequestDuration.observe({ tenant: tenantId }, duration);\n\n // Track to analytics for long-term storage (async, fire-and-forget)\n // This enables quarterly/annual reports and endpoint usage analysis\n // Skip OPTIONS (CORS preflight) - they don't carry useful information\n if (method !== 'OPTIONS') {\n const { analytics } = platform;\n if (analytics) {\n // Sample high-frequency probe endpoints (1:100 for metrics, 1:10 for health/ready/observability)\n // This prevents overwhelming analytics with 142k+ ping-pong events\n const shouldSample = shouldSampleRequest(normalizedRoute);\n\n if (shouldSample) {\n analytics.track('api.request', {\n endpoint: normalizedRoute,\n method,\n statusCode: reply.statusCode,\n durationMs: Math.round(duration),\n tenantId,\n pluginId: request.kbPluginId ?? undefined,\n clientVersion: request.headers['x-client-version'] as string | undefined,\n userAgent: request.headers['user-agent'] as string | undefined,\n requestId: request.id as string | undefined,\n }).catch(() => {\n // Silently ignore analytics errors - should not affect request handling\n });\n }\n }\n }\n\n serviceActiveOperations.set(metricsCollector.decrementActiveRequests());\n done();\n });\n}\n\nfunction normalizeRoute(route: string): string | null {\n if (!route) {\n return null;\n }\n const routePath = route.split('?')[0];\n if (!routePath) {\n return null;\n }\n return routePath.replace(/\\/[0-9a-fA-F-]{6,}/g, '/:id');\n}\n\nfunction updateLatencyHistogram(\n histogram: Map<string, RouteLatencyStats>,\n bucket: string,\n durationMs: number,\n statusCode: number\n): void {\n let stats = histogram.get(bucket);\n if (!stats) {\n stats = { count: 0, total: 0, max: 0, byStatus: {} };\n histogram.set(bucket, stats);\n }\n stats.count += 1;\n stats.total += durationMs;\n stats.max = Math.max(stats.max, durationMs);\n const statusKey = `${statusCode}`;\n stats.byStatus[statusKey] = (stats.byStatus[statusKey] || 0) + 1;\n}\n","/**\n * @module @kb-labs/rest-api-app/utils/sse-auth\n * Helpers for SSE token validation\n */\n\nimport type { FastifyReply, FastifyRequest, HookHandlerDoneFunction } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\n\ntype RegistryAuthConfig = {\n token: string;\n headerName: string;\n queryParam: string;\n};\n\nfunction extractTokenFromHeader(headerValue: unknown, headerName: string): string | undefined {\n if (typeof headerValue === 'string') {\n if (headerName === 'authorization') {\n const match = headerValue.match(/^Bearer\\s+(.+)$/i);\n return match ? match[1] : undefined;\n }\n return headerValue;\n }\n if (Array.isArray(headerValue)) {\n return headerValue[0];\n }\n return undefined;\n}\n\nfunction extractToken(request: FastifyRequest, config: RegistryAuthConfig): string | undefined {\n const headerName = (config.headerName ?? 'authorization').toLowerCase();\n const queryParam = config.queryParam ?? 'access_token';\n\n const explicitHeader = extractTokenFromHeader(request.headers[headerName], headerName);\n if (explicitHeader) {\n return explicitHeader;\n }\n\n if (headerName !== 'authorization' && typeof request.headers.authorization === 'string') {\n const fallback = extractTokenFromHeader(request.headers.authorization, 'authorization');\n if (fallback) {\n return fallback;\n }\n }\n\n const query = request.query as Record<string, string | undefined>;\n return query?.[queryParam] ?? query?.access_token;\n}\n\nexport function buildRegistrySseAuthHook(config: RestApiConfig) {\n const registryAuth = config.events?.registry;\n if (!registryAuth?.token) {\n return undefined;\n }\n const authConfig: RegistryAuthConfig = {\n token: registryAuth.token,\n headerName: registryAuth.headerName ?? 'authorization',\n queryParam: registryAuth.queryParam ?? 'access_token',\n };\n\n return function registrySseAuthHook(\n request: FastifyRequest,\n reply: FastifyReply,\n done: HookHandlerDoneFunction\n ) {\n const provided = extractToken(request, authConfig);\n if (provided === authConfig.token) {\n done();\n return;\n }\n\n reply\n .code(401)\n .header('content-type', 'application/json')\n .send({\n status: 'unauthorized',\n reason: 'invalid_token',\n });\n };\n}\n\n\n","import type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry, SystemHealthSnapshot } from '@kb-labs/core-registry';\nimport type { ReadinessState } from './readiness';\nimport { isReady, resolveReadinessReason } from './readiness';\nimport type { EventHub, BroadcastEvent } from '../events/hub';\nimport { metricsCollector } from '../middleware/metrics.js';\nimport { buildRegistrySseAuthHook } from './sse-auth';\n\nexport async function registerEventRoutes(\n server: FastifyInstance,\n basePath: string,\n registry: IEntityRegistry,\n readiness: ReadinessState,\n eventHub: EventHub,\n config: RestApiConfig\n): Promise<void> {\n const endpoint = `${basePath}/events/registry`;\n const authHook = buildRegistrySseAuthHook(config);\n\n server.route({\n method: 'GET',\n url: endpoint,\n onRequest: authHook ? [authHook] : undefined,\n handler: async (request, reply) => {\n // Tell Fastify we're manually managing the response\n reply.hijack();\n\n // Explicit CORS headers for EventSource (browser requires these before opening connection)\n const origin = request.headers.origin;\n if (origin === 'http://localhost:3000' || origin === 'http://localhost:5173') {\n reply.raw.setHeader('Access-Control-Allow-Origin', origin);\n reply.raw.setHeader('Access-Control-Allow-Credentials', 'true');\n }\n\n reply.raw.setHeader('Content-Type', 'text/event-stream');\n reply.raw.setHeader('Cache-Control', 'no-cache, no-transform');\n reply.raw.setHeader('Connection', 'keep-alive');\n reply.raw.flushHeaders?.();\n reply.raw.write(': connected\\n\\n');\n\n const send = (event: BroadcastEvent) => {\n reply.raw.write(`event: ${event.type}\\n`);\n reply.raw.write(`data: ${JSON.stringify(event)}\\n\\n`);\n };\n\n const unsubscribe = eventHub.subscribe(send);\n\n const snapshot = registry.snapshot();\n const checksumAlgorithm = snapshot.checksumAlgorithm === 'sha256' ? 'sha256' : undefined;\n send({\n type: 'registry',\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n partial: snapshot.partial,\n stale: snapshot.stale,\n expiresAt: snapshot.expiresAt ?? null,\n ttlMs: snapshot.ttlMs ?? null,\n checksum: snapshot.checksum ?? undefined,\n checksumAlgorithm,\n previousChecksum: snapshot.previousChecksum ?? null,\n });\n\n const healthPromise = registry\n .getSystemHealth()\n .then((health: SystemHealthSnapshot) => {\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n const pluginSnapshot = metricsCollector.getLastPluginMountSnapshot();\n const redisStatus = ('getRedisStatus' in registry && typeof (registry as { getRedisStatus?: () => { enabled: boolean; healthy: boolean; roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null } } }).getRedisStatus === 'function')\n ? (registry as { getRedisStatus: () => { enabled: boolean; healthy: boolean; roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null } } }).getRedisStatus()\n : undefined;\n send({\n type: 'health',\n status: health.status,\n ts: health.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n pluginsMounted: pluginSnapshot?.succeeded ?? 0,\n pluginsFailed: pluginSnapshot?.failed ?? 0,\n lastPluginMountTs: readiness.lastPluginMountTs ?? null,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n redisEnabled: redisStatus?.enabled ?? false,\n redisHealthy: redisStatus?.healthy ?? true,\n redisStates: redisStatus ? {\n publisher: redisStatus.roles.publisher ?? null,\n subscriber: redisStatus.roles.subscriber ?? null,\n cache: redisStatus.roles.cache ?? null,\n } : undefined,\n });\n })\n .catch((error: unknown) => {\n if (request.kbLogger) {\n request.kbLogger.warn('Failed to fetch system health for SSE client', { err: error });\n }\n });\n\n await new Promise<void>((resolve) => {\n request.raw.on('close', () => {\n unsubscribe();\n reply.raw.end();\n resolve();\n });\n // In inject/test mode, the socket is not a real TCP socket and 'close' may not fire.\n // Wait for health fetch to complete before resolving so health event is included in response.\n if (request.raw.socket && !(request.raw.socket as { writable?: boolean }).writable) {\n void healthPromise.then(() => {\n unsubscribe();\n reply.raw.end();\n resolve();\n });\n }\n });\n },\n });\n}\n","export function normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n return basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n}\n\nexport function resolvePaths(basePath: string, route: string): string[] {\n const normalizedRoute = route.startsWith('/') ? route : `/${route}`;\n if (!basePath) {\n return [normalizedRoute];\n }\n const base = normalizeBasePath(basePath);\n return Array.from(new Set([normalizedRoute, `${base}${normalizedRoute}`]));\n}\n","/**\n * @module @kb-labs/rest-api-app/services/system-metrics-collector\n * System metrics collector for REST API instances.\n *\n * Collects CPU, memory, uptime, and load average metrics from the current instance\n * and writes them to platform.cache with TTL for automatic cleanup.\n */\n\nimport { platform } from '@kb-labs/core-runtime';\nimport * as os from 'node:os';\nimport * as process from 'node:process';\nimport { monitorEventLoopDelay } from 'node:perf_hooks';\nimport { updateRuntimeObservabilityMetrics } from '../../observability/prometheus-registry.js';\n\nlet latestSystemMetricsSnapshot: SystemMetrics | null = null;\n\n/**\n * System metrics data structure\n */\nexport interface SystemMetrics {\n /** Instance identifier (hostname) */\n instanceId: string;\n\n /** Timestamp when metrics were collected (ms since epoch) */\n timestamp: number;\n\n /** CPU usage information */\n cpu: {\n /** User CPU time in microseconds */\n user: number;\n /** System CPU time in microseconds */\n system: number;\n /** CPU usage percentage (0-100) */\n percentage: number;\n };\n\n /** Memory usage information */\n memory: {\n /** Resident Set Size (bytes) - total memory allocated */\n rss: number;\n /** Heap total (bytes) - allocated heap */\n heapTotal: number;\n /** Heap used (bytes) - actual heap used */\n heapUsed: number;\n /** External memory (bytes) - C++ objects bound to JS */\n external: number;\n /** Array buffers (bytes) */\n arrayBuffers: number;\n /** RSS usage percentage (0-100) */\n rssPercentage: number;\n /** Heap usage percentage (0-100) */\n heapPercentage: number;\n };\n\n /** Process uptime (seconds) */\n uptime: number;\n eventLoopLagMs: number;\n activeOperations: number;\n\n /** System load average (1, 5, 15 minutes) */\n loadAvg: [number, number, number];\n\n /** Total system memory (bytes) */\n totalMemory: number;\n\n /** Free system memory (bytes) */\n freeMemory: number;\n}\n\nfunction toFiniteNumber(value: number): number {\n return Number.isFinite(value) ? value : 0;\n}\n\n/**\n * System metrics collector\n * Periodically collects system metrics and writes to platform.cache\n */\nexport class SystemMetricsCollector {\n private intervalId: NodeJS.Timeout | null = null;\n private instanceId: string;\n private lastCpuUsage = process.cpuUsage();\n private lastCpuTime = Date.now();\n private eventLoopDelay = monitorEventLoopDelay({ resolution: 20 });\n private latestMetrics: SystemMetrics | null = null;\n\n constructor(\n private readonly serviceId: string = 'rest',\n private readonly getActiveOperations: () => number = () => 0,\n ) {\n this.instanceId = `${os.hostname()}:${process.pid}`;\n }\n\n /**\n * Calculate CPU percentage based on delta\n */\n private calculateCpuPercentage(): number {\n const currentUsage = process.cpuUsage(this.lastCpuUsage);\n const currentTime = Date.now();\n const deltaTime = currentTime - this.lastCpuTime;\n\n // Update for next calculation\n this.lastCpuUsage = process.cpuUsage();\n this.lastCpuTime = currentTime;\n\n // Calculate CPU percentage\n // cpuUsage() returns microseconds, convert to milliseconds and calculate percentage\n const cpuTimeMs = (currentUsage.user + currentUsage.system) / 1000;\n const percentage = (cpuTimeMs / deltaTime) * 100;\n\n // Cap at 100% (can exceed on multi-core systems)\n return Math.min(percentage, 100);\n }\n\n /**\n * Collect current system metrics\n */\n private collectMetrics(): SystemMetrics {\n const memoryUsage = process.memoryUsage();\n const totalMemory = os.totalmem();\n const heapPercentageRaw =\n memoryUsage.heapTotal > 0 ? (memoryUsage.heapUsed / memoryUsage.heapTotal) * 100 : 0;\n const eventLoopLagMs = toFiniteNumber(Number((this.eventLoopDelay.mean / 1_000_000).toFixed(2)));\n const cpuPercentage = toFiniteNumber(this.calculateCpuPercentage());\n\n return {\n instanceId: this.instanceId,\n timestamp: Date.now(),\n cpu: {\n user: this.lastCpuUsage.user,\n system: this.lastCpuUsage.system,\n percentage: cpuPercentage,\n },\n memory: {\n rss: memoryUsage.rss,\n heapTotal: memoryUsage.heapTotal,\n heapUsed: memoryUsage.heapUsed,\n external: memoryUsage.external,\n arrayBuffers: memoryUsage.arrayBuffers,\n rssPercentage: toFiniteNumber((memoryUsage.rss / totalMemory) * 100),\n heapPercentage: toFiniteNumber(heapPercentageRaw),\n },\n uptime: process.uptime(),\n eventLoopLagMs,\n activeOperations: this.getActiveOperations(),\n loadAvg: os.loadavg() as [number, number, number],\n totalMemory,\n freeMemory: os.freemem(),\n };\n }\n\n /**\n * Start collecting metrics at regular intervals\n * @param intervalMs - Collection interval in milliseconds (default: 10000ms = 10s)\n * @param ttlMs - Time-to-live for cache entries (default: 60000ms = 60s)\n */\n async start(intervalMs: number = 10000, ttlMs: number = 60000): Promise<void> {\n if (this.intervalId) {\n platform.logger.warn('SystemMetricsCollector already started');\n return;\n }\n\n platform.logger.info('Starting system metrics collector', {\n serviceId: this.serviceId,\n instanceId: this.instanceId,\n intervalMs,\n ttlMs,\n });\n\n this.eventLoopDelay.enable();\n\n // Collect immediately on start\n await this.collect(ttlMs);\n\n // Then collect at intervals\n this.intervalId = setInterval(async () => {\n await this.collect(ttlMs);\n }, intervalMs);\n }\n\n /**\n * Collect metrics and write to cache\n */\n private async collect(ttlMs: number): Promise<void> {\n try {\n const metrics = this.collectMetrics();\n this.latestMetrics = metrics;\n latestSystemMetricsSnapshot = metrics;\n\n // Write to platform.cache with TTL\n // Key pattern: system-metrics:{instanceId}\n await platform.cache.set(\n `system-metrics:${this.instanceId}`,\n metrics,\n ttlMs\n );\n\n updateRuntimeObservabilityMetrics({\n cpuPercent: metrics.cpu.percentage,\n rssBytes: metrics.memory.rss,\n heapUsedBytes: metrics.memory.heapUsed,\n eventLoopLagMs: metrics.eventLoopLagMs,\n activeOperations: metrics.activeOperations,\n });\n\n platform.logger.debug('System metrics collected', {\n serviceId: this.serviceId,\n instanceId: this.instanceId,\n cpu: metrics.cpu.percentage.toFixed(1) + '%',\n memory: metrics.memory.rssPercentage.toFixed(1) + '%',\n eventLoopLagMs: metrics.eventLoopLagMs,\n activeOperations: metrics.activeOperations,\n uptime: Math.floor(metrics.uptime) + 's',\n });\n\n this.eventLoopDelay.reset();\n } catch (error) {\n platform.logger.error('Failed to collect system metrics', error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n getInstanceId(): string {\n return this.instanceId;\n }\n\n getLatestMetrics(): SystemMetrics | null {\n return this.latestMetrics;\n }\n\n /**\n * Stop collecting metrics\n */\n stop(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n platform.logger.info('System metrics collector stopped');\n }\n this.eventLoopDelay.disable();\n }\n}\n\nexport function getLatestSystemMetrics(): SystemMetrics | null {\n return latestSystemMetricsSnapshot;\n}\n","/**\n * @module @kb-labs/rest-api-app/services/historical-metrics\n * Historical metrics collection and storage service\n */\n\nimport type { CacheAdapter } from '@kb-labs/plugin-contracts';\nimport { metricsCollector } from '../../middleware/metrics.js';\n\n/**\n * Historical data point\n */\nexport interface HistoricalDataPoint {\n timestamp: number;\n value: number;\n}\n\n/**\n * Heatmap cell data\n */\nexport interface HeatmapCell {\n day: string; // 'Mon', 'Tue', etc.\n hour: number; // 0-23\n value: number;\n}\n\n/**\n * Metrics snapshot for historical storage\n */\ninterface MetricsSnapshot {\n timestamp: number;\n requests: {\n total: number;\n success: number;\n clientErrors: number;\n serverErrors: number;\n };\n latency: {\n average: number;\n min: number;\n max: number;\n p50?: number;\n p95?: number;\n p99?: number;\n };\n uptime: number; // seconds\n perPlugin: Array<{\n pluginId?: string;\n requests: number;\n errors: number;\n avgLatency: number;\n }>;\n}\n\n/**\n * Historical metrics collector configuration\n */\nexport interface HistoricalMetricsConfig {\n /** Collection interval in milliseconds (default: 5000 = 5s) */\n intervalMs?: number;\n /** Maximum points to store per time range */\n maxPoints?: {\n /** Last 1 minute (default: 12 points at 5s intervals) */\n '1m'?: number;\n /** Last 5 minutes (default: 60 points) */\n '5m'?: number;\n /** Last 10 minutes (default: 120 points) */\n '10m'?: number;\n /** Last 30 minutes (default: 360 points) */\n '30m'?: number;\n /** Last 1 hour (default: 720 points) */\n '1h'?: number;\n };\n /** Enable debug logging */\n debug?: boolean;\n}\n\nconst DEFAULT_CONFIG: Required<HistoricalMetricsConfig> = {\n intervalMs: 5000,\n maxPoints: {\n '1m': 12,\n '5m': 60,\n '10m': 120,\n '30m': 360,\n '1h': 720,\n },\n debug: false,\n};\n\n/**\n * Historical metrics collector service\n *\n * Collects and stores historical metrics data in platform.cache with TTL-based retention.\n * Provides time-series data for dashboards and analytics.\n */\nexport class HistoricalMetricsCollector {\n private cache: CacheAdapter;\n private config: Required<HistoricalMetricsConfig>;\n private intervalHandle: NodeJS.Timeout | null = null;\n private logger: Console | any;\n private startTimeMs: number = Date.now();\n\n constructor(cache: CacheAdapter, config: HistoricalMetricsConfig = {}, logger: Console | any = console) {\n this.cache = cache;\n this.config = { ...DEFAULT_CONFIG, ...config, maxPoints: { ...DEFAULT_CONFIG.maxPoints, ...config.maxPoints } };\n this.logger = logger;\n }\n\n /**\n * Start background collection\n */\n start(): void {\n if (this.intervalHandle) {\n this.log('warn', 'Historical metrics collector already started');\n return;\n }\n\n this.log('info', 'Starting historical metrics collector', {\n intervalMs: this.config.intervalMs,\n });\n\n // Collect immediately, then every intervalMs\n this.collect().catch(err => {\n this.log('error', 'Failed to collect initial metrics', { err });\n });\n\n this.intervalHandle = setInterval(() => {\n this.collect().catch(err => {\n this.log('error', 'Failed to collect metrics', { err });\n });\n }, this.config.intervalMs);\n }\n\n /**\n * Stop background collection\n */\n stop(): void {\n if (this.intervalHandle) {\n clearInterval(this.intervalHandle);\n this.intervalHandle = null;\n this.log('info', 'Historical metrics collector stopped');\n }\n }\n\n /**\n * Collect current metrics snapshot and store in cache\n */\n private async collect(): Promise<void> {\n const now = Date.now();\n const metrics = metricsCollector.getMetrics();\n\n // Build snapshot\n const snapshot: MetricsSnapshot = {\n timestamp: now,\n requests: {\n total: metrics.requests.total,\n success: metrics.requests.success ?? 0,\n clientErrors: metrics.requests.clientErrors ?? 0,\n serverErrors: metrics.requests.serverErrors ?? 0,\n },\n latency: {\n average: metrics.latency.average,\n min: metrics.latency.min === Infinity ? 0 : metrics.latency.min,\n max: metrics.latency.max,\n },\n uptime: (now - metrics.timestamps.startTime) / 1000,\n perPlugin: metrics.perPlugin.map(p => ({\n pluginId: p.pluginId,\n requests: p.total,\n errors: Object.values(p.statuses)\n .filter((_, idx) => Object.keys(p.statuses)[idx]?.startsWith('4') || Object.keys(p.statuses)[idx]?.startsWith('5'))\n .reduce((sum, count) => sum + count, 0),\n avgLatency: p.total > 0 ? p.totalDuration / p.total : 0,\n })),\n };\n\n // Store in each time range bucket\n await Promise.all([\n this.appendToTimeSeries('1m', snapshot, 2 * 60 * 1000), // TTL: 2 minutes\n this.appendToTimeSeries('5m', snapshot, 10 * 60 * 1000), // TTL: 10 minutes\n this.appendToTimeSeries('10m', snapshot, 20 * 60 * 1000), // TTL: 20 minutes\n this.appendToTimeSeries('30m', snapshot, 60 * 60 * 1000), // TTL: 1 hour\n this.appendToTimeSeries('1h', snapshot, 2 * 60 * 60 * 1000), // TTL: 2 hours\n ]);\n\n // Update heatmap aggregation (less frequently - every minute)\n if (now % 60000 < this.config.intervalMs) {\n await this.updateHeatmapAggregation(snapshot).catch(err => {\n this.log('error', 'Failed to update heatmap', { err });\n });\n }\n\n this.log('debug', 'Metrics snapshot collected', {\n timestamp: new Date(now).toISOString(),\n requests: snapshot.requests.total,\n latency: snapshot.latency.average.toFixed(2),\n });\n }\n\n /**\n * Append snapshot to time series bucket\n */\n private async appendToTimeSeries(range: keyof typeof DEFAULT_CONFIG.maxPoints, snapshot: MetricsSnapshot, ttlMs: number): Promise<void> {\n const key = `metrics:history:${range}`;\n const maxPoints = this.config.maxPoints[range] ?? 120;\n\n // Get existing time series\n let timeSeries = await this.cache.get<MetricsSnapshot[]>(key);\n if (!timeSeries || !Array.isArray(timeSeries)) {\n timeSeries = [];\n }\n\n // Append new snapshot\n timeSeries.push(snapshot);\n\n // Trim to max points (FIFO)\n if (timeSeries.length > maxPoints) {\n timeSeries = timeSeries.slice(timeSeries.length - maxPoints);\n }\n\n // Store back with TTL\n await this.cache.set(key, timeSeries, ttlMs);\n }\n\n /**\n * Update heatmap aggregation for weekly patterns\n */\n private async updateHeatmapAggregation(snapshot: MetricsSnapshot): Promise<void> {\n const key = 'metrics:heatmap:7d';\n const ttlMs = 24 * 60 * 60 * 1000; // 24 hours\n\n // Get existing heatmap data\n let heatmapData = await this.cache.get<Record<string, HeatmapCell[]>>(key);\n if (!heatmapData || typeof heatmapData !== 'object') {\n heatmapData = { latency: [], errors: [], requests: [] };\n }\n\n // Calculate current day and hour\n const date = new Date(snapshot.timestamp);\n const day = (['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const)[date.getDay() as 0|1|2|3|4|5|6];\n const hour = date.getHours();\n\n // Update each metric type\n for (const metricType of ['latency', 'errors', 'requests'] as const) {\n let cells = heatmapData[metricType] || [];\n\n // Find or create cell for this day/hour\n const cellIndex = cells.findIndex(c => c.day === day && c.hour === hour);\n\n let value = 0;\n if (metricType === 'latency') {\n value = snapshot.latency.average;\n } else if (metricType === 'errors') {\n value = snapshot.requests.clientErrors + snapshot.requests.serverErrors;\n } else {\n value = snapshot.requests.total;\n }\n\n if (cellIndex >= 0 && cells[cellIndex]) {\n // Update existing cell (exponential moving average)\n cells[cellIndex]!.value = cells[cellIndex]!.value * 0.9 + value * 0.1;\n } else {\n // Add new cell\n cells.push({ day, hour, value });\n }\n\n // Keep only last 7 days worth of unique day/hour combinations (7 * 24 = 168 cells max)\n if (cells.length > 168) {\n cells = cells.slice(cells.length - 168);\n }\n\n heatmapData[metricType] = cells;\n }\n\n // Store back with TTL\n await this.cache.set(key, heatmapData, ttlMs);\n }\n\n /**\n * Query historical time-series data\n */\n async queryHistory(params: {\n metric: 'requests' | 'errors' | 'latency' | 'uptime';\n range: '1m' | '5m' | '10m' | '30m' | '1h';\n interval?: '5s' | '1m' | '5m';\n }): Promise<HistoricalDataPoint[]> {\n const key = `metrics:history:${params.range}`;\n\n // Get time series from cache\n const timeSeries = await this.cache.get<MetricsSnapshot[]>(key);\n if (!timeSeries || !Array.isArray(timeSeries)) {\n return [];\n }\n\n // Extract requested metric\n const dataPoints: HistoricalDataPoint[] = timeSeries.map(snapshot => {\n let value = 0;\n\n switch (params.metric) {\n case 'requests':\n value = snapshot.requests.total;\n break;\n case 'errors':\n value = snapshot.requests.clientErrors + snapshot.requests.serverErrors;\n break;\n case 'latency':\n value = snapshot.latency.average;\n break;\n case 'uptime':\n value = snapshot.uptime;\n break;\n }\n\n return {\n timestamp: snapshot.timestamp,\n value,\n };\n });\n\n // Apply interval aggregation if requested\n if (params.interval && params.interval !== '5s') {\n return this.aggregateByInterval(dataPoints, params.interval);\n }\n\n return dataPoints;\n }\n\n /**\n * Query heatmap data\n */\n async queryHeatmap(params: {\n metric: 'latency' | 'errors' | 'requests';\n days?: 7 | 14 | 30;\n }): Promise<HeatmapCell[]> {\n const key = 'metrics:heatmap:7d';\n\n // Get heatmap data from cache\n const heatmapData = await this.cache.get<Record<string, HeatmapCell[]>>(key);\n if (!heatmapData || typeof heatmapData !== 'object') {\n // Return empty heatmap structure\n return this.generateEmptyHeatmap();\n }\n\n const cells = heatmapData[params.metric] || [];\n\n // If no data yet, return empty heatmap\n if (cells.length === 0) {\n return this.generateEmptyHeatmap();\n }\n\n // Ensure all day/hour combinations exist (fill missing with 0)\n return this.fillHeatmapGaps(cells);\n }\n\n /**\n * Generate empty heatmap structure (7 days × 24 hours)\n */\n private generateEmptyHeatmap(): HeatmapCell[] {\n const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n const cells: HeatmapCell[] = [];\n\n for (const day of days) {\n for (let hour = 0; hour < 24; hour++) {\n cells.push({ day, hour, value: 0 });\n }\n }\n\n return cells;\n }\n\n /**\n * Fill gaps in heatmap data (missing day/hour combinations)\n */\n private fillHeatmapGaps(cells: HeatmapCell[]): HeatmapCell[] {\n const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];\n const cellMap = new Map<string, number>();\n\n // Index existing cells\n for (const cell of cells) {\n const key = `${cell.day}:${cell.hour}`;\n cellMap.set(key, cell.value);\n }\n\n // Generate complete 7×24 grid\n const complete: HeatmapCell[] = [];\n for (const day of days) {\n for (let hour = 0; hour < 24; hour++) {\n const key = `${day}:${hour}`;\n complete.push({\n day,\n hour,\n value: cellMap.get(key) ?? 0,\n });\n }\n }\n\n return complete;\n }\n\n /**\n * Aggregate data points by interval\n */\n private aggregateByInterval(dataPoints: HistoricalDataPoint[], interval: '1m' | '5m'): HistoricalDataPoint[] {\n if (dataPoints.length === 0) {return [];}\n\n const intervalMs = interval === '1m' ? 60 * 1000 : 5 * 60 * 1000;\n const aggregated: HistoricalDataPoint[] = [];\n\n let bucket: HistoricalDataPoint[] = [];\n let bucketStart = Math.floor(dataPoints[0]!.timestamp / intervalMs) * intervalMs;\n\n for (const point of dataPoints) {\n const pointBucket = Math.floor(point.timestamp / intervalMs) * intervalMs;\n\n if (pointBucket === bucketStart) {\n bucket.push(point);\n } else {\n // Finalize current bucket\n if (bucket.length > 0) {\n const avgValue = bucket.reduce((sum, p) => sum + p.value, 0) / bucket.length;\n aggregated.push({\n timestamp: bucketStart + intervalMs / 2, // midpoint\n value: avgValue,\n });\n }\n\n // Start new bucket\n bucket = [point];\n bucketStart = pointBucket;\n }\n }\n\n // Finalize last bucket\n if (bucket.length > 0) {\n const avgValue = bucket.reduce((sum, p) => sum + p.value, 0) / bucket.length;\n aggregated.push({\n timestamp: bucketStart + intervalMs / 2,\n value: avgValue,\n });\n }\n\n return aggregated;\n }\n\n /**\n * Get collector statistics\n */\n async getStats(): Promise<{\n running: boolean;\n uptimeSeconds: number;\n timeSeries: Record<string, { points: number; oldestTimestamp: number | null; newestTimestamp: number | null }>;\n heatmap: { cells: number; metrics: string[] };\n }> {\n const stats: {\n running: boolean;\n uptimeSeconds: number;\n timeSeries: Record<string, { points: number; oldestTimestamp: number | null; newestTimestamp: number | null }>;\n heatmap: { cells: number; metrics: string[] };\n } = {\n running: this.intervalHandle !== null,\n uptimeSeconds: (Date.now() - this.startTimeMs) / 1000,\n timeSeries: {},\n heatmap: { cells: 0, metrics: [] },\n };\n\n // Check each time range\n for (const range of ['1m', '5m', '10m', '30m', '1h'] as const) {\n const key = `metrics:history:${range}`;\n const timeSeries = await this.cache.get<MetricsSnapshot[]>(key);\n\n if (timeSeries && Array.isArray(timeSeries)) {\n stats.timeSeries[range] = {\n points: timeSeries.length,\n oldestTimestamp: timeSeries[0]?.timestamp ?? null,\n newestTimestamp: timeSeries[timeSeries.length - 1]?.timestamp ?? null,\n };\n } else {\n stats.timeSeries[range] = { points: 0, oldestTimestamp: null, newestTimestamp: null };\n }\n }\n\n // Check heatmap\n const heatmapData = await this.cache.get<Record<string, HeatmapCell[]>>('metrics:heatmap:7d');\n if (heatmapData && typeof heatmapData === 'object') {\n const metrics = Object.keys(heatmapData);\n const totalCells = metrics.reduce((sum, m) => sum + (heatmapData[m]?.length ?? 0), 0);\n stats.heatmap = { cells: totalCells, metrics };\n }\n\n return stats;\n }\n\n private log(level: 'info' | 'warn' | 'error' | 'debug', message: string, meta?: Record<string, unknown>): void {\n if (level === 'debug' && !this.config.debug) {return;}\n\n this.logger[level](`[HistoricalMetrics] ${message}`, meta);\n }\n}\n","import { hostname } from 'node:os';\nimport {\n OBSERVABILITY_CONTRACT_VERSION,\n OBSERVABILITY_SCHEMA,\n CANONICAL_OBSERVABILITY_METRICS,\n type ObservabilityCheck,\n} from '@kb-labs/core-contracts';\nimport type {\n ServiceObservabilityDescribe,\n ServiceObservabilityHealth,\n ServiceOperationSample,\n} from '@kb-labs/core-contracts';\nimport {\n createServiceObservabilityDescribe,\n createServiceObservabilityHealth,\n} from '@kb-labs/shared-http';\nimport type { SystemHealthSnapshot } from '@kb-labs/core-registry';\nimport type { ReadinessState } from '../routes/readiness.js';\nimport { restDomainOperationMetrics, type MetricsSnapshot } from '../middleware/metrics.js';\nimport { getLatestSystemMetrics } from '../daemon/metrics/index.js';\n\ndeclare const __REST_API_VERSION__: string;\nconst REST_VERSION = typeof __REST_API_VERSION__ !== 'undefined' ? __REST_API_VERSION__ : '0.0.0';\n\nfunction resolveInstanceId(): string {\n return `${hostname()}:${process.pid}`;\n}\n\nfunction mergeTopOperations(\n httpOperations: ServiceOperationSample[],\n domainOperations: ServiceOperationSample[],\n limit = 5,\n): ServiceOperationSample[] {\n const merged = new Map<string, ServiceOperationSample>();\n\n for (const item of [...httpOperations, ...domainOperations]) {\n const existing = merged.get(item.operation);\n if (!existing) {\n merged.set(item.operation, { ...item });\n continue;\n }\n\n const count = (existing.count ?? 0) + (item.count ?? 0);\n const totalDurationMs =\n (existing.avgDurationMs ?? 0) * (existing.count ?? 0) +\n (item.avgDurationMs ?? 0) * (item.count ?? 0);\n\n merged.set(item.operation, {\n operation: item.operation,\n count,\n avgDurationMs: count > 0 ? totalDurationMs / count : 0,\n maxDurationMs: Math.max(existing.maxDurationMs ?? 0, item.maxDurationMs ?? 0),\n errorCount: (existing.errorCount ?? 0) + (item.errorCount ?? 0),\n });\n }\n\n const ranked = Array.from(merged.values())\n .sort((a, b) => (b.count ?? 0) - (a.count ?? 0) || (b.maxDurationMs ?? 0) - (a.maxDurationMs ?? 0))\n const sliced = ranked.slice(0, limit);\n\n if (domainOperations.length === 0 || sliced.some((item) => !item.operation.startsWith('http.'))) {\n return sliced;\n }\n\n const firstDomainOperation = ranked.find((item) => !item.operation.startsWith('http.'));\n if (!firstDomainOperation) {\n return sliced;\n }\n\n return [...sliced.slice(0, Math.max(0, limit - 1)), firstDomainOperation];\n}\n\nfunction finiteNumberOrUndefined(value: number | null | undefined): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nexport function buildRestObservabilityDescribe(basePath: string): ServiceObservabilityDescribe {\n return createServiceObservabilityDescribe({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'rest',\n instanceId: resolveInstanceId(),\n serviceType: 'http-api',\n version: REST_VERSION,\n environment: process.env.NODE_ENV ?? 'development',\n startedAt: new Date(Date.now() - process.uptime() * 1000).toISOString(),\n dependencies: [\n {\n serviceId: 'workflow',\n required: true,\n description: 'Workflow daemon for workflow and jobs APIs',\n },\n {\n serviceId: 'state-daemon',\n required: false,\n description: 'State broker and cache-backed storage',\n },\n ],\n metricsEndpoint: '/metrics',\n healthEndpoint: `${basePath}/observability/health`,\n logsSource: 'rest',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n metricFamilies: [...CANONICAL_OBSERVABILITY_METRICS],\n });\n}\n\nexport function buildRestObservabilityHealth(\n basePath: string,\n healthSnapshot: SystemHealthSnapshot,\n readiness: ReadinessState,\n metrics: MetricsSnapshot,\n): ServiceObservabilityHealth {\n const runtimeMetrics = getLatestSystemMetrics();\n const checks: ObservabilityCheck[] = [\n {\n id: 'registry',\n status: readiness.registryLoaded && !readiness.registryPartial && !readiness.registryStale\n ? 'ok'\n : readiness.registryLoaded ? 'warn' : 'error',\n message: readiness.registryLoaded ? 'Registry snapshot loaded' : 'Registry snapshot incomplete',\n },\n {\n id: 'plugin-routes',\n status: readiness.pluginRouteErrors > 0 ? 'warn' : readiness.pluginRoutesMounted ? 'ok' : 'warn',\n message: readiness.pluginRoutesMounted\n ? `${readiness.pluginRoutesCount} plugin routes mounted`\n : 'Plugin routes are still mounting',\n },\n {\n id: 'redis',\n status: !readiness.redisEnabled ? 'ok' : readiness.redisConnected ? 'ok' : 'warn',\n message: !readiness.redisEnabled\n ? 'Redis integration disabled'\n : readiness.redisConnected\n ? 'Redis healthy'\n : 'Redis unavailable',\n },\n ];\n\n const httpTopOperations = metrics.latency.histogram\n .slice()\n .sort((a, b) => b.count - a.count || b.max - a.max)\n .slice(0, 5)\n .map((entry) => ({\n operation: `http.${entry.route}`,\n count: entry.count,\n avgDurationMs: entry.count > 0 ? entry.total / entry.count : 0,\n maxDurationMs: entry.max,\n errorCount: Object.entries(entry.byStatus)\n .filter(([status]) => Number(status) >= 400)\n .reduce((sum, [, count]) => sum + count, 0),\n }));\n const topOperations = mergeTopOperations(httpTopOperations, restDomainOperationMetrics.getTopOperations(5));\n\n const latestOperation = topOperations[0];\n const state = healthSnapshot.status === 'healthy'\n ? 'active'\n : runtimeMetrics || latestOperation\n ? 'partial_observability'\n : 'insufficient_data';\n\n return createServiceObservabilityHealth({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'rest',\n instanceId: resolveInstanceId(),\n observedAt: healthSnapshot.ts,\n status: healthSnapshot.status === 'healthy' ? 'healthy' : healthSnapshot.status === 'degraded' ? 'degraded' : 'unhealthy',\n uptimeSec: healthSnapshot.uptimeSec,\n metricsEndpoint: '/metrics',\n logsSource: 'rest',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n checks,\n snapshot: {\n cpuPercent: finiteNumberOrUndefined(runtimeMetrics?.cpu.percentage),\n rssBytes: finiteNumberOrUndefined(runtimeMetrics?.memory.rss),\n heapUsedBytes: finiteNumberOrUndefined(runtimeMetrics?.memory.heapUsed),\n eventLoopLagMs: finiteNumberOrUndefined(runtimeMetrics?.eventLoopLagMs),\n activeOperations: runtimeMetrics?.activeOperations ?? metrics.requests.active,\n },\n topOperations,\n state,\n meta: {\n serviceHealthEndpoint: `${basePath}/health`,\n readyEndpoint: `${basePath}/ready`,\n runtimeMetricsCollectedAt: runtimeMetrics ? new Date(runtimeMetrics.timestamp).toISOString() : null,\n lastRequestAt: metrics.timestamps.lastRequest\n ? new Date(metrics.timestamps.lastRequest).toISOString()\n : null,\n },\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/health\n * Health check and diagnostics endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry, SystemHealthSnapshot } from '@kb-labs/core-registry';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport type { ReadinessState } from './readiness';\nimport { isReady, resolveReadinessReason } from './readiness';\nimport type { PluginsMetricsSnapshot } from '../middleware/metrics.js';\nimport { metricsCollector } from '../middleware/metrics.js';\nimport { updateServiceHealthStatus } from '../observability/prometheus-registry.js';\nimport {\n buildRestObservabilityDescribe,\n buildRestObservabilityHealth,\n} from '../observability/service-contract.js';\n\n// Version is injected at build time by tsup define\ndeclare const __REST_API_VERSION__: string;\nconst REST_VERSION = typeof __REST_API_VERSION__ !== 'undefined' ? __REST_API_VERSION__ : '0.0.0';\n\nconst CACHE_WINDOW_MS = 200;\nconst READY_SCHEMA = 'kb.ready/1';\n\ninterface CachedSnapshot {\n base: SystemHealthSnapshot;\n expiresAt: number;\n}\n\nlet cachedBaseSnapshot: CachedSnapshot | null = null;\nlet inFlightBaseSnapshot: Promise<SystemHealthSnapshot> | null = null;\n\n/**\n * Register health and readiness routes\n */\nexport async function registerHealthRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n _repoRoot: string,\n registry: IEntityRegistry,\n readiness: ReadinessState\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const healthPaths = resolvePaths(basePath, '/health');\n const readyPaths = resolvePaths(basePath, '/ready');\n const observabilityDescribePaths = resolvePaths(basePath, '/observability/describe');\n const observabilityHealthPaths = resolvePaths(basePath, '/observability/health');\n\n for (const path of healthPaths) {\n fastify.get(path, async (_request, reply) => {\n const eventHub = fastify.kbEventHub;\n try {\n const baseSnapshot = await getBaseSnapshot(registry);\n const { registryLoaded, registryPartial, registryStale } = evaluateRegistryState(registry);\n readiness.registryLoaded = registryLoaded;\n readiness.registryPartial = registryPartial;\n readiness.registryStale = registryStale;\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n const pluginsMetrics = metricsCollector.getLastPluginMountSnapshot();\n const response = augmentSnapshot(baseSnapshot, readiness, pluginsMetrics);\n updateServiceHealthStatus(\n response.status === 'healthy' ? 'healthy' : response.status === 'degraded' ? 'degraded' : 'unhealthy',\n );\n eventHub?.publish({\n type: 'health',\n status: response.status,\n ts: response.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n });\n return reply.send(response);\n } catch (error) {\n const fallback = buildFallbackSnapshot(error, readiness);\n updateServiceHealthStatus('degraded');\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n eventHub?.publish({\n type: 'health',\n status: fallback.status,\n ts: fallback.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n });\n return reply.send(fallback);\n }\n });\n }\n\n for (const path of readyPaths) {\n fastify.get(path, async (_request, reply) => {\n const eventHub = fastify.kbEventHub;\n const { registryLoaded, registryPartial, registryStale } = evaluateRegistryState(registry);\n readiness.registryLoaded = registryLoaded;\n readiness.registryPartial = registryPartial;\n readiness.registryStale = registryStale;\n\n const response = buildReadinessResponse(readiness);\n const statusCode = response.ready ? 200 : 503;\n updateServiceHealthStatus(response.ready ? 'healthy' : 'degraded');\n\n eventHub?.publish({\n type: 'health',\n status: response.ready ? 'healthy' : 'degraded',\n ts: new Date().toISOString(),\n ready: response.ready,\n reason: response.reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n lastPluginMountTs: readiness.lastPluginMountTs,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs,\n pluginsMounted: metricsCollector.getLastPluginMountSnapshot()?.succeeded ?? 0,\n pluginsFailed: metricsCollector.getLastPluginMountSnapshot()?.failed ?? 0,\n });\n\n return reply.code(statusCode).send(response);\n });\n }\n\n for (const path of observabilityDescribePaths) {\n fastify.get(path, async () => buildRestObservabilityDescribe(basePath));\n }\n\n for (const path of observabilityHealthPaths) {\n fastify.get(path, async () => {\n try {\n const baseSnapshot = await getBaseSnapshot(registry);\n const pluginsMetrics = metricsCollector.getLastPluginMountSnapshot();\n const augmented = augmentSnapshot(baseSnapshot, readiness, pluginsMetrics);\n updateServiceHealthStatus(\n augmented.status === 'healthy' ? 'healthy' : augmented.status === 'degraded' ? 'degraded' : 'unhealthy',\n );\n return buildRestObservabilityHealth(basePath, augmented, readiness, metricsCollector.getMetrics());\n } catch (error) {\n const fallback = buildFallbackSnapshot(error, readiness);\n updateServiceHealthStatus('degraded');\n return buildRestObservabilityHealth(basePath, fallback, readiness, metricsCollector.getMetrics());\n }\n });\n }\n}\n\nasync function getBaseSnapshot(registry: IEntityRegistry): Promise<SystemHealthSnapshot> {\n const now = Date.now();\n if (cachedBaseSnapshot && now < cachedBaseSnapshot.expiresAt) {\n return cachedBaseSnapshot.base;\n }\n\n if (inFlightBaseSnapshot) {\n return inFlightBaseSnapshot;\n }\n\n inFlightBaseSnapshot = registry\n .getSystemHealth({\n uptimeSec: process.uptime(),\n version: { rest: REST_VERSION },\n })\n .then(snapshot => {\n cachedBaseSnapshot = {\n base: snapshot,\n expiresAt: Date.now() + CACHE_WINDOW_MS,\n };\n inFlightBaseSnapshot = null;\n return snapshot;\n })\n .catch(error => {\n inFlightBaseSnapshot = null;\n throw error;\n });\n\n return inFlightBaseSnapshot;\n}\n\nfunction augmentSnapshot(\n base: SystemHealthSnapshot,\n readiness: ReadinessState,\n pluginsMetrics?: PluginsMetricsSnapshot | null\n): SystemHealthSnapshot {\n const snapshot = cloneSnapshot(base);\n const failures = new Map(readiness.pluginRouteFailures.map(f => [f.id, f.error]));\n\n const components = snapshot.components.map(component => {\n const failure = failures.get(component.id);\n return failure\n ? {\n ...component,\n lastError: failure,\n }\n : component;\n });\n\n const readinessMeta = {\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesCount: readiness.pluginRoutesCount,\n pluginRouteErrors: readiness.pluginRouteErrors,\n pluginRouteFailures: readiness.pluginRouteFailures,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n pluginMounts: pluginsMetrics ?? null,\n lastPluginMountTs: readiness.lastPluginMountTs ?? null,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n redisEnabled: readiness.redisEnabled,\n redisConnected: readiness.redisConnected,\n redisStates: readiness.redisStates,\n };\n\n const meta: Record<string, unknown> = {\n source: 'rest',\n ...(snapshot.meta || {}),\n readiness: readinessMeta,\n };\n\n if (readiness.pluginRouteFailures.length > 0) {\n meta.readinessFailures = readiness.pluginRouteFailures;\n }\n\n const hasReadinessErrors = readiness.pluginRouteErrors > 0 || readiness.pluginRouteFailures.length > 0;\n\n return {\n ...snapshot,\n status: hasReadinessErrors ? 'degraded' : snapshot.status,\n components,\n meta,\n };\n}\n\nfunction buildFallbackSnapshot(\n error: unknown,\n readiness: ReadinessState\n): SystemHealthSnapshot {\n const message = sanitizeError(error);\n const now = new Date();\n\n const snapshot: SystemHealthSnapshot = {\n schema: 'kb.health/1',\n ts: now.toISOString(),\n uptimeSec: Math.max(0, Math.floor(process.uptime())),\n version: {\n kbLabs: process.env.KB_LABS_VERSION || process.env.KB_VERSION || 'unknown',\n rest: REST_VERSION,\n },\n registry: {\n total: 0,\n withRest: 0,\n withStudio: 0,\n errors: 1,\n generatedAt: new Date(0).toISOString(),\n expiresAt: undefined,\n partial: true,\n stale: true,\n },\n status: 'degraded',\n components: [],\n meta: {\n source: 'rest',\n error: message,\n },\n };\n\n return augmentSnapshot(snapshot, readiness, metricsCollector.getLastPluginMountSnapshot());\n}\n\nfunction cloneSnapshot(base: SystemHealthSnapshot): SystemHealthSnapshot {\n return {\n schema: base.schema,\n ts: base.ts,\n uptimeSec: base.uptimeSec,\n version: { ...base.version },\n registry: { ...base.registry },\n status: base.status,\n components: base.components.map(component => ({ ...component })),\n ...(base.meta ? { meta: { ...base.meta } } : {}),\n };\n}\n\nfunction sanitizeError(error: unknown): string {\n if (!error) {\n return 'unknown_error';\n }\n const message = error instanceof Error ? error.message : String(error);\n const firstLine = message.trim().split('\\n')[0] ?? message.trim();\n return firstLine.length > 160 ? `${firstLine.slice(0, 157)}...` : firstLine;\n}\n\nfunction evaluateRegistryState(registry: IEntityRegistry): {\n registryLoaded: boolean;\n registryPartial: boolean;\n registryStale: boolean;\n} {\n const snapshot = registry.snapshot();\n return {\n registryLoaded: snapshot.plugins.length > 0 && !snapshot.partial && !snapshot.stale,\n registryPartial: snapshot.partial,\n registryStale: snapshot.stale,\n };\n}\n\nfunction buildReadinessResponse(readiness: ReadinessState) {\n const ready = isReady(readiness);\n const pluginIssues =\n readiness.pluginRouteErrors > 0 || readiness.pluginRouteFailures.length > 0;\n const status = ready ? (pluginIssues ? 'degraded' : 'ready') : 'initializing';\n const reason = ready ? 'ready' : resolveReadinessReason(readiness);\n\n return {\n schema: READY_SCHEMA,\n ts: new Date().toISOString(),\n ready,\n status,\n reason,\n components: {\n cliApi: {\n initialized: readiness.cliApiInitialized,\n },\n registry: {\n loaded: readiness.registryLoaded,\n partial: readiness.registryPartial,\n stale: readiness.registryStale,\n },\n plugins: {\n mounted: readiness.pluginRoutesMounted,\n inProgress: readiness.pluginMountInProgress,\n routeCount: readiness.pluginRoutesCount,\n errors: readiness.pluginRouteErrors,\n failures: readiness.pluginRouteFailures,\n lastCompletedAt: readiness.lastPluginMountTs ?? null,\n lastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n },\n redis: {\n enabled: readiness.redisEnabled,\n healthy: readiness.redisConnected,\n states: readiness.redisStates,\n },\n },\n };\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/openapi\n * OpenAPI specification endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { mergeOpenAPISpecs, type OpenAPISpec } from '@kb-labs/core-registry';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n/**\n * Register OpenAPI routes\n */\nexport async function registerOpenAPIRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry\n) {\n // Plugin-manifest-merged OpenAPI spec (renamed from /openapi.json).\n // /openapi.json is now owned by @fastify/swagger (Fastify-native routes).\n // This endpoint aggregates specs from plugin manifests only.\n fastify.get('/openapi-plugins.json', {\n schema: {\n hide: true,\n },\n config: {\n rateLimit: {\n max: 10, // 10 requests\n timeWindow: '1 minute',\n },\n },\n }, async (_, reply) => {\n try {\n const plugins = await restDomainOperationMetrics.observeOperation('plugin.registry.list', async () =>\n registry.listPlugins(),\n );\n const specs: OpenAPISpec[] = [];\n \n for (const plugin of plugins) {\n const spec = await restDomainOperationMetrics.observeOperation('openapi.plugin.get', async () =>\n registry.getOpenAPISpec(plugin.id),\n );\n if (spec) {\n specs.push(spec);\n }\n }\n \n const merged = await restDomainOperationMetrics.observeOperation('openapi.plugins.aggregate', async () =>\n mergeOpenAPISpecs(specs),\n );\n \n // Add caching headers (1 hour)\n const snapshot = registry.snapshot();\n reply.header('Cache-Control', 'public, max-age=3600');\n reply.header('ETag', `\"${snapshot.rev}\"`);\n \n reply.send(merged);\n } catch (error) {\n reply.code(500).send({\n ok: false,\n error: {\n code: 'OPENAPI_GENERATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n });\n\n // Per-plugin OpenAPI spec\n fastify.get('/openapi/:pluginId', async (req, reply) => {\n try {\n const { pluginId } = req.params as { pluginId: string };\n const spec = await restDomainOperationMetrics.observeOperation('openapi.plugin.get', async () =>\n registry.getOpenAPISpec(pluginId),\n );\n \n if (!spec) {\n reply.code(404).send({\n ok: false,\n error: {\n code: 'PLUGIN_NOT_FOUND',\n message: `Plugin ${pluginId} not found`,\n },\n });\n return;\n }\n\n reply.send(spec);\n } catch (error) {\n reply.code(500).send({\n ok: false,\n error: {\n code: 'OPENAPI_GENERATION_FAILED',\n message: error instanceof Error ? error.message : String(error),\n },\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/diagnostics/header-debug\n * In-memory buffer for recent header policy decisions (debug & dry-run).\n */\n\nexport interface HeaderDebugEntry {\n timestamp: number;\n requestId: string;\n pluginId?: string;\n routeId?: string;\n direction: 'inbound' | 'outbound';\n header: string;\n allowed?: boolean;\n reason?: string;\n action?: string;\n dryRun: boolean;\n}\n\nconst MAX_ENTRIES = 200;\nconst buffer: HeaderDebugEntry[] = [];\n\nexport function recordHeaderDebug(entry: HeaderDebugEntry): void {\n buffer.push(entry);\n if (buffer.length > MAX_ENTRIES) {\n buffer.splice(0, buffer.length - MAX_ENTRIES);\n }\n}\n\nexport function getHeaderDebugEntries(limit = 50): HeaderDebugEntry[] {\n if (buffer.length === 0) {\n return [];\n }\n const clamped = Math.max(1, Math.min(limit, MAX_ENTRIES));\n return buffer.slice(-clamped).reverse();\n}\n\n\n","/**\n * @module @kb-labs/rest-api-app/routes/metrics\n * Metrics endpoint\n */\n\nimport type { FastifyInstance, FastifyReply, FastifyRequest } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { metricsCollector, restDomainOperationMetrics } from '../middleware/metrics.js';\nimport { getHeaderDebugEntries } from '../diagnostics/header-debug';\nimport { getPrometheusMetrics, updateProcessUptime } from '../observability/prometheus-registry';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\n\nfunction formatNumber(value: number, fractionDigits = 2): string {\n return Number.isFinite(value) ? value.toFixed(fractionDigits) : '0';\n}\n\n/**\n * Register metrics routes\n */\nexport function registerMetricsRoutes(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n const basePath = normalizeBasePath(config.basePath);\n const metricsPaths = resolvePaths(basePath, '/metrics');\n\n // GET /metrics (Prometheus format with real p50/p95/p99)\n const handler = async (_request: FastifyRequest, reply: FastifyReply) => {\n const metrics = metricsCollector.getMetrics();\n\n // Update process uptime before generating metrics\n updateProcessUptime(metrics.timestamps.startTime);\n\n // Get prom-client metrics (includes histogram with real percentiles)\n const promMetrics = await getPrometheusMetrics();\n\n // Append custom metrics not covered by prom-client\n const customLines: string[] = [];\n\n // Route-specific metrics (budget tracking)\n for (const entry of metrics.latency.histogram) {\n if (entry.budgetMs !== null) {\n const routeLabels = [`route=\"${entry.route}\"`];\n if (entry.pluginId) {\n routeLabels.push(`plugin=\"${entry.pluginId}\"`);\n }\n const labelString = routeLabels.join(',');\n customLines.push(`# HELP http_request_route_budget_ms Route performance budget in milliseconds`);\n customLines.push(`# TYPE http_request_route_budget_ms gauge`);\n customLines.push(`http_request_route_budget_ms{${labelString}} ${formatNumber(entry.budgetMs)}`);\n }\n }\n\n // Plugin mount snapshot\n const pluginSnapshot = metricsCollector.getLastPluginMountSnapshot();\n if (pluginSnapshot) {\n customLines.push(`# HELP kb_plugins_mount_total Plugins processed during last mount run`);\n customLines.push(`# TYPE kb_plugins_mount_total gauge`);\n customLines.push(`kb_plugins_mount_total ${pluginSnapshot.total}`);\n customLines.push(`kb_plugins_mount_succeeded ${pluginSnapshot.succeeded}`);\n customLines.push(`kb_plugins_mount_failed ${pluginSnapshot.failed}`);\n customLines.push(`kb_plugins_mount_elapsed_ms ${formatNumber(pluginSnapshot.elapsedMs)}`);\n }\n\n customLines.push(...restDomainOperationMetrics.getMetricLines());\n\n // Redis metrics (not in prom-client)\n customLines.push(`# HELP kb_redis_status_updates_total Redis status updates observed`);\n customLines.push(`# TYPE kb_redis_status_updates_total counter`);\n customLines.push(`kb_redis_status_updates_total ${metrics.redis.updates}`);\n\n customLines.push(`# HELP kb_redis_status_transitions_total Redis health transitions`);\n customLines.push(`# TYPE kb_redis_status_transitions_total counter`);\n customLines.push(`kb_redis_status_transitions_total{state=\"healthy\"} ${metrics.redis.healthyTransitions}`);\n customLines.push(`kb_redis_status_transitions_total{state=\"unhealthy\"} ${metrics.redis.unhealthyTransitions}`);\n\n if (metrics.redis.lastStatus) {\n const healthyValue = metrics.redis.lastStatus.healthy ? 1 : 0;\n customLines.push(`# HELP kb_redis_healthy Redis healthy flag (1 = healthy)`);\n customLines.push(`# TYPE kb_redis_healthy gauge`);\n customLines.push(`kb_redis_healthy ${healthyValue}`);\n\n for (const roleEntry of metrics.redis.roleStates) {\n for (const stateEntry of roleEntry.states) {\n const safeState = stateEntry.state.replace(/\"/g, '\\\\\"');\n customLines.push(\n `kb_redis_role_state_total{role=\"${roleEntry.role}\",state=\"${safeState}\"} ${stateEntry.count}`,\n );\n }\n }\n }\n\n // Combine prom-client metrics with custom metrics\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return promMetrics + '\\n' + customLines.join('\\n');\n };\n for (const path of metricsPaths) {\n server.get(path, handler);\n }\n\n server.get(`${basePath}/metrics/headers/debug`, {\n schema: {\n querystring: {\n type: 'object',\n properties: {\n limit: { type: 'integer', minimum: 1, maximum: 200 },\n },\n },\n response: {\n 200: {\n type: 'object',\n properties: {\n entries: { type: 'array' },\n },\n },\n },\n },\n }, async (request) => {\n const query = request.query as { limit?: number };\n const limit = typeof query?.limit === 'number' ? query.limit : 50;\n return {\n entries: getHeaderDebugEntries(limit),\n };\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/plugins\n * Plugin routes registration\n *\n * Uses @kb-labs/plugin-execution for unified execution layer.\n */\n\nimport type { FastifyInstance } from \"fastify\";\nimport type { RestApiConfig } from \"@kb-labs/rest-api-core\";\nimport type { IEntityRegistry, RegistrySnapshot } from \"@kb-labs/core-registry\";\nimport type { ManifestV3 } from \"@kb-labs/plugin-contracts\";\nimport { validateManifest } from \"@kb-labs/plugin-contracts\";\nimport { mountRoutes } from \"@kb-labs/plugin-execution/http\";\nimport { mountWebSocketChannels } from \"@kb-labs/plugin-execution\";\nimport { InProcessBackend } from \"@kb-labs/plugin-execution-factory\";\nimport { combineManifestsToRegistry } from \"@kb-labs/rest-api-core\";\nimport { platform } from \"@kb-labs/core-runtime\";\nimport {\n logDiagnosticEvent,\n type DiagnosticLogLevel,\n} from \"@kb-labs/core-platform\";\nimport type { DiagnosticReasonCode } from \"@kb-labs/core-contracts\";\nimport * as path from \"node:path\";\nimport * as fs from \"node:fs/promises\";\nimport type { ReadinessState } from \"./readiness\";\nimport { resolveWorkspaceRoot } from \"@kb-labs/core-workspace\";\nimport {\n metricsCollector,\n restDomainOperationMetrics,\n} from \"../middleware/metrics.js\";\nimport { performance } from \"node:perf_hooks\";\n\ninterface SnapshotManifestEntry {\n pluginId: string;\n manifest: ManifestV3;\n pluginRoot: string;\n}\n\nfunction extractSnapshotManifests(\n snapshot: RegistrySnapshot,\n): SnapshotManifestEntry[] {\n return (snapshot.manifests || []).map((entry) => ({\n pluginId: entry.pluginId,\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n }));\n}\n\n/**\n * Register plugin routes\n */\nexport async function registerPluginRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry,\n readiness?: ReadinessState,\n): Promise<void> {\n const gatewayTimeoutMs = config.timeouts?.requestTimeout ?? 30_000;\n // Stats aggregated from sequential mount results\n const stats = {\n mountedRoutes: 0,\n mountedChannels: 0,\n errors: 0,\n };\n\n if (readiness) {\n readiness.pluginRoutesMounted = false;\n readiness.pluginMountInProgress = true;\n readiness.pluginRoutesCount = 0;\n readiness.pluginRouteErrors = 0;\n readiness.pluginRouteFailures = [];\n readiness.pluginRoutesLastDurationMs = null;\n }\n\n metricsCollector.resetPluginRouteBudgets();\n\n const mountMetrics = metricsCollector.beginPluginMount();\n const mountStart = performance.now();\n\n try {\n const workspaceResolution = await resolveWorkspaceRoot({\n startDir: repoRoot,\n env: {\n // KB_PROJECT_ROOT is the canonical var injected by kb-dev into service processes.\n // Must be included here: passing a partial env object would silently drop it, causing\n // ctx.cwd to fall back to the platform dir (kb-platform333) instead of the user's\n // project dir when services are started via kb-dev start.\n KB_PROJECT_ROOT: process.env.KB_PROJECT_ROOT,\n KB_LABS_WORKSPACE_ROOT: process.env.KB_LABS_WORKSPACE_ROOT,\n KB_LABS_REPO_ROOT: process.env.KB_LABS_REPO_ROOT,\n },\n });\n const workspaceRoot = workspaceResolution.rootDir;\n platform.logger.info(\"Resolved workspace root\", {\n repoRoot,\n workspaceRoot,\n source: workspaceResolution.source,\n });\n\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n\n // Log discovery summary\n platform.logger.info(\"Plugin discovery summary\", {\n totalManifests: manifests.length,\n rev: snapshot.rev,\n partial: snapshot.partial,\n stale: snapshot.stale,\n plugins: manifests.map((e) => ({\n id: e.manifest.id,\n restRoutes: e.manifest.rest?.routes?.length ?? 0,\n wsChannels: e.manifest.ws?.channels?.length ?? 0,\n })),\n });\n\n if (snapshot.partial || snapshot.stale) {\n if (snapshot.partial) {\n logDiagnosticEvent(platform.logger, {\n domain: \"registry\",\n event: \"plugin.registry.snapshot\",\n level: \"warn\",\n reasonCode: \"snapshot_partial\",\n message: \"Registry snapshot is partial\",\n outcome: \"failed\",\n serviceId: \"rest\",\n evidence: {\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n },\n });\n }\n\n if (snapshot.stale) {\n logDiagnosticEvent(platform.logger, {\n domain: \"registry\",\n event: \"plugin.registry.snapshot\",\n level: \"warn\",\n reasonCode: \"snapshot_stale\",\n message: \"Registry snapshot is stale\",\n outcome: \"failed\",\n serviceId: \"rest\",\n evidence: {\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n expiresAt: snapshot.expiresAt,\n },\n });\n }\n }\n\n emitRegistrySnapshotDiagnostics(snapshot);\n\n // Use platform's unified ExecutionBackend (initialized in bootstrap.ts)\n const backend = platform.executionBackend;\n // WS channels must always run in-process: the WSSender holds closures over\n // the live ws socket and connectionRegistry — both bound to this host.\n // Worker-pool serialization strips its methods (close/getConnectionId\n // become undefined in the worker), so defineWebSocket's createTypedSender\n // crashes with \"Cannot read properties of undefined (reading 'bind')\".\n const wsBackend = new InProcessBackend({ platform });\n\n // Filter plugins that have routes or channels to mount\n const mountableManifests = manifests.filter(\n (entry) =>\n (entry.manifest.rest?.routes &&\n entry.manifest.rest.routes.length > 0) ||\n (entry.manifest.ws?.channels && entry.manifest.ws.channels.length > 0),\n );\n\n platform.logger.info(\"Plugins selected for route mounting\", {\n mountable: mountableManifests.length,\n skipped: manifests.length - mountableManifests.length,\n mountablePlugins: mountableManifests.map((e) => e.manifest.id),\n });\n\n // ── Phase 1: Batch-validate all handler files in one I/O pass ──\n // Collect all handler file paths across all plugins, then validate in a single Promise.all()\n // This avoids interleaved fs.access() calls that caused race conditions with parallel mounting.\n //\n // Handler paths in manifests are relative to the plugin's dist/ directory, because manifests\n // are loaded from dist/manifest.js. pluginRoot points to the package root, so we resolve\n // handlers relative to pluginRoot/dist/ to match where the compiled files actually live.\n const handlerChecks: Array<{ key: string; filePath: string }> = [];\n for (const entry of mountableManifests) {\n if (entry.manifest.rest?.routes) {\n for (const route of entry.manifest.rest.routes) {\n const handlerFile = route.handler.split(\"#\")[0];\n if (handlerFile) {\n const pluginDistRoot = path.join(entry.pluginRoot, \"dist\");\n const handlerPath = path.resolve(pluginDistRoot, handlerFile);\n handlerChecks.push({\n key: `${entry.manifest.id}::${route.method} ${route.path}`,\n filePath: handlerPath,\n });\n }\n }\n }\n }\n\n const handlerAccessResults = await Promise.all(\n handlerChecks.map(async (check) => {\n try {\n await fs.access(check.filePath);\n return { key: check.key, filePath: check.filePath, exists: true };\n } catch {\n return { key: check.key, filePath: check.filePath, exists: false };\n }\n }),\n );\n\n // Build lookup: \"pluginId::METHOD /path\" → { exists, filePath }\n const handlerExistsMap = new Map<\n string,\n { exists: boolean; filePath: string }\n >();\n for (const result of handlerAccessResults) {\n handlerExistsMap.set(result.key, {\n exists: result.exists,\n filePath: result.filePath,\n });\n }\n\n platform.logger.debug(\"Batch handler file validation completed\", {\n totalHandlers: handlerChecks.length,\n validHandlers: handlerAccessResults.filter((r) => r.exists).length,\n invalidHandlers: handlerAccessResults.filter((r) => !r.exists).length,\n });\n\n // ── Phase 2: Sequential plugin mounting ──\n // Routes are registered in-memory on Fastify (~0.1ms per route).\n // Sequential mounting eliminates race conditions with zero performance cost.\n let mountedRoutes = 0;\n let mountedChannels = 0;\n let errors = 0;\n const succeeded: string[] = [];\n const failed: string[] = [];\n const routeFailures: Array<{ id: string; error: string }> = [];\n\n for (const entry of mountableManifests) {\n const { manifest, pluginRoot } = entry;\n const pluginDistRoot = path.join(pluginRoot, \"dist\");\n\n // Validate routes using pre-built handler map (no I/O here)\n const restValidationErrors: string[] = [];\n if (manifest.rest?.routes) {\n for (const route of manifest.rest.routes) {\n const handlerFile = route.handler.split(\"#\")[0];\n if (!handlerFile) {\n restValidationErrors.push(\n `Route ${route.method} ${route.path}: Invalid handler reference \"${route.handler}\"`,\n );\n continue;\n }\n const lookupKey = `${manifest.id}::${route.method} ${route.path}`;\n const check = handlerExistsMap.get(lookupKey);\n if (check && !check.exists) {\n restValidationErrors.push(\n `Route ${route.method} ${route.path}: Handler file not found: ${check.filePath}`,\n );\n }\n }\n }\n\n if (restValidationErrors.length > 0) {\n const reasonCode = inferRouteValidationReasonCode(restValidationErrors);\n logDiagnosticEvent(platform.logger, {\n event: \"plugin.routes.validation\",\n level: resolveRouteValidationLogLevel(\n restValidationErrors,\n manifest.rest?.routes?.length ?? 0,\n ),\n reasonCode,\n message: \"Plugin route validation failed\",\n outcome: \"failed\",\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: \"rest\",\n issues: restValidationErrors,\n remediation: \"Verify handler file paths, exports, and route schema.\",\n evidence: {\n pluginRoot,\n totalRoutes: manifest.rest?.routes?.length ?? 0,\n },\n });\n\n platform.logger.warn(\n \"REST validation errors found, will skip problematic routes but continue mounting others\",\n {\n plugin: `${manifest.id}@${manifest.version}`,\n pluginRoot,\n remediation: \"Verify REST handler file and export exist\",\n errors: restValidationErrors,\n },\n );\n\n const errorPaths = new Set(\n restValidationErrors\n .map((error) => {\n const match = error.match(/Route\\s+(\\w+)\\s+([^\\s:]+)/);\n return match ? `${match[1]} ${match[2]}` : null;\n })\n .filter(Boolean),\n );\n\n const validRoutes = manifest.rest!.routes!.filter((route) => {\n const routeKey = `${route.method} ${route.path}`;\n return !errorPaths.has(routeKey);\n });\n\n if (validRoutes.length === 0) {\n restDomainOperationMetrics.recordOperation(\n \"plugin.routes.mount\",\n 0,\n \"error\",\n );\n logDiagnosticEvent(platform.logger, {\n event: \"plugin.routes.validation\",\n level: \"error\",\n reasonCode,\n message: \"All plugin routes failed validation; skipping plugin\",\n outcome: \"failed\",\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: \"rest\",\n issues: restValidationErrors,\n evidence: {\n pluginRoot,\n },\n });\n errors += 1;\n failed.push(manifest.id);\n routeFailures.push({\n id: manifest.id,\n error: summarizeValidationErrors(restValidationErrors),\n });\n continue;\n }\n\n manifest.rest!.routes = validRoutes;\n platform.logger.info(\"Filtered routes, mounting valid ones\", {\n plugin: `${manifest.id}@${manifest.version}`,\n totalRoutes:\n manifest.rest!.routes.length + restValidationErrors.length,\n validRoutes: validRoutes.length,\n skippedRoutes: restValidationErrors.length,\n });\n }\n\n try {\n const start = performance.now();\n\n let pluginBasePath: string;\n if (manifest.rest?.basePath) {\n if (manifest.rest.basePath.startsWith(\"/api/\")) {\n pluginBasePath = manifest.rest.basePath;\n } else if (manifest.rest.basePath.startsWith(\"/v1/\")) {\n pluginBasePath = manifest.rest.basePath.replace(\n /^\\/v1/,\n config.basePath,\n );\n } else {\n pluginBasePath = `${config.basePath}${manifest.rest.basePath}`;\n }\n } else {\n pluginBasePath = `${config.basePath}/plugins/${manifest.id}`;\n }\n\n platform.logger.info(\"Mounting plugin routes\", {\n plugin: `${manifest.id}@${manifest.version}`,\n configBasePath: config.basePath,\n manifestBasePath: manifest.rest?.basePath,\n pluginBasePath,\n pluginRoot,\n routes: manifest.rest?.routes?.length ?? 0,\n });\n\n await mountRoutes(server, manifest, {\n backend,\n pluginRoot: pluginDistRoot,\n workspaceRoot,\n basePath: pluginBasePath,\n defaultTimeoutMs: gatewayTimeoutMs,\n });\n\n const duration = performance.now() - start;\n const routesCount = manifest.rest?.routes?.length ?? 0;\n\n for (const route of manifest.rest?.routes ?? []) {\n metricsCollector.registerRouteBudget(\n route.method,\n `${pluginBasePath}${route.path}`,\n route.timeoutMs ?? gatewayTimeoutMs,\n manifest.id,\n );\n }\n\n mountMetrics.recordSuccess(manifest.id, routesCount, duration);\n restDomainOperationMetrics.recordOperation(\n \"plugin.routes.mount\",\n duration,\n \"ok\",\n );\n\n for (const route of manifest.rest?.routes ?? []) {\n platform.logger.debug(\"Mounted route\", {\n pluginId: manifest.id,\n \"http.method\": route.method,\n \"http.route\": `${pluginBasePath}${route.path}`,\n \"plugin.handler\": route.handler,\n });\n }\n\n platform.logger.info(\"Successfully mounted plugin routes\", {\n plugin: `${manifest.id}@${manifest.version}`,\n pluginBasePath,\n routesCount,\n durationMs: Number(duration.toFixed(2)),\n });\n\n // Mount WebSocket channels if present\n let channelsCount = 0;\n if (manifest.ws?.channels && manifest.ws.channels.length > 0) {\n try {\n const wsStart = performance.now();\n let wsBasePath: string =\n manifest.ws.basePath || `/v1/ws/plugins/${manifest.id}`;\n // Normalize: /v1/ → config.basePath (same as REST routes) so gateway\n // can proxy both HTTP and WS under the same /api/v1 prefix.\n if (wsBasePath.startsWith(\"/v1/\")) {\n wsBasePath = wsBasePath.replace(/^\\/v1/, config.basePath);\n }\n\n platform.logger.info(\"Mounting WebSocket channels\", {\n plugin: `${manifest.id}@${manifest.version}`,\n wsBasePath,\n channels: manifest.ws.channels.length,\n });\n\n const wsResult = await mountWebSocketChannels(server, manifest, {\n backend: wsBackend,\n pluginRoot: pluginDistRoot,\n workspaceRoot,\n basePath: wsBasePath,\n defaultTimeoutMs:\n manifest.ws.defaults?.timeoutMs ?? gatewayTimeoutMs,\n defaultMaxMessageSize: manifest.ws.defaults?.maxMessageSize,\n });\n\n const wsDuration = performance.now() - wsStart;\n channelsCount = wsResult.mounted;\n\n if (wsResult.mounted > 0) {\n platform.logger.info(\"Successfully mounted WebSocket channels\", {\n plugin: `${manifest.id}@${manifest.version}`,\n channels: wsResult.mounted,\n durationMs: Number(wsDuration.toFixed(2)),\n });\n }\n\n if (wsResult.errors.length > 0) {\n platform.logger.warn(\"WebSocket channel mounting had errors\", {\n plugin: `${manifest.id}@${manifest.version}`,\n errors: wsResult.errors,\n });\n }\n } catch (wsError) {\n logDiagnosticEvent(platform.logger, {\n event: \"plugin.ws.mount\",\n level: \"error\",\n reasonCode: \"ws_mount_failed\",\n message: \"Failed to mount plugin WebSocket channels\",\n outcome: \"failed\",\n error:\n wsError instanceof Error ? wsError : new Error(String(wsError)),\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: \"rest\",\n });\n platform.logger.error(\n \"Failed to mount WebSocket channels\",\n wsError instanceof Error ? wsError : new Error(String(wsError)),\n { plugin: manifest.id },\n );\n }\n }\n\n mountedRoutes += routesCount;\n mountedChannels += channelsCount;\n succeeded.push(manifest.id);\n } catch (error) {\n mountMetrics.recordFailure(manifest.id, shortErrorMessage(error));\n restDomainOperationMetrics.recordOperation(\n \"plugin.routes.mount\",\n 0,\n \"error\",\n );\n logDiagnosticEvent(platform.logger, {\n event: \"plugin.routes.mount\",\n level: \"error\",\n reasonCode: \"route_mount_failed\",\n message: \"Failed to mount plugin routes\",\n outcome: \"failed\",\n error: error instanceof Error ? error : new Error(String(error)),\n pluginId: manifest.id,\n pluginVersion: manifest.version,\n serviceId: \"rest\",\n });\n platform.logger.error(\n \"Failed to mount plugin routes\",\n error instanceof Error ? error : new Error(String(error)),\n { plugin: manifest.id },\n );\n errors += 1;\n failed.push(manifest.id);\n routeFailures.push({\n id: manifest.id,\n error: `rest_mount_failed ${shortErrorMessage(error)}`,\n });\n }\n }\n\n // Update stats and readiness\n stats.mountedRoutes = mountedRoutes;\n stats.mountedChannels = mountedChannels;\n stats.errors = errors;\n if (readiness) {\n readiness.pluginRouteFailures = routeFailures;\n }\n\n // Log summary\n platform.logger.info(\n \"Sequential plugin route and WebSocket channel mounting completed\",\n {\n total: mountableManifests.length,\n succeeded: succeeded.length,\n failed: failed.length,\n mountedRoutes,\n mountedChannels,\n errors,\n },\n );\n } catch (error) {\n logDiagnosticEvent(platform.logger, {\n domain: \"registry\",\n event: \"plugin.discovery\",\n level: \"error\",\n reasonCode: \"plugin_discovery_failed\",\n message: \"Plugin discovery failed during route registration\",\n outcome: \"failed\",\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: \"rest\",\n });\n platform.logger.error(\n \"Plugin discovery failed\",\n error instanceof Error ? error : new Error(String(error)),\n );\n stats.errors += 1;\n if (readiness) {\n readiness.pluginRoutesCount = stats.mountedRoutes;\n readiness.pluginRouteErrors = stats.errors;\n readiness.pluginRoutesMounted = false;\n readiness.pluginMountInProgress = false;\n readiness.pluginRoutesLastDurationMs = null;\n readiness.pluginRouteFailures.push({\n id: \"discovery\",\n error: `rest_discovery_failed ${shortErrorMessage(error)}`,\n });\n }\n metricsCollector.completePluginMount(\n platform.logger as unknown as {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n },\n );\n return;\n }\n\n if (readiness) {\n readiness.pluginRoutesCount = stats.mountedRoutes;\n readiness.pluginRouteErrors = stats.errors;\n readiness.pluginRoutesMounted = stats.errors === 0;\n readiness.pluginMountInProgress = false;\n readiness.lastPluginMountTs = new Date().toISOString();\n readiness.pluginRoutesLastDurationMs = Number(\n (performance.now() - mountStart).toFixed(2),\n );\n }\n\n metricsCollector.completePluginMount(\n platform.logger as unknown as {\n info: (...args: unknown[]) => void;\n warn: (...args: unknown[]) => void;\n },\n );\n}\n\n/**\n * Register plugin snapshot endpoints for Studio\n */\nexport async function registerPluginSnapshotRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n registry: IEntityRegistry,\n): Promise<void> {\n const basePath = config.basePath;\n\n server.post(`${basePath}/plugins/refresh`, async (_request, reply) => {\n try {\n await restDomainOperationMetrics.observeOperation(\n \"plugin.registry.refresh\",\n async () => {\n await registry.refresh();\n },\n );\n const snapshot = await restDomainOperationMetrics.observeOperation(\n \"plugin.registry.snapshot\",\n async () => registry.snapshot(),\n );\n emitRegistrySnapshotDiagnostics(snapshot);\n\n reply.type(\"application/json\");\n return {\n ok: true,\n data: {\n rev: snapshot.rev,\n total: snapshot.plugins.length,\n generatedAt: snapshot.generatedAt,\n partial: snapshot.partial,\n stale: snapshot.stale,\n },\n };\n } catch (error) {\n logDiagnosticEvent(platform.logger, {\n domain: \"registry\",\n event: \"plugin.registry.refresh\",\n level: \"error\",\n reasonCode: \"registry_refresh_failed\",\n message: \"Failed to refresh plugin registry\",\n outcome: \"failed\",\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: \"rest\",\n });\n platform.logger.error(\n \"Failed to refresh plugin registry\",\n error instanceof Error ? error : new Error(String(error)),\n );\n reply.code(500).send({\n ok: false,\n error: \"Failed to refresh plugin registry\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Raw manifests endpoint for Studio/debug consumers\n server.get(`${basePath}/plugins/registry`, async (_request, reply) => {\n try {\n const snapshot = await restDomainOperationMetrics.observeOperation(\n \"plugin.registry.snapshot\",\n async () => registry.snapshot(),\n );\n\n // Get build timestamps and validate manifests\n const manifestsWithTimestamps = await Promise.all(\n snapshot.manifests.map(async (entry) => {\n let buildTimestamp: string | undefined;\n try {\n const distPath = path.join(entry.pluginRoot, \"dist\");\n const stats = await fs.stat(distPath);\n buildTimestamp = stats.mtime.toISOString();\n } catch {\n // dist/ doesn't exist or not accessible, skip\n }\n\n // Validate manifest structure\n const validation = validateManifest(entry.manifest);\n\n return {\n pluginId: entry.pluginId,\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n source: entry.source,\n discoveredAt: snapshot.generatedAt,\n buildTimestamp,\n validation: {\n valid: validation.valid,\n errors: validation.errors,\n },\n };\n }),\n );\n\n reply.type(\"application/json\");\n return {\n manifests: manifestsWithTimestamps,\n apiBasePath: basePath,\n diagnostics: {\n total: snapshot.diagnostics?.length ?? 0,\n items: (snapshot.diagnostics ?? []).map((diagnostic) => ({\n severity: diagnostic.severity,\n code: diagnostic.code,\n reasonCode: mapRegistryDiagnosticReasonCode(diagnostic.code),\n message: diagnostic.message,\n pluginId: diagnostic.context?.pluginId,\n filePath: diagnostic.context?.filePath,\n remediation: diagnostic.remediation,\n ts: diagnostic.ts,\n })),\n },\n };\n } catch (error) {\n platform.logger.error(\n \"Failed to get plugin registry\",\n error instanceof Error ? error : new Error(String(error)),\n );\n reply.code(500).send({\n error: \"Failed to load plugin registry\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // Plugin README — serves README.md from plugin root directory\n server.get<{\n Params: { scope: string; name: string };\n }>(\n `${basePath}/plugins/@:scope/:name/readme`,\n {\n schema: { hide: true },\n },\n async (request, reply) => {\n const { scope, name } = request.params;\n\n if (!scope || !name) {\n return reply.code(400).send({ error: \"Invalid plugin identifier\" });\n }\n\n const pluginId = `@${scope}/${name}`;\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n const entry = manifests.find((e) => e.pluginId === pluginId);\n\n if (!entry) {\n return reply.code(404).send({ error: `Plugin not found: ${pluginId}` });\n }\n\n const readmePath = path.join(entry.pluginRoot, \"README.md\");\n\n if (!readmePath.startsWith(entry.pluginRoot)) {\n return reply.code(400).send({ error: \"Invalid path\" });\n }\n\n try {\n const content = await fs.readFile(readmePath, \"utf-8\");\n return reply\n .code(200)\n .header(\"Content-Type\", \"text/plain; charset=utf-8\")\n .send(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return reply.code(404).send({ error: \"README.md not found\" });\n }\n return reply.code(500).send({ error: \"Failed to read README.md\" });\n }\n },\n );\n\n // Plugin Changelog — serves CHANGELOG.md from plugin root directory\n server.get<{\n Params: { scope: string; name: string };\n }>(\n `${basePath}/plugins/@:scope/:name/changelog`,\n {\n schema: { hide: true },\n },\n async (request, reply) => {\n const { scope, name } = request.params;\n\n if (!scope || !name) {\n return reply.code(400).send({ error: \"Invalid plugin identifier\" });\n }\n\n const pluginId = `@${scope}/${name}`;\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n const entry = manifests.find((e) => e.pluginId === pluginId);\n\n if (!entry) {\n return reply.code(404).send({ error: `Plugin not found: ${pluginId}` });\n }\n\n const changelogPath = path.join(entry.pluginRoot, \"CHANGELOG.md\");\n\n if (!changelogPath.startsWith(entry.pluginRoot)) {\n return reply.code(400).send({ error: \"Invalid path\" });\n }\n\n try {\n const content = await fs.readFile(changelogPath, \"utf-8\");\n return reply\n .code(200)\n .header(\"Content-Type\", \"text/plain; charset=utf-8\")\n .send(content);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return reply.code(404).send({ error: \"CHANGELOG.md not found\" });\n }\n return reply.code(500).send({ error: \"Failed to read CHANGELOG.md\" });\n }\n },\n );\n\n // Studio Registry V2 — returns plugin pages and menus for Module Federation\n server.get(\n `${basePath}/studio/registry`,\n {\n schema: {\n tags: [\"Studio\"],\n summary: \"Get Studio Registry V2 (plugin pages for Module Federation)\",\n },\n },\n async (_request, reply) => {\n try {\n const snapshot = await restDomainOperationMetrics.observeOperation(\n \"plugin.studio.registry\",\n async () => registry.snapshot(),\n );\n const manifests = extractSnapshotManifests(snapshot);\n\n // Only plugins with studio V2 config\n const studioManifests = manifests\n .filter((entry) => entry.manifest.studio?.version === 2)\n .map((entry) => ({\n manifest: entry.manifest,\n pluginRoot: entry.pluginRoot,\n }));\n\n const studioRegistry = combineManifestsToRegistry(studioManifests);\n\n reply.type(\"application/json\");\n return studioRegistry;\n } catch (error) {\n platform.logger.error(\n \"Failed to generate studio registry\",\n error instanceof Error ? error : new Error(String(error)),\n );\n reply.code(500).send({\n error: \"Failed to generate studio registry\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n },\n );\n\n // Widget bundle static files — serves dist/widgets/ from plugin packages\n server.get<{\n Params: { scope: string; name: string; \"*\": string };\n }>(\n \"/plugins/@:scope/:name/widgets/*\",\n {\n schema: { hide: true },\n },\n async (request, reply) => {\n const { scope, name } = request.params;\n const filePath = request.params[\"*\"];\n\n if (!scope || !name || !filePath || filePath.includes(\"..\")) {\n return reply.code(400).send({ error: \"Invalid path\" });\n }\n\n const pluginId = `@${scope}/${name}`;\n\n // Find the plugin's widgetBundleDir from registry\n const snapshot = registry.snapshot();\n const manifests = extractSnapshotManifests(snapshot);\n const entry = manifests.find(\n (e) => e.manifest.id === pluginId && e.manifest.studio?.version === 2,\n );\n\n if (!entry) {\n return reply\n .code(404)\n .send({ error: `No widget bundle for ${pluginId}` });\n }\n\n const { join, extname } = await import(\"node:path\");\n const { createReadStream, existsSync, statSync } =\n await import(\"node:fs\");\n\n const bundleDir = join(entry.pluginRoot, \"dist\", \"widgets\");\n const fullPath = join(bundleDir, filePath);\n\n if (!fullPath.startsWith(bundleDir)) {\n return reply.code(400).send({ error: \"Invalid path\" });\n }\n\n if (!existsSync(fullPath) || !statSync(fullPath).isFile()) {\n return reply\n .code(404)\n .send({\n error: `Widget file not found: ${pluginId}/widgets/${filePath}`,\n });\n }\n\n const MIME: Record<string, string> = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".json\": \"application/json\",\n \".map\": \"application/json\",\n };\n\n const ext = extname(filePath);\n const isEntry = filePath === \"remoteEntry.js\";\n\n return reply\n .code(200)\n .header(\"Content-Type\", MIME[ext] ?? \"application/octet-stream\")\n .header(\"Content-Length\", statSync(fullPath).size)\n .header(\n \"Cache-Control\",\n isEntry\n ? \"public, max-age=10, must-revalidate\"\n : process.env.NODE_ENV === \"production\"\n ? \"public, max-age=31536000, immutable\"\n : \"no-cache\",\n )\n .send(createReadStream(fullPath));\n },\n );\n\n // Plugin registry health endpoint\n server.get(`${basePath}/plugins/health`, async (_request, reply) => {\n try {\n const snapshot = await restDomainOperationMetrics.observeOperation(\n \"plugin.registry.health\",\n async () => registry.snapshot(),\n );\n\n // Collect validation errors from all manifests\n const validationIssues: Array<{ pluginId: string; errors: string[] }> =\n [];\n for (const entry of snapshot.manifests) {\n const validation = validateManifest(entry.manifest);\n if (!validation.valid) {\n validationIssues.push({\n pluginId: entry.pluginId,\n errors: validation.errors,\n });\n }\n }\n\n // Registry resolution errors (plugins that failed to load)\n const registryErrors = (snapshot as { errors?: unknown[] }).errors ?? [];\n const discoveryDiagnostics = snapshot.diagnostics ?? [];\n const discoveryErrorCount = discoveryDiagnostics.filter(\n (diagnostic) => diagnostic.severity === \"error\",\n ).length;\n\n // Determine why registry is partial\n const partialReasons: string[] = [];\n if (snapshot.corrupted) {\n partialReasons.push(\"snapshot_corrupted\");\n }\n if (registryErrors.length > 0) {\n partialReasons.push(\"registry_errors\");\n }\n if (discoveryErrorCount > 0) {\n partialReasons.push(\"discovery_diagnostics\");\n }\n // If partial but no clear reason, it's likely initialization\n if (snapshot.partial && partialReasons.length === 0) {\n partialReasons.push(\"initialization_incomplete\");\n }\n\n reply.type(\"application/json\");\n return {\n healthy:\n !snapshot.partial &&\n !snapshot.stale &&\n validationIssues.length === 0 &&\n registryErrors.length === 0 &&\n discoveryErrorCount === 0,\n snapshot: {\n partial: snapshot.partial,\n stale: snapshot.stale,\n corrupted: snapshot.corrupted,\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n totalManifests: snapshot.manifests.length,\n partialReasons,\n },\n registryErrors: {\n total: registryErrors.length,\n items: registryErrors.map((err) => {\n const e = err as {\n pluginPath?: string;\n pluginId?: string;\n error?: string;\n code?: string;\n };\n return {\n pluginPath: e.pluginPath,\n pluginId: e.pluginId,\n error: e.error,\n code: e.code,\n };\n }),\n },\n diagnostics: {\n total: discoveryDiagnostics.length,\n errors: discoveryErrorCount,\n warnings: discoveryDiagnostics.filter(\n (diagnostic) => diagnostic.severity === \"warning\",\n ).length,\n items: discoveryDiagnostics.map((diagnostic) => ({\n severity: diagnostic.severity,\n code: diagnostic.code,\n reasonCode: mapRegistryDiagnosticReasonCode(diagnostic.code),\n message: diagnostic.message,\n pluginId: diagnostic.context?.pluginId,\n filePath: diagnostic.context?.filePath,\n remediation: diagnostic.remediation,\n ts: diagnostic.ts,\n })),\n },\n validation: {\n totalIssues: validationIssues.length,\n issues: validationIssues,\n },\n message:\n registryErrors.length > 0\n ? `Registry is partial - ${registryErrors.length} plugin(s) failed to load. Check registryErrors.items for details.`\n : discoveryErrorCount > 0\n ? `Registry has discovery diagnostics - ${discoveryErrorCount} blocking issue(s). Check diagnostics.items for details.`\n : snapshot.partial &&\n partialReasons.includes(\"initialization_incomplete\")\n ? \"Registry is partial - initialization incomplete. Try refreshing or wait for the snapshot rebuild to complete.\"\n : snapshot.partial\n ? `Registry is partial - reasons: ${partialReasons.join(\", \")}`\n : snapshot.stale\n ? \"Registry is stale - plugin snapshot may be outdated.\"\n : validationIssues.length > 0\n ? `${validationIssues.length} plugin(s) have validation errors.`\n : \"All plugins are healthy.\",\n };\n } catch (error) {\n platform.logger.error(\n \"Failed to get plugin health\",\n error instanceof Error ? error : new Error(String(error)),\n );\n reply.code(500).send({\n error: \"Failed to get plugin health\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n\n // AI Assistant endpoint: ask questions about a plugin\n server.post(`${basePath}/plugins/:pluginId/ask`, async (request, reply) => {\n try {\n const { pluginId } = request.params as { pluginId: string };\n const { question } = request.body as { question: string };\n\n if (!question || typeof question !== \"string\") {\n reply.code(400).send({\n error: \"Bad request\",\n message: \"Question is required and must be a string\",\n });\n return;\n }\n\n // Get plugin manifest\n const snapshot = await restDomainOperationMetrics.observeOperation(\n \"plugin.registry.snapshot\",\n async () => registry.snapshot(),\n );\n const pluginEntry = snapshot.manifests.find(\n (entry) => entry.pluginId === pluginId,\n );\n\n if (!pluginEntry) {\n reply.code(404).send({\n error: \"Plugin not found\",\n message: `Plugin ${pluginId} not found in registry`,\n });\n return;\n }\n\n // Build prompt for LLM\n const systemPrompt = `You are a helpful assistant that explains KB Labs plugins based on their manifest.\nProvide clear, concise answers about the plugin's capabilities, API endpoints, permissions, and usage.\nBe specific and reference the actual values from the manifest.`;\n\n const userPrompt = `Plugin Manifest:\n${JSON.stringify(pluginEntry.manifest, null, 2)}\n\nUser Question: ${question}\n\nPlease answer the question based on the plugin manifest above.`;\n\n // Call LLM\n const response = await restDomainOperationMetrics.observeOperation(\n \"plugin.assistant.ask\",\n () =>\n platform.llm.complete(userPrompt, {\n systemPrompt,\n temperature: 0.3,\n maxTokens: 1000,\n }),\n );\n\n reply.type(\"application/json\");\n return {\n answer: response.content,\n usage: response.usage,\n };\n } catch (error) {\n platform.logger.error(\n \"Failed to get AI answer about plugin\",\n error instanceof Error ? error : new Error(String(error)),\n );\n reply.code(500).send({\n error: \"Failed to get AI answer\",\n message: error instanceof Error ? error.message : String(error),\n });\n }\n });\n}\n\n/**\n * Shutdown execution backend gracefully.\n * NOTE: ExecutionBackend is now owned by platform, shutdown via platform.shutdown()\n */\nexport async function shutdownExecutionBackend(): Promise<void> {\n // ExecutionBackend lifecycle is now managed by platform\n // Call platform.shutdown() instead to shutdown all services including executionBackend\n await platform.shutdown();\n}\n\nfunction summarizeValidationErrors(errors: string[]): string {\n if (errors.length === 0) {\n return \"rest_validation_failed\";\n }\n const first = errors[0] || \"rest_validation_failed\";\n const prefix = first.split(\":\")[0]?.trim() ?? \"rest_validation_failed\";\n return `rest_validation_failed ${prefix}`.trim();\n}\n\nfunction shortErrorMessage(error: unknown): string {\n if (!error) {\n return \"unknown_error\";\n }\n const message = error instanceof Error ? error.message : String(error);\n const firstLine = message.trim().split(\"\\n\")[0] ?? message.trim();\n return firstLine.length > 120 ? `${firstLine.slice(0, 117)}...` : firstLine;\n}\n\nfunction mapDiagnosticSeverityToLogLevel(\n severity: \"error\" | \"warning\" | \"info\" | \"debug\",\n): DiagnosticLogLevel {\n switch (severity) {\n case \"error\":\n return \"error\";\n case \"warning\":\n return \"warn\";\n case \"debug\":\n return \"debug\";\n default:\n return \"info\";\n }\n}\n\nfunction mapRegistryDiagnosticReasonCode(code: string): DiagnosticReasonCode {\n switch (code) {\n case \"MANIFEST_NOT_FOUND\":\n return \"manifest_missing\";\n case \"MANIFEST_VALIDATION_ERROR\":\n case \"MANIFEST_PARSE_ERROR\":\n return \"manifest_invalid\";\n case \"MANIFEST_LOAD_TIMEOUT\":\n return \"manifest_load_timeout\";\n case \"INTEGRITY_MISMATCH\":\n return \"integrity_mismatch\";\n default:\n return \"plugin_discovery_failed\";\n }\n}\n\nfunction emitRegistrySnapshotDiagnostics(snapshot: RegistrySnapshot): void {\n for (const diagnostic of snapshot.diagnostics ?? []) {\n logDiagnosticEvent(platform.logger, {\n domain: \"registry\",\n event: \"plugin.discovery.diagnostic\",\n level: mapDiagnosticSeverityToLogLevel(diagnostic.severity),\n reasonCode: mapRegistryDiagnosticReasonCode(diagnostic.code),\n message: diagnostic.message,\n outcome: diagnostic.severity === \"error\" ? \"failed\" : \"skipped\",\n pluginId: diagnostic.context?.pluginId,\n serviceId: \"rest\",\n manifestPath: diagnostic.context?.filePath,\n discoveryCode: diagnostic.code,\n remediation: diagnostic.remediation,\n evidence: {\n severity: diagnostic.severity,\n entityKind: diagnostic.context?.entityKind,\n entityId: diagnostic.context?.entityId,\n ts: diagnostic.ts,\n },\n });\n }\n}\n\nfunction inferRouteValidationReasonCode(\n errors: string[],\n): DiagnosticReasonCode {\n if (errors.some((error) => error.includes(\"Handler file not found\"))) {\n return \"handler_not_found\";\n }\n return \"route_validation_failed\";\n}\n\nfunction resolveRouteValidationLogLevel(\n errors: string[],\n totalRoutes: number,\n): DiagnosticLogLevel {\n return errors.length >= totalRoutes ? \"error\" : \"warn\";\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/workflows\n * Workflow SSE streaming endpoint.\n *\n * All CRUD operations (list runs, get run, cancel, run workflow) are handled\n * by the workflow plugin via plugin routes (/plugins/workflow/...).\n * This file only provides the SSE event stream which requires a long-lived\n * connection that cannot go through the plugin execution backend.\n */\n\nimport type { FastifyInstance } from 'fastify'\nimport type { RestApiConfig } from '@kb-labs/rest-api-core'\nimport { WORKFLOW_REDIS_CHANNEL } from '@kb-labs/workflow-constants'\nimport { platform } from '@kb-labs/core-runtime'\nimport { normalizeBasePath } from './path-helpers'\n\ninterface HttpError extends Error {\n statusCode: number;\n code: string;\n}\n\nconst TERMINAL_EVENT_TYPES = ['run.finished', 'run.failed', 'run.cancelled']\nconst KEEP_ALIVE_MS = 30_000\nconst IDLE_TIMEOUT_MS = 60_000\nconst EVENT_BUS_KEY = `eventbus:${WORKFLOW_REDIS_CHANNEL}`\n\n/**\n * Replay past events for a runId from the Redis sorted set.\n * Returns true if a terminal event was found (run already finished).\n */\nasync function replayHistory(\n runId: string,\n sendEvent: (type: string, payload: unknown, timestamp?: string) => void,\n): Promise<boolean> {\n let hasTerminal = false\n try {\n const cache = platform.cache\n if (!cache?.zrangebyscore) {return false}\n\n const stored = await cache.zrangebyscore(EVENT_BUS_KEY, 0, Date.now())\n for (const raw of stored) {\n try {\n const wrapper = JSON.parse(raw) as { data: { type: string; runId: string; payload?: unknown; timestamp?: string } }\n const event = wrapper.data\n if (event.runId !== runId) {continue}\n sendEvent(event.type, event.payload, event.timestamp)\n if (TERMINAL_EVENT_TYPES.includes(event.type)) {\n hasTerminal = true\n }\n } catch { /* skip malformed entries */ }\n }\n } catch { /* cache unavailable — skip replay */ }\n return hasTerminal\n}\n\nexport async function registerWorkflowRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath)\n\n // SSE stream of workflow run events via shared IEventBus.\n // No local engine needed — events arrive through the distributed event bus\n // (state broker / Redis / Kafka). The daemon publishes, we subscribe.\n server.route({\n method: 'GET',\n url: `${basePath}/workflows/runs/:runId/events`,\n handler: async (request, reply) => {\n const runId = getRunId(request.params)\n\n // SSE response — hijack from Fastify\n reply.hijack()\n const raw = reply.raw\n\n const origin = request.headers.origin\n if (typeof origin === 'string' && (origin === 'http://localhost:3000' || origin === 'http://localhost:5173')) {\n raw.setHeader('Access-Control-Allow-Origin', origin)\n raw.setHeader('Access-Control-Allow-Credentials', 'true')\n }\n raw.setHeader('Content-Type', 'text/event-stream')\n raw.setHeader('Cache-Control', 'no-cache, no-transform')\n raw.setHeader('Connection', 'keep-alive')\n raw.flushHeaders?.()\n raw.write(': connected\\n\\n')\n\n const sentIds = new Set<string>()\n\n const sendEvent = (type: string, payload: unknown, timestamp?: string) => {\n if (raw.writableEnded) {return}\n const data = { type, runId, payload, timestamp: timestamp ?? new Date().toISOString() }\n // Dedup by type+timestamp to avoid replaying events that also arrive live\n const dedup = `${type}:${data.timestamp}`\n if (sentIds.has(dedup)) {return}\n sentIds.add(dedup)\n raw.write(`event: workflow.event\\n`)\n raw.write(`data: ${JSON.stringify(data)}\\n\\n`)\n }\n\n // Replay history — send past events for this run\n const alreadyFinished = await replayHistory(runId, sendEvent)\n if (alreadyFinished) {\n raw.end()\n return\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null\n\n const resetIdle = () => {\n if (idleTimer) {clearTimeout(idleTimer)}\n idleTimer = setTimeout(() => {\n cleanup()\n }, IDLE_TIMEOUT_MS)\n }\n\n const keepAliveTimer = setInterval(() => {\n if (raw.writableEnded) {return}\n raw.write(': keep-alive\\n\\n')\n }, KEEP_ALIVE_MS)\n\n const unsubscribe = platform.eventBus.subscribe(WORKFLOW_REDIS_CHANNEL, async (rawEvent: unknown) => {\n const event = rawEvent as { type: string; runId: string; payload?: unknown; timestamp?: string }\n if (event.runId !== runId) {return}\n sendEvent(event.type, event.payload, event.timestamp)\n resetIdle()\n if (TERMINAL_EVENT_TYPES.includes(event.type)) {\n cleanup()\n }\n })\n\n const cleanup = () => {\n unsubscribe()\n if (idleTimer) {clearTimeout(idleTimer)}\n clearInterval(keepAliveTimer)\n if (!raw.writableEnded) {\n raw.write(`event: workflow.done\\ndata: {}\\n\\n`)\n raw.end()\n }\n }\n\n resetIdle()\n request.raw.on('close', cleanup)\n },\n })\n\n // SSE stream of workflow run logs via shared IEventBus.\n // Sends all events for a run as `workflow.log` entries with jobId/stepId context.\n server.route({\n method: 'GET',\n url: `${basePath}/workflows/runs/:runId/logs`,\n handler: async (request, reply) => {\n const runId = getRunId(request.params)\n const query = request.query as { idleTimeoutMs?: string }\n const idleTimeout = query.idleTimeoutMs ? parseInt(query.idleTimeoutMs, 10) : IDLE_TIMEOUT_MS\n\n reply.hijack()\n const raw = reply.raw\n\n const origin = request.headers.origin\n if (typeof origin === 'string' && (origin === 'http://localhost:3000' || origin === 'http://localhost:5173')) {\n raw.setHeader('Access-Control-Allow-Origin', origin)\n raw.setHeader('Access-Control-Allow-Credentials', 'true')\n }\n raw.setHeader('Content-Type', 'text/event-stream')\n raw.setHeader('Cache-Control', 'no-cache, no-transform')\n raw.setHeader('Connection', 'keep-alive')\n raw.flushHeaders?.()\n raw.write(': connected\\n\\n')\n\n const sentLogIds = new Set<string>()\n\n const sendLog = (event: { type: string; runId: string; jobId?: string; stepId?: string; payload?: unknown; timestamp?: string }) => {\n if (raw.writableEnded) {return}\n const ts = event.timestamp ?? new Date().toISOString()\n const dedup = `${event.type}:${event.jobId ?? ''}:${event.stepId ?? ''}:${ts}`\n if (sentLogIds.has(dedup)) {return}\n sentLogIds.add(dedup)\n raw.write(`event: workflow.log\\n`)\n raw.write(`data: ${JSON.stringify({\n type: event.type,\n runId: event.runId,\n jobId: event.jobId,\n stepId: event.stepId,\n payload: event.payload,\n timestamp: ts,\n })}\\n\\n`)\n }\n\n // Replay history for logs\n let logsAlreadyFinished = false\n try {\n const cache = platform.cache\n if (cache?.zrangebyscore) {\n const stored = await cache.zrangebyscore(EVENT_BUS_KEY, 0, Date.now())\n for (const rawStr of stored) {\n try {\n const wrapper = JSON.parse(rawStr) as { data: { type: string; runId: string; jobId?: string; stepId?: string; payload?: unknown; timestamp?: string } }\n const ev = wrapper.data\n if (ev.runId !== runId) {continue}\n sendLog(ev)\n if (TERMINAL_EVENT_TYPES.includes(ev.type)) {logsAlreadyFinished = true}\n } catch { /* skip */ }\n }\n }\n } catch { /* cache unavailable */ }\n\n if (logsAlreadyFinished) {\n raw.write(`event: workflow.done\\ndata: {}\\n\\n`)\n raw.end()\n return\n }\n\n let idleTimer: ReturnType<typeof setTimeout> | null = null\n\n const resetIdle = () => {\n if (idleTimer) {clearTimeout(idleTimer)}\n idleTimer = setTimeout(() => {\n cleanup()\n }, idleTimeout)\n }\n\n const keepAliveTimer = setInterval(() => {\n if (raw.writableEnded) {return}\n raw.write(': keep-alive\\n\\n')\n }, KEEP_ALIVE_MS)\n\n const unsubscribe = platform.eventBus.subscribe(WORKFLOW_REDIS_CHANNEL, async (rawEvent: unknown) => {\n const event = rawEvent as { type: string; runId: string; jobId?: string; stepId?: string; payload?: unknown; timestamp?: string }\n if (event.runId !== runId) {return}\n sendLog(event)\n resetIdle()\n if (TERMINAL_EVENT_TYPES.includes(event.type)) {\n cleanup()\n }\n })\n\n const cleanup = () => {\n unsubscribe()\n if (idleTimer) {clearTimeout(idleTimer)}\n clearInterval(keepAliveTimer)\n if (!raw.writableEnded) {\n raw.write(`event: workflow.done\\ndata: {}\\n\\n`)\n raw.end()\n }\n }\n\n resetIdle()\n request.raw.on('close', cleanup)\n },\n })\n}\n\nfunction getRunId(params: unknown): string {\n const runId = (params as { runId?: unknown } | undefined)?.runId\n if (!runId || typeof runId !== 'string') {\n const error = new Error('runId must be provided') as HttpError\n error.statusCode = 400\n error.code = 'WF_RUN_ID_REQUIRED'\n throw error\n }\n return runId\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/jobs\n * Scheduled jobs management endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { ZodTypeProvider } from 'fastify-type-provider-zod';\nimport { serializerCompiler, validatorCompiler } from 'fastify-type-provider-zod';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { ICronManager } from '@kb-labs/core-platform';\nimport { z } from 'zod';\nimport type { z as ZodType } from 'zod';\nimport {\n ListJobsQuerySchema,\n JobSchema,\n JobsListResponseSchema,\n JobResponseSchema,\n JobStatsResponseSchema,\n JobActionResponseSchema,\n ErrorResponseSchema,\n} from '@kb-labs/rest-api-contracts';\nimport { normalizeBasePath } from './path-helpers';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\ninterface HttpError extends Error {\n statusCode: number;\n code: string;\n}\n\nfunction createError(statusCode: number, code: string, message: string): HttpError {\n const error = new Error(message) as HttpError;\n error.statusCode = statusCode;\n error.code = code;\n return error;\n}\n\nfunction getJobId(params: unknown): string {\n const id = (params as { id?: unknown } | undefined)?.id;\n if (!id || typeof id !== 'string') {\n throw createError(400, 'JOB_ID_REQUIRED', 'Job id must be provided');\n }\n return id;\n}\n\n// ============================================================================\n// Route Registration\n// ============================================================================\n\nexport async function registerJobsRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n cronManager: ICronManager | null,\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n // Encapsulate Zod compilers so they don't leak to other scopes (plugin routes use plain JSON schemas)\n await server.register(async (scope) => {\n scope.setValidatorCompiler(validatorCompiler);\n scope.setSerializerCompiler(serializerCompiler);\n const s = scope.withTypeProvider<ZodTypeProvider>();\n\n /**\n * GET /api/v1/jobs\n * List all scheduled jobs\n */\n s.route({\n method: 'GET',\n url: `${basePath}/jobs`,\n schema: {\n tags: ['Jobs'],\n summary: 'List scheduled jobs',\n querystring: ListJobsQuerySchema,\n response: {\n 200: JobsListResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n let jobs = cronManager.list();\n\n const query = request.query as { status?: string };\n if (query.status) {\n jobs = jobs.filter((job) => job.status === query.status);\n }\n\n return reply.send({ jobs: jobs as unknown as ZodType.infer<typeof JobSchema>[] });\n },\n });\n\n /**\n * GET /api/v1/jobs/stats\n * Get cron jobs statistics (must be before /:id to avoid route conflict)\n */\n s.route({\n method: 'GET',\n url: `${basePath}/jobs/stats`,\n schema: {\n tags: ['Jobs'],\n summary: 'Get cron jobs statistics',\n response: {\n 200: JobStatsResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobs = cronManager.list();\n return reply.send({ stats: { total: jobs.length, jobs: jobs as unknown as ZodType.infer<typeof JobSchema>[] } });\n },\n });\n\n /**\n * GET /api/v1/jobs/:id\n * Get job details\n */\n s.route({\n method: 'GET',\n url: `${basePath}/jobs/:id`,\n schema: {\n tags: ['Jobs'],\n summary: 'Get job details',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n const jobs = cronManager.list();\n const job = jobs.find((j) => j.id === jobId);\n\n if (!job) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n\n return reply.send({ job: job as unknown as ZodType.infer<typeof JobSchema> });\n },\n });\n\n /**\n * POST /api/v1/jobs/:id/trigger\n * Trigger job execution immediately\n */\n s.route({\n method: 'POST',\n url: `${basePath}/jobs/:id/trigger`,\n schema: {\n tags: ['Jobs'],\n summary: 'Trigger job execution immediately',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobActionResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n\n try {\n await cronManager.trigger(jobId);\n return reply.send({ success: true as const, message: `Job ${jobId} triggered successfully` });\n } catch (error) {\n if (error instanceof Error && error.message.includes('not found')) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n throw error;\n }\n },\n });\n\n /**\n * POST /api/v1/jobs/:id/pause\n * Pause job execution\n */\n s.route({\n method: 'POST',\n url: `${basePath}/jobs/:id/pause`,\n schema: {\n tags: ['Jobs'],\n summary: 'Pause job execution',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobActionResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n const jobs = cronManager.list();\n const job = jobs.find((j) => j.id === jobId);\n if (!job) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n\n cronManager.pause(jobId);\n return reply.send({ success: true as const, message: `Job ${jobId} paused successfully` });\n },\n });\n\n /**\n * POST /api/v1/jobs/:id/resume\n * Resume paused job\n */\n s.route({\n method: 'POST',\n url: `${basePath}/jobs/:id/resume`,\n schema: {\n tags: ['Jobs'],\n summary: 'Resume paused job',\n params: z.object({ id: z.string() }),\n response: {\n 200: JobActionResponseSchema,\n 404: ErrorResponseSchema,\n 503: ErrorResponseSchema,\n },\n },\n handler: async (request, reply) => {\n if (!cronManager) {\n throw createError(503, 'CRON_UNAVAILABLE', 'Cron manager not available');\n }\n\n const jobId = (request.params as { id: string }).id;\n const jobs = cronManager.list();\n const job = jobs.find((j) => j.id === jobId);\n if (!job) {\n throw createError(404, 'JOB_NOT_FOUND', `Job ${jobId} not found`);\n }\n\n cronManager.resume(jobId);\n return reply.send({ success: true as const, message: `Job ${jobId} resumed successfully` });\n },\n });\n\n }); // end encapsulated scope\n}\n","import { platform } from '@kb-labs/core-runtime';\n/**\n * @module @kb-labs/rest-api-app/routes/cache\n * Cache management routes\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { normalizeBasePath } from './path-helpers';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n/**\n * Register cache management routes\n */\nexport async function registerCacheRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n registry: IEntityRegistry\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n /**\n * POST /api/v1/cache/invalidate\n * Force cache invalidation and registry refresh\n */\n server.post(`${basePath}/cache/invalidate`, async (request, reply) => {\n const start = Date.now();\n\n try {\n // Capture current state\n const beforeSnapshot = registry.snapshot();\n const previousRev = beforeSnapshot.rev;\n\n platform.logger.info('Manual cache invalidation requested', {\n requestId: request.id,\n previousRev,\n });\n // Force cache invalidation and refresh discovery\n // This will trigger re-discovery and clear stale cache\n await restDomainOperationMetrics.observeOperation('cache.invalidate', async () => {\n await registry.refresh();\n });\n\n // Get new state\n const afterSnapshot = await restDomainOperationMetrics.observeOperation('plugin.registry.snapshot', async () =>\n registry.snapshot(),\n );\n const plugins = await restDomainOperationMetrics.observeOperation('plugin.registry.list', async () =>\n registry.listPlugins(),\n );\n\n const elapsed = Date.now() - start;\n\n platform.logger.info('Cache invalidated successfully', {\n requestId: request.id,\n previousRev,\n newRev: afterSnapshot.rev,\n pluginsDiscovered: plugins.length,\n elapsedMs: elapsed,\n });\n\n return reply.code(200).send({\n ok: true,\n data: {\n invalidated: true,\n timestamp: new Date().toISOString(),\n previousRev,\n newRev: afterSnapshot.rev,\n pluginsDiscovered: plugins.length,\n },\n meta: {\n requestId: request.id,\n durationMs: elapsed,\n apiVersion: '1.0.0',\n },\n });\n } catch (error) {\n const elapsed = Date.now() - start;\n\n platform.logger.error(\n 'Cache invalidation failed',\n error instanceof Error ? error : new Error(String(error)),\n {\n requestId: request.id as string,\n elapsedMs: elapsed,\n }\n );\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'CACHE_INVALIDATION_FAILED',\n message: error instanceof Error ? error.message : 'Cache invalidation failed',\n },\n meta: {\n requestId: request.id,\n durationMs: elapsed,\n apiVersion: '1.0.0',\n },\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/observability\n * Observability endpoints for monitoring system internals\n */\n\nimport type { FastifyInstance, FastifyReply } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { PlatformServices } from '@kb-labs/plugin-contracts';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { hostname } from 'node:os';\nimport type { HistoricalMetricsCollector } from '../daemon/metrics';\nimport type { SystemMetrics } from '../daemon/metrics';\nimport { metricsCollector } from '../middleware/metrics.js';\n\n\n/**\n * Register observability routes\n *\n * These are system-level observability endpoints that expose internal metrics\n * and health information about platform components (State Broker, DevKit, etc.)\n */\nexport async function registerObservabilityRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n historicalMetrics?: HistoricalMetricsCollector,\n platform?: PlatformServices\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const stateBrokerPaths = resolvePaths(basePath, '/observability/state-broker');\n const systemMetricsPaths = resolvePaths(basePath, '/observability/system-metrics');\n const metricsHistoryPaths = resolvePaths(basePath, '/observability/metrics/history');\n const metricsHeatmapPaths = resolvePaths(basePath, '/observability/metrics/heatmap');\n const insightsChatPaths = resolvePaths(basePath, '/observability/insights/chat');\n\n // GET /api/v1/observability/state-broker\n // Returns statistics from State Broker daemon (cache hits, namespaces, etc.)\n for (const path of stateBrokerPaths) {\n fastify.get(path, { schema: { tags: ['Observability'], summary: 'State Broker statistics' } }, async (_request, reply) => {\n try {\n const stateBrokerUrl = process.env.KB_STATE_DAEMON_URL || 'http://localhost:7777';\n\n fastify.log.debug({ url: stateBrokerUrl }, 'Fetching State Broker stats');\n\n const response = await fetch(`${stateBrokerUrl}/stats`, {\n signal: AbortSignal.timeout(5000), // 5s timeout\n });\n\n if (!response.ok) {\n fastify.log.warn({\n status: response.status,\n url: stateBrokerUrl,\n }, 'State Broker responded with error');\n\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'STATE_BROKER_UNAVAILABLE',\n message: 'State Broker daemon is not available',\n details: {\n url: stateBrokerUrl,\n status: response.status,\n },\n },\n });\n }\n\n const stats = await response.json() as Record<string, unknown>;\n\n fastify.log.debug({\n totalEntries: stats.totalEntries,\n hitRate: stats.hitRate,\n }, 'State Broker stats retrieved successfully');\n\n return {\n ok: true,\n data: stats,\n meta: {\n source: 'state-broker',\n daemonUrl: stateBrokerUrl,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to fetch State Broker stats', error instanceof Error ? error : new Error(String(error)));\n\n // Check if it's a timeout error\n const isTimeout = error instanceof Error && error.name === 'AbortError';\n\n return reply.code(503).send({\n ok: false,\n error: {\n code: isTimeout ? 'STATE_BROKER_TIMEOUT' : 'STATE_BROKER_ERROR',\n message: isTimeout\n ? 'State Broker daemon did not respond in time'\n : error instanceof Error ? error.message : String(error),\n details: {\n isTimeout,\n },\n },\n });\n }\n });\n }\n\n\n // GET /api/v1/observability/system-metrics\n // Returns system resource metrics (CPU, memory, uptime, load) from all REST API instances\n for (const path of systemMetricsPaths) {\n fastify.get(path, { schema: { tags: ['Observability'], summary: 'System resource metrics' } }, async (_request, reply) => {\n try {\n if (!platform?.cache) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'PLATFORM_CACHE_UNAVAILABLE',\n message: 'Platform cache is not available',\n },\n });\n }\n\n fastify.log.debug('Fetching system metrics from all instances');\n\n // Get all system-metrics:* keys from platform.cache\n const allMetrics: SystemMetrics[] = [];\n\n // Try to scan for all system-metrics keys\n // Note: platform.cache may not have scan(), so we'll handle both cases\n try {\n // Try to use scan if available (Redis adapter)\n const cacheWithScan = platform.cache as { scan?: (pattern: string) => Promise<string[]> };\n if ('scan' in platform.cache && typeof cacheWithScan.scan === 'function') {\n const keys = await cacheWithScan.scan('system-metrics:*');\n\n for (const key of keys) {\n const metrics = await platform.cache.get<SystemMetrics>(key);\n if (metrics) {\n allMetrics.push(metrics);\n }\n }\n } else {\n // Fallback: InMemory adapter doesn't have scan, but we can try common instance IDs\n // This is a limitation - we won't see all instances unless we track them separately\n // For now, we'll just try to get the current instance's metrics\n const currentInstanceId = hostname();\n const metrics = await platform.cache.get<SystemMetrics>(`system-metrics:${currentInstanceId}`);\n\n if (metrics) {\n allMetrics.push(metrics);\n }\n\n fastify.log.debug('Platform cache does not support scan(), showing current instance only');\n }\n } catch (scanError) {\n fastify.log.warn({ err: scanError }, 'Failed to scan platform.cache for system metrics');\n\n // Fallback: try current instance\n const currentInstanceId = hostname();\n const metrics = await platform.cache.get<SystemMetrics>(`system-metrics:${currentInstanceId}`);\n\n if (metrics) {\n allMetrics.push(metrics);\n }\n }\n\n if (allMetrics.length === 0) {\n return reply.code(404).send({\n ok: false,\n error: {\n code: 'NO_METRICS_FOUND',\n message: 'No system metrics found. Metrics collector may not be running.',\n },\n });\n }\n\n // Sort by timestamp (newest first)\n allMetrics.sort((a, b) => b.timestamp - a.timestamp);\n\n // Calculate aggregated metrics\n const now = Date.now();\n const avgCpu = allMetrics.reduce((sum, m) => sum + m.cpu.percentage, 0) / allMetrics.length;\n const avgMemory = allMetrics.reduce((sum, m) => sum + m.memory.rssPercentage, 0) / allMetrics.length;\n const avgHeap = allMetrics.reduce((sum, m) => sum + m.memory.heapPercentage, 0) / allMetrics.length;\n\n // Categorize instances by health status based on age\n const activeInstances = allMetrics.filter(m => (now - m.timestamp) < 30000); // Active if updated in last 30s\n const staleInstances = allMetrics.filter(m => (now - m.timestamp) >= 30000 && (now - m.timestamp) < 60000); // Stale if 30-60s old\n const deadInstances = allMetrics.filter(m => (now - m.timestamp) >= 60000); // Dead if >60s old\n\n fastify.log.debug({\n totalInstances: allMetrics.length,\n activeInstances: activeInstances.length,\n staleInstances: staleInstances.length,\n deadInstances: deadInstances.length,\n }, 'System metrics retrieved');\n\n return {\n ok: true,\n data: {\n instances: allMetrics,\n summary: {\n totalInstances: allMetrics.length,\n activeInstances: activeInstances.length,\n staleInstances: staleInstances.length,\n deadInstances: deadInstances.length,\n avgCpu: parseFloat(avgCpu.toFixed(2)),\n avgMemory: parseFloat(avgMemory.toFixed(2)),\n avgHeap: parseFloat(avgHeap.toFixed(2)),\n },\n },\n meta: {\n source: 'platform-cache',\n timestamp: now,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to fetch system metrics', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'SYSTEM_METRICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch system metrics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/observability/metrics/history\n // Returns historical time-series metrics data\n for (const path of metricsHistoryPaths) {\n fastify.get(path, {\n schema: {\n tags: ['Observability'],\n summary: 'Historical time-series metrics',\n querystring: {\n type: 'object',\n properties: {\n metric: {\n type: 'string',\n enum: ['requests', 'errors', 'latency', 'uptime'],\n },\n range: {\n type: 'string',\n enum: ['1m', '5m', '10m', '30m', '1h'],\n },\n interval: {\n type: 'string',\n enum: ['5s', '1m', '5m'],\n },\n },\n required: ['metric', 'range'],\n },\n response: {\n 200: {\n type: 'object',\n properties: {\n ok: { type: 'boolean' },\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n timestamp: { type: 'number' },\n value: { type: 'number' },\n },\n },\n },\n meta: {\n type: 'object',\n properties: {\n source: { type: 'string' },\n metric: { type: 'string' },\n range: { type: 'string' },\n interval: { type: 'string' },\n points: { type: 'number' },\n },\n },\n },\n },\n },\n },\n }, async (request, reply: FastifyReply) => {\n if (!historicalMetrics) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'HISTORICAL_METRICS_UNAVAILABLE',\n message: 'Historical metrics collector is not initialized',\n },\n });\n }\n\n const query = request.query as {\n metric: 'requests' | 'errors' | 'latency' | 'uptime';\n range: '1m' | '5m' | '10m' | '30m' | '1h';\n interval?: '5s' | '1m' | '5m';\n };\n\n try {\n fastify.log.debug({ query }, 'Querying historical metrics');\n\n const data = await historicalMetrics.queryHistory({\n metric: query.metric,\n range: query.range,\n interval: query.interval,\n });\n\n fastify.log.debug({\n metric: query.metric,\n range: query.range,\n points: data.length,\n }, 'Historical metrics retrieved');\n\n return {\n ok: true,\n data,\n meta: {\n source: 'historical-metrics-collector',\n metric: query.metric,\n range: query.range,\n interval: query.interval ?? '5s',\n points: data.length,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to query historical metrics', error instanceof Error ? error : new Error(String(error)), { query });\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'HISTORICAL_METRICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to query historical metrics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/observability/metrics/heatmap\n // Returns heatmap aggregated data (7 days × 24 hours)\n for (const path of metricsHeatmapPaths) {\n fastify.get(path, {\n schema: {\n tags: ['Observability'],\n summary: 'Metrics heatmap data',\n querystring: {\n type: 'object',\n properties: {\n metric: {\n type: 'string',\n enum: ['latency', 'errors', 'requests'],\n },\n days: {\n type: 'integer',\n enum: [7, 14, 30],\n },\n },\n required: ['metric'],\n },\n response: {\n 200: {\n type: 'object',\n properties: {\n ok: { type: 'boolean' },\n data: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n day: { type: 'string' },\n hour: { type: 'number' },\n value: { type: 'number' },\n },\n },\n },\n meta: {\n type: 'object',\n properties: {\n source: { type: 'string' },\n metric: { type: 'string' },\n days: { type: 'number' },\n cells: { type: 'number' },\n },\n },\n },\n },\n },\n },\n }, async (request, reply: FastifyReply) => {\n if (!historicalMetrics) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'HISTORICAL_METRICS_UNAVAILABLE',\n message: 'Historical metrics collector is not initialized',\n },\n });\n }\n\n const query = request.query as {\n metric: 'latency' | 'errors' | 'requests';\n days?: 7 | 14 | 30;\n };\n\n try {\n fastify.log.debug({ query }, 'Querying heatmap data');\n\n const data = await historicalMetrics.queryHeatmap({\n metric: query.metric,\n days: query.days ?? 7,\n });\n\n fastify.log.debug({\n metric: query.metric,\n cells: data.length,\n }, 'Heatmap data retrieved');\n\n return {\n ok: true,\n data,\n meta: {\n source: 'historical-metrics-collector',\n metric: query.metric,\n days: query.days ?? 7,\n cells: data.length,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to query heatmap data', error instanceof Error ? error : new Error(String(error)), { query });\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'HEATMAP_ERROR',\n message: error instanceof Error ? error.message : 'Failed to query heatmap data',\n },\n });\n }\n });\n }\n\n // POST /api/v1/observability/insights/chat\n // AI-powered insights chat using LLM with system metrics as context\n for (const path of insightsChatPaths) {\n fastify.post(path, {\n schema: {\n tags: ['Observability'],\n summary: 'AI-powered observability insights chat',\n body: {\n type: 'object',\n properties: {\n question: { type: 'string', minLength: 1 },\n context: {\n type: 'object',\n properties: {\n includeMetrics: { type: 'boolean' },\n includeHistory: { type: 'boolean' },\n timeRange: { type: 'string', enum: ['1h', '6h', '24h', '7d'] },\n plugins: { type: 'array', items: { type: 'string' } },\n },\n },\n },\n required: ['question'],\n },\n },\n }, async (request, reply) => {\n if (!platform?.llm) {\n return reply.code(503).send({\n ok: false,\n error: {\n code: 'LLM_UNAVAILABLE',\n message: 'LLM adapter is not configured. AI Insights requires an LLM adapter.',\n },\n });\n }\n\n try {\n const body = request.body as {\n question: string;\n context?: {\n includeMetrics?: boolean;\n includeIncidents?: boolean;\n includeHistory?: boolean;\n timeRange?: '1h' | '6h' | '24h' | '7d';\n plugins?: string[];\n };\n };\n\n const contextConfig = {\n includeMetrics: body.context?.includeMetrics ?? true,\n includeHistory: body.context?.includeHistory ?? true,\n timeRange: body.context?.timeRange ?? '24h',\n plugins: body.context?.plugins ?? [],\n };\n\n // Build context from real data\n let contextText = '';\n\n // Fetch current metrics\n if (contextConfig.includeMetrics) {\n try {\n const metrics = metricsCollector.getMetrics();\n\n const errorRate = metrics.requests.total\n ? (((metrics.requests.clientErrors ?? 0) + (metrics.requests.serverErrors ?? 0)) / metrics.requests.total * 100)\n : 0;\n\n contextText += `\\n## Current System Metrics\\n`;\n contextText += `- Total requests: ${metrics.requests.total}\\n`;\n contextText += `- Active requests: ${metrics.requests.active}\\n`;\n contextText += `- Error rate: ${errorRate.toFixed(2)}%\\n`;\n contextText += `- Average latency: ${metrics.latency.average.toFixed(0)}ms\\n`;\n contextText += `- Max latency: ${metrics.latency.max.toFixed(0)}ms\\n`;\n\n if (metrics.perPlugin.length > 0) {\n contextText += `\\n### Per-Plugin Metrics\\n`;\n const pluginsToShow = contextConfig.plugins.length > 0\n ? metrics.perPlugin.filter(plugin => plugin.pluginId && contextConfig.plugins.includes(plugin.pluginId))\n : metrics.perPlugin.slice(0, 10);\n\n for (const plugin of pluginsToShow) {\n const totalRequests = plugin.total ?? 0;\n const errorCount = Object.entries(plugin.statuses ?? {})\n .filter(([statusGroup]) => statusGroup.startsWith('4') || statusGroup.startsWith('5'))\n .reduce((sum, [, count]) => sum + count, 0);\n const pluginErrorRate = totalRequests > 0\n ? (errorCount / totalRequests * 100).toFixed(2)\n : '0.00';\n const avgLatency = totalRequests > 0 ? plugin.totalDuration / totalRequests : 0;\n contextText += `- ${plugin.pluginId ?? 'unknown'}: ${totalRequests} requests, ${pluginErrorRate}% errors, ${avgLatency.toFixed(0)}ms avg latency\\n`;\n }\n }\n } catch (metricsError) {\n fastify.log.warn({ err: metricsError }, 'Failed to build metrics context for insights');\n }\n }\n\n // Build prompt\n const prompt = `You are an AI assistant analyzing a software platform's observability data.\n\n${contextText}\n\nUser Question: ${body.question}\n\nProvide a clear, actionable response based on the data above. Include:\n1. Direct answer to the question\n2. Supporting evidence from the metrics/incidents\n3. Recommendations if applicable\n\nBe concise but thorough. Use markdown formatting.`;\n\n fastify.log.debug({ question: body.question, contextLength: contextText.length }, 'Calling LLM for insights');\n\n const result = await platform.llm.complete(prompt, {\n systemPrompt: 'You are a DevOps and SRE expert assistant. Analyze system metrics and provide actionable insights. Be concise, technical, and helpful.',\n temperature: 0.7,\n maxTokens: 1000,\n });\n\n const totalTokens = result.usage.promptTokens + result.usage.completionTokens;\n\n fastify.log.debug({ tokensUsed: totalTokens }, 'LLM response received for insights');\n\n // Track analytics\n if (platform.analytics) {\n platform.analytics.track('ai_insights.chat', {\n questionLength: body.question.length,\n contextIncluded: Object.keys(contextConfig).filter(k => (contextConfig as Record<string, unknown>)[k]),\n timeRange: contextConfig.timeRange,\n pluginsFiltered: contextConfig.plugins.length,\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens,\n model: result.model,\n }).catch(() => {\n // Silently ignore analytics errors\n });\n }\n\n return {\n ok: true,\n data: {\n answer: result.content.trim(),\n context: Object.keys(contextConfig).filter(k => (contextConfig as Record<string, unknown>)[k]),\n usage: {\n promptTokens: result.usage.promptTokens,\n completionTokens: result.usage.completionTokens,\n totalTokens,\n },\n },\n meta: {\n source: 'llm-insights',\n model: result.model,\n },\n };\n } catch (error) {\n platform?.logger.error('Failed to generate insights', error instanceof Error ? error : new Error(String(error)));\n\n // Track error analytics\n if (platform?.analytics) {\n platform.analytics.track('ai_insights.error', {\n error: error instanceof Error ? error.message : 'Unknown error',\n questionLength: (request.body as { question?: string })?.question?.length ?? 0,\n }).catch(() => {\n // Silently ignore analytics errors\n });\n }\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'INSIGHTS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to generate insights',\n },\n });\n }\n });\n }\n\n fastify.log.info('Observability routes registered');\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/analytics\n * Analytics endpoints for querying events, stats, and monitoring\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { platform } from '@kb-labs/core-runtime';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\nimport type {\n EventsQuery,\n EventsResponse,\n EventsStats,\n BufferStatus,\n DlqStatus,\n} from '@kb-labs/core-platform/adapters';\n\n/**\n * Register analytics routes\n *\n * These are system-level analytics endpoints that expose events and statistics\n * from the platform's analytics adapter (if configured).\n *\n * Returns 501 Not Implemented if analytics adapter doesn't support read methods.\n */\nexport async function registerAnalyticsRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n // GET /api/v1/analytics/events\n // Query analytics events with optional filters\n const eventsPaths = resolvePaths(basePath, '/analytics/events');\n for (const path of eventsPaths) {\n fastify.get<{\n Querystring: {\n type?: string | string[];\n source?: string;\n actor?: string;\n from?: string;\n to?: string;\n limit?: string;\n offset?: string;\n };\n }>(path, async (request, reply) => {\n try {\n const analytics = platform.analytics;\n\n // Check if analytics adapter supports read methods\n const getEvents = analytics.getEvents;\n if (!getEvents) {\n fastify.log.debug('Analytics adapter does not implement getEvents()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n // Build query from request params\n const query: EventsQuery = {};\n\n if (request.query.type !== undefined) {\n query.type = request.query.type;\n }\n if (request.query.source) {\n query.source = request.query.source;\n }\n if (request.query.actor) {\n query.actor = request.query.actor;\n }\n if (request.query.from) {\n query.from = request.query.from;\n }\n if (request.query.to) {\n query.to = request.query.to;\n }\n if (request.query.limit) {\n query.limit = Number.parseInt(request.query.limit, 10);\n }\n if (request.query.offset) {\n query.offset = Number.parseInt(request.query.offset, 10);\n }\n\n fastify.log.debug({ query }, 'Fetching analytics events');\n\n const response: EventsResponse = await restDomainOperationMetrics.observeOperation(\n 'analytics.events.query',\n () => getEvents.call(analytics, query),\n );\n\n fastify.log.debug(\n {\n total: response.total,\n count: response.events.length,\n hasMore: response.hasMore,\n },\n 'Analytics events fetched successfully'\n );\n\n return {\n ok: true,\n data: response,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics events', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch analytics events',\n },\n });\n }\n });\n }\n\n // GET /api/v1/analytics/stats\n // Get aggregated statistics\n const statsPaths = resolvePaths(basePath, '/analytics/stats');\n for (const path of statsPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const analytics = platform.analytics;\n\n const getStats = analytics.getStats;\n if (!getStats) {\n fastify.log.debug('Analytics adapter does not implement getStats()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading stats',\n },\n });\n }\n\n fastify.log.debug('Fetching analytics stats');\n\n // Cache stats for 60 seconds to avoid reprocessing 50k+ events on every request\n const cacheKey = 'analytics:stats';\n let stats = await platform.cache.get<EventsStats>(cacheKey);\n\n if (!stats) {\n fastify.log.debug('Cache miss, fetching stats from adapter');\n stats = await restDomainOperationMetrics.observeOperation('analytics.stats.get', () => getStats.call(analytics));\n await platform.cache.set(cacheKey, stats, 60 * 1000); // 60 second TTL\n } else {\n fastify.log.debug('Cache hit, returning cached stats');\n }\n\n fastify.log.debug(\n {\n totalEvents: stats.totalEvents,\n timeRange: stats.timeRange,\n },\n 'Analytics stats fetched successfully'\n );\n\n return {\n ok: true,\n data: stats,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics stats', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch analytics stats',\n },\n });\n }\n });\n }\n\n // GET /api/v1/analytics/buffer/status\n // Get WAL buffer status (if applicable)\n const bufferPaths = resolvePaths(basePath, '/analytics/buffer/status');\n for (const path of bufferPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const analytics = platform.analytics;\n\n const getBufferStatus = analytics.getBufferStatus;\n if (!getBufferStatus) {\n fastify.log.debug('Analytics adapter does not implement getBufferStatus()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support buffer status',\n },\n });\n }\n\n fastify.log.debug('Fetching analytics buffer status');\n\n const status: BufferStatus | null = await restDomainOperationMetrics.observeOperation(\n 'analytics.buffer.status',\n () => getBufferStatus.call(analytics),\n );\n\n if (status === null) {\n fastify.log.debug('Buffer status not applicable for current analytics backend');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'BUFFER_NOT_APPLICABLE',\n message: 'Buffer status not applicable for current analytics backend',\n },\n });\n }\n\n fastify.log.debug(\n {\n segments: status.segments,\n totalSizeBytes: status.totalSizeBytes,\n },\n 'Analytics buffer status fetched successfully'\n );\n\n return {\n ok: true,\n data: status,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics buffer status', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to fetch analytics buffer status',\n },\n });\n }\n });\n }\n\n // GET /api/v1/analytics/dlq/status\n // Get Dead-Letter Queue status (if applicable)\n const dlqPaths = resolvePaths(basePath, '/analytics/dlq/status');\n for (const path of dlqPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const analytics = platform.analytics;\n\n const getDlqStatus = analytics.getDlqStatus;\n if (!getDlqStatus) {\n fastify.log.debug('Analytics adapter does not implement getDlqStatus()');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support DLQ status',\n },\n });\n }\n\n fastify.log.debug('Fetching analytics DLQ status');\n\n const status: DlqStatus | null = await restDomainOperationMetrics.observeOperation(\n 'analytics.dlq.status',\n () => getDlqStatus.call(analytics),\n );\n\n if (status === null) {\n fastify.log.debug('DLQ status not applicable for current analytics backend');\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DLQ_NOT_APPLICABLE',\n message: 'DLQ status not applicable for current analytics backend',\n },\n });\n }\n\n fastify.log.debug(\n {\n failedEvents: status.failedEvents,\n oldestFailureTs: status.oldestFailureTs,\n },\n 'Analytics DLQ status fetched successfully'\n );\n\n return {\n ok: true,\n data: status,\n meta: {\n source: 'analytics-adapter',\n },\n };\n } catch (error) {\n platform.logger.error('Failed to fetch analytics DLQ status', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'ANALYTICS_ERROR',\n message:\n error instanceof Error ? error.message : 'Failed to fetch analytics DLQ status',\n },\n });\n }\n });\n }\n\n fastify.log.info('Analytics routes registered');\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/adapters\n * Platform adapter analytics endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { IAnalytics } from '@kb-labs/core-platform';\nimport type { AnalyticsEvent } from '@kb-labs/core-platform/adapters';\n\n/**\n * LLM usage statistics response\n */\ninterface LLMUsageStats {\n totalRequests: number;\n totalTokens: number;\n totalCost: number;\n costPer1KTokens: number; // Enhanced: Cost efficiency metric\n // Cache savings\n totalCacheReadTokens: number;\n totalBillableTokens: number;\n totalCacheSavingsUsd: number;\n byModel: Record<\n string,\n {\n requests: number;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n cost: number;\n costPer1KTokens: number; // Enhanced: Cost per 1K tokens for this model\n tokensPerRequest: number; // Enhanced: Average tokens per request\n errorRate: number; // Enhanced: Error rate percentage (0-100)\n avgDurationMs: number;\n // Enhanced: Latency percentiles\n p50DurationMs: number;\n p95DurationMs: number;\n p99DurationMs: number;\n // Cache savings per model\n cacheReadTokens: number;\n billableTokens: number;\n cacheSavingsUsd: number;\n }\n >;\n errors: number;\n // Enhanced: Error breakdown by type\n errorBreakdown: {\n timeout: number;\n rateLimit: number;\n invalidRequest: number;\n serverError: number;\n other: number;\n };\n timeRange: {\n from: string;\n to: string;\n };\n}\n\n/** Analytics event extended with legacy `properties` field */\ntype AnyAnalyticsEvent = AnalyticsEvent & { properties?: Record<string, unknown> };\n\n/**\n * Helper to get event data, supporting both kb.v1 (payload) and legacy (properties) formats\n */\nfunction getEventData(event: AnyAnalyticsEvent): Record<string, unknown> {\n // kb.v1 format uses 'payload'\n if (event.schema === 'kb.v1' && event.payload) {\n return event.payload as Record<string, unknown>;\n }\n // Legacy format uses 'properties'\n return event.properties ?? {};\n}\n\n/**\n * Extract date range from query parameters\n */\nfunction extractDateRange(query: unknown): { from?: string; to?: string } {\n // Handle null/undefined query\n if (!query || typeof query !== 'object') {\n return { from: undefined, to: undefined };\n }\n const q = query as Record<string, unknown>;\n\n const from = q.from as string | undefined;\n const to = q.to as string | undefined;\n\n // Validate ISO 8601 format\n if (from && !isValidISODate(from)) {\n throw new Error('Invalid \"from\" date format. Expected ISO 8601 datetime (e.g., 2026-01-01T00:00:00Z)');\n }\n if (to && !isValidISODate(to)) {\n throw new Error('Invalid \"to\" date format. Expected ISO 8601 datetime (e.g., 2026-01-31T23:59:59Z)');\n }\n\n return { from, to };\n}\n\n/**\n * Extract model filter from query parameters\n * Supports both single model (?models=gpt-4) and multiple (?models=gpt-4,claude-sonnet)\n */\nfunction extractModelFilter(query: unknown): string[] | undefined {\n if (!query || typeof query !== 'object') {\n return undefined;\n }\n const q = query as Record<string, unknown>;\n if (!q.models) {\n return undefined;\n }\n\n const modelsParam = q.models as string;\n\n // Split by comma and trim whitespace\n const models = modelsParam\n .split(',')\n .map((m) => m.trim())\n .filter((m) => m.length > 0);\n\n return models.length > 0 ? models : undefined;\n}\n\n/**\n * Extract StatsQuery fields (groupBy, breakdownBy, metrics) from query parameters.\n * These are optional — adapters silently ignore fields they don't support.\n */\nfunction extractStatsOptions(query: unknown): {\n groupBy?: 'hour' | 'day' | 'week' | 'month';\n breakdownBy?: string;\n metrics?: string[];\n} {\n if (!query || typeof query !== 'object') {return {};}\n const q = query as Record<string, unknown>;\n\n const groupBy = q.groupBy as string | undefined;\n const validGroupBy = ['hour', 'day', 'week', 'month'];\n const resolvedGroupBy =\n groupBy && validGroupBy.includes(groupBy)\n ? (groupBy as 'hour' | 'day' | 'week' | 'month')\n : undefined;\n\n const breakdownBy = q.breakdownBy as string | undefined;\n\n const metricsParam = q.metrics as string | undefined;\n const metrics = metricsParam\n ? metricsParam\n .split(',')\n .map((m) => m.trim())\n .filter((m) => m.length > 0)\n : undefined;\n\n return {\n groupBy: resolvedGroupBy,\n breakdownBy: breakdownBy || undefined,\n metrics: metrics && metrics.length > 0 ? metrics : undefined,\n };\n}\n\n/**\n * Fetch all events for a given query in batches to avoid memory issues.\n *\n * Backend handles pagination internally:\n * - PAGE_SIZE: 10,000 events per request\n * - MAX_EVENTS: 100,000 total events to process\n *\n * Frontend just sends date range, backend fetches all events in that range.\n *\n * @param analytics - Analytics adapter\n * @param query - Event query (type, from, to)\n * @param fastify - Fastify instance for logging\n * @returns All events (up to MAX_EVENTS)\n */\nasync function fetchAllEventsBatched(\n analytics: IAnalytics,\n query: { type: string | string[]; from?: string; to?: string },\n fastify: FastifyInstance\n): Promise<AnyAnalyticsEvent[]> {\n const PAGE_SIZE = 10000;\n const MAX_EVENTS = 100000;\n\n const allEvents: AnyAnalyticsEvent[] = [];\n let offset = 0;\n let hasMore = true;\n\n while (hasMore && allEvents.length < MAX_EVENTS) {\n const response = await analytics.getEvents!({\n ...query,\n limit: PAGE_SIZE,\n offset,\n });\n\n allEvents.push(...response.events);\n hasMore = response.hasMore;\n offset += PAGE_SIZE;\n\n // Stop if we've fetched all events or page not full\n if (!hasMore || response.events.length < PAGE_SIZE) {\n break;\n }\n }\n\n // Warn if we hit the safety limit\n if (allEvents.length >= MAX_EVENTS) {\n fastify.log.warn({ query }, `Hit max events limit (${MAX_EVENTS}) for query. Some events excluded from stats.`);\n }\n\n return allEvents;\n}\n\n/**\n * Basic ISO 8601 validation\n */\nfunction isValidISODate(dateString: string): boolean {\n // Check if it's a string\n if (typeof dateString !== 'string' || dateString.length === 0) {\n return false;\n }\n\n const date = new Date(dateString);\n return !isNaN(date.getTime());\n}\n\n/**\n * Register platform adapter analytics routes\n */\nexport async function registerAdaptersRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n\n // GET /api/v1/adapters/llm/usage\n // Returns aggregated LLM usage statistics\n const llmUsagePaths = resolvePaths(basePath, '/adapters/llm/usage');\n for (const path of llmUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n // Check if analytics supports reading\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n // Fetch ALL LLM completion events in batches (backend handles pagination)\n const completedEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['llm.completion.completed', 'llm.chatWithTools.completed'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n // Fetch ALL error events in batches\n const errorEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['llm.completion.error', 'llm.chatWithTools.error'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n // Aggregate statistics\n const stats: LLMUsageStats = {\n totalRequests: 0,\n totalTokens: 0,\n totalCost: 0,\n costPer1KTokens: 0,\n totalCacheReadTokens: 0,\n totalBillableTokens: 0,\n totalCacheSavingsUsd: 0,\n byModel: {},\n errors: errorEvents.length,\n errorBreakdown: {\n timeout: 0,\n rateLimit: 0,\n invalidRequest: 0,\n serverError: 0,\n other: 0,\n },\n timeRange: {\n from: '',\n to: '',\n },\n };\n\n // Collect durations per model for percentile calculation\n const durationsByModel: Record<string, number[]> = {};\n\n // Track errors per model\n const errorsByModel: Record<string, number> = {};\n\n // Process completed events\n for (const event of completedEvents) {\n const props = getEventData(event);\n\n const model = (props.model || 'unknown') as string;\n const promptTokens = Number(props.promptTokens || 0);\n const completionTokens = Number(props.completionTokens || 0);\n const totalTokens = Number(props.totalTokens || promptTokens + completionTokens);\n const estimatedCost = Number(props.estimatedCost || 0);\n const durationMs = Number(props.durationMs || 0);\n const cacheReadTokens = Number(props.cacheReadTokens || 0);\n const billableTokens = Number(props.billableTotalTokens || totalTokens);\n const cacheSavingsUsd = Number(props.estimatedCacheSavingsUsd || 0);\n\n stats.totalRequests++;\n stats.totalTokens += totalTokens;\n stats.totalCost += estimatedCost;\n stats.totalCacheReadTokens += cacheReadTokens;\n stats.totalBillableTokens += billableTokens;\n stats.totalCacheSavingsUsd += cacheSavingsUsd;\n\n if (!stats.byModel[model]) {\n stats.byModel[model] = {\n requests: 0,\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n cost: 0,\n costPer1KTokens: 0,\n tokensPerRequest: 0,\n errorRate: 0,\n avgDurationMs: 0,\n p50DurationMs: 0,\n p95DurationMs: 0,\n p99DurationMs: 0,\n cacheReadTokens: 0,\n billableTokens: 0,\n cacheSavingsUsd: 0,\n };\n durationsByModel[model] = [];\n }\n\n const modelStats = stats.byModel[model]!;\n modelStats.requests++;\n modelStats.promptTokens += promptTokens;\n modelStats.completionTokens += completionTokens;\n modelStats.totalTokens += totalTokens;\n modelStats.cost += estimatedCost;\n modelStats.cacheReadTokens += cacheReadTokens;\n modelStats.billableTokens += billableTokens;\n modelStats.cacheSavingsUsd += cacheSavingsUsd;\n modelStats.avgDurationMs =\n (modelStats.avgDurationMs * (modelStats.requests - 1) + durationMs) / modelStats.requests;\n\n // Collect duration for percentile calculation\n durationsByModel[model]!.push(durationMs);\n }\n\n // Process error events for breakdown\n for (const event of errorEvents) {\n const props = getEventData(event);\n const errorType = String(props.errorType || props.errorCode || '').toLowerCase();\n const errorMessage = String(props.error || props.message || '').toLowerCase();\n const model = (props.model || 'unknown') as string;\n\n // Track errors per model\n errorsByModel[model] = (errorsByModel[model] || 0) + 1;\n\n // Categorize error by type\n if (errorType.includes('timeout') || errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n stats.errorBreakdown.timeout++;\n } else if (errorType.includes('rate') || errorType.includes('quota') || errorMessage.includes('rate limit') || errorMessage.includes('quota exceeded')) {\n stats.errorBreakdown.rateLimit++;\n } else if (errorType.includes('invalid') || errorType.includes('validation') || errorMessage.includes('invalid request') || errorMessage.includes('bad request')) {\n stats.errorBreakdown.invalidRequest++;\n } else if (errorType.includes('server') || errorType.includes('5xx') || errorMessage.includes('internal error') || errorMessage.includes('server error')) {\n stats.errorBreakdown.serverError++;\n } else {\n stats.errorBreakdown.other++;\n }\n }\n\n // Calculate percentiles and cost per 1K tokens for each model\n for (const [model, durations] of Object.entries(durationsByModel)) {\n const modelStats = stats.byModel[model]!;\n\n // Calculate percentiles\n if (durations.length > 0) {\n const sorted = durations.slice().sort((a, b) => a - b);\n const p50Index = Math.floor(sorted.length * 0.5);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p99Index = Math.floor(sorted.length * 0.99);\n\n modelStats.p50DurationMs = sorted[p50Index] ?? 0;\n modelStats.p95DurationMs = sorted[p95Index] ?? 0;\n modelStats.p99DurationMs = sorted[p99Index] ?? 0;\n }\n\n // Calculate cost per 1K tokens\n if (modelStats.totalTokens > 0) {\n modelStats.costPer1KTokens = (modelStats.cost / modelStats.totalTokens) * 1000;\n }\n\n // Calculate tokens per request\n if (modelStats.requests > 0) {\n modelStats.tokensPerRequest = modelStats.totalTokens / modelStats.requests;\n }\n\n // Calculate error rate percentage\n const modelErrors = errorsByModel[model] || 0;\n const totalModelRequests = modelStats.requests + modelErrors;\n if (totalModelRequests > 0) {\n modelStats.errorRate = (modelErrors / totalModelRequests) * 100;\n }\n }\n\n // Calculate overall cost per 1K tokens\n if (stats.totalTokens > 0) {\n stats.costPer1KTokens = (stats.totalCost / stats.totalTokens) * 1000;\n }\n\n // Calculate time range\n const allTimestamps = completedEvents.map((e) => e.ts);\n if (allTimestamps.length > 0) {\n stats.timeRange.from = allTimestamps[allTimestamps.length - 1]!; // oldest\n stats.timeRange.to = allTimestamps[0]!; // newest\n }\n\n return {\n ok: true,\n data: stats,\n meta: {\n source: 'analytics-adapter',\n totalEvents: completedEvents.length,\n },\n };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch LLM usage stats', error instanceof Error ? error : new Error(String(error)));\n\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'LLM_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch LLM usage statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/llm/daily-stats\n // Returns time-bucketed aggregated LLM statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv), models (csv, legacy filter)\n const llmDailyStatsPaths = resolvePaths(basePath, '/adapters/llm/daily-stats');\n for (const path of llmDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n const modelFilter = extractModelFilter(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['llm.completion.completed', 'llm.chatWithTools.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n // Legacy ?models= filter maps to source filter via getEvents inside the adapter.\n // When breakdownBy is provided explicitly it takes precedence.\n // Models filter is handled post-aggregation below for backward compat.\n ...statsOptions,\n });\n\n // Legacy model filter: post-filter rows by breakdown value when models param is used\n // without an explicit breakdownBy (backward compatibility with existing Studio pages)\n const result =\n modelFilter && modelFilter.length > 0 && !statsOptions.breakdownBy\n ? dailyStats.filter((s) => !s.breakdown || modelFilter.includes(s.breakdown))\n : dailyStats;\n\n return reply.send({ ok: true, data: result });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/embeddings/daily-stats\n // Returns time-bucketed aggregated Embeddings statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const embeddingsDailyStatsPaths = resolvePaths(basePath, '/adapters/embeddings/daily-stats');\n for (const path of embeddingsDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['embeddings.embed.completed', 'embeddings.embedBatch.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/embeddings/usage\n // Returns aggregated Embeddings usage statistics\n const embeddingsUsagePaths = resolvePaths(basePath, '/adapters/embeddings/usage');\n for (const path of embeddingsUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const completedEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['embeddings.embed.completed', 'embeddings.embedBatch.completed'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const errorEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: ['embeddings.embed.error', 'embeddings.embedBatch.error'],\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const stats = {\n totalRequests: completedEvents.length,\n totalTextLength: 0,\n totalCost: 0,\n costPer1KChars: 0, // Enhanced: Cost efficiency metric\n errors: errorEvents.length,\n // Enhanced: Error breakdown by type\n errorBreakdown: {\n timeout: 0,\n rateLimit: 0,\n invalidRequest: 0,\n serverError: 0,\n other: 0,\n },\n avgDurationMs: 0,\n // Enhanced: Latency percentiles\n p50DurationMs: 0,\n p95DurationMs: 0,\n p99DurationMs: 0,\n batchRequests: 0,\n singleRequests: 0,\n avgBatchSize: 0,\n };\n\n let totalDuration = 0;\n let totalBatchSize = 0;\n const durations: number[] = [];\n\n for (const event of completedEvents) {\n const props = getEventData(event);\n\n const textLength = Number(props.textLength || props.totalTextLength || 0);\n const cost = Number(props.estimatedCost || 0);\n const duration = Number(props.durationMs || 0);\n const batchSize = Number(props.batchSize || 1);\n\n stats.totalTextLength += textLength;\n stats.totalCost += cost;\n totalDuration += duration;\n durations.push(duration);\n\n if (batchSize > 1) {\n stats.batchRequests++;\n totalBatchSize += batchSize;\n } else {\n stats.singleRequests++;\n }\n }\n\n stats.avgDurationMs = stats.totalRequests > 0 ? totalDuration / stats.totalRequests : 0;\n stats.avgBatchSize = stats.batchRequests > 0 ? totalBatchSize / stats.batchRequests : 0;\n\n // Calculate percentiles\n if (durations.length > 0) {\n const sorted = durations.slice().sort((a, b) => a - b);\n const p50Index = Math.floor(sorted.length * 0.5);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p99Index = Math.floor(sorted.length * 0.99);\n\n stats.p50DurationMs = sorted[p50Index] ?? 0;\n stats.p95DurationMs = sorted[p95Index] ?? 0;\n stats.p99DurationMs = sorted[p99Index] ?? 0;\n }\n\n // Calculate cost per 1K characters\n if (stats.totalTextLength > 0) {\n stats.costPer1KChars = (stats.totalCost / stats.totalTextLength) * 1000;\n }\n\n // Process error events for breakdown\n for (const event of errorEvents) {\n const props = getEventData(event);\n const errorType = String(props.errorType || props.errorCode || '').toLowerCase();\n const errorMessage = String(props.error || props.message || '').toLowerCase();\n\n // Categorize error by type\n if (errorType.includes('timeout') || errorMessage.includes('timeout') || errorMessage.includes('timed out')) {\n stats.errorBreakdown.timeout++;\n } else if (errorType.includes('rate') || errorType.includes('quota') || errorMessage.includes('rate limit') || errorMessage.includes('quota exceeded')) {\n stats.errorBreakdown.rateLimit++;\n } else if (errorType.includes('invalid') || errorType.includes('validation') || errorMessage.includes('invalid request') || errorMessage.includes('bad request')) {\n stats.errorBreakdown.invalidRequest++;\n } else if (errorType.includes('server') || errorType.includes('5xx') || errorMessage.includes('internal error') || errorMessage.includes('server error')) {\n stats.errorBreakdown.serverError++;\n } else {\n stats.errorBreakdown.other++;\n }\n }\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch Embeddings usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'EMBEDDINGS_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch embeddings statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/vectorstore/daily-stats\n // Returns time-bucketed aggregated VectorStore statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const vectorstoreDailyStatsPaths = resolvePaths(basePath, '/adapters/vectorstore/daily-stats');\n for (const path of vectorstoreDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['vectorstore.search.completed', 'vectorstore.upsert.completed', 'vectorstore.delete.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/vectorstore/usage\n // Returns aggregated VectorStore usage statistics\n const vectorstoreUsagePaths = resolvePaths(basePath, '/adapters/vectorstore/usage');\n for (const path of vectorstoreUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const searchEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'vectorstore.search.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const upsertEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'vectorstore.upsert.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const deleteEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'vectorstore.delete.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const stats = {\n searchQueries: searchEvents.length,\n upsertOperations: upsertEvents.length,\n deleteOperations: deleteEvents.length,\n avgSearchDuration: 0,\n // Enhanced: Search latency percentiles\n p50SearchDuration: 0,\n p95SearchDuration: 0,\n p99SearchDuration: 0,\n avgSearchScore: 0,\n avgResultsCount: 0,\n totalVectorsUpserted: 0,\n totalVectorsDeleted: 0,\n };\n\n let totalSearchDuration = 0;\n let totalSearchScore = 0;\n let totalResultsCount = 0;\n const searchDurations: number[] = [];\n\n for (const event of searchEvents) {\n const props = getEventData(event);\n\n const duration = Number(props.durationMs || 0);\n const avgScore = Number(props.avgScore || 0);\n const resultsCount = Number(props.resultsCount || 0);\n\n totalSearchDuration += duration;\n totalSearchScore += avgScore;\n totalResultsCount += resultsCount;\n searchDurations.push(duration);\n }\n\n stats.avgSearchDuration = stats.searchQueries > 0 ? totalSearchDuration / stats.searchQueries : 0;\n stats.avgSearchScore = stats.searchQueries > 0 ? totalSearchScore / stats.searchQueries : 0;\n stats.avgResultsCount = stats.searchQueries > 0 ? totalResultsCount / stats.searchQueries : 0;\n\n // Calculate search latency percentiles\n if (searchDurations.length > 0) {\n const sorted = searchDurations.slice().sort((a, b) => a - b);\n const p50Index = Math.floor(sorted.length * 0.5);\n const p95Index = Math.floor(sorted.length * 0.95);\n const p99Index = Math.floor(sorted.length * 0.99);\n\n stats.p50SearchDuration = sorted[p50Index] ?? 0;\n stats.p95SearchDuration = sorted[p95Index] ?? 0;\n stats.p99SearchDuration = sorted[p99Index] ?? 0;\n }\n\n for (const event of upsertEvents) {\n const props = getEventData(event);\n stats.totalVectorsUpserted += Number(props.vectorCount || 0);\n }\n\n for (const event of deleteEvents) {\n const props = getEventData(event);\n stats.totalVectorsDeleted += Number(props.idsCount || 0);\n }\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch VectorStore usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'VECTORSTORE_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch vectorstore statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/cache/daily-stats\n // Returns time-bucketed aggregated Cache statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const cacheDailyStatsPaths = resolvePaths(basePath, '/adapters/cache/daily-stats');\n for (const path of cacheDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['cache.get.hit', 'cache.get.miss', 'cache.set.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/cache/usage\n // Returns aggregated Cache usage statistics\n const cacheUsagePaths = resolvePaths(basePath, '/adapters/cache/usage');\n for (const path of cacheUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const hitEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'cache.get.hit',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const missEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'cache.get.miss',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const setEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'cache.set.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const totalGets = hitEvents.length + missEvents.length;\n const hitRate = totalGets > 0 ? (hitEvents.length / totalGets) * 100 : 0;\n\n const stats = {\n totalGets,\n hits: hitEvents.length,\n misses: missEvents.length,\n hitRate,\n sets: setEvents.length,\n avgGetDuration: 0,\n avgSetDuration: 0,\n };\n\n let totalGetDuration = 0;\n for (const event of [...hitEvents, ...missEvents]) {\n const props = getEventData(event);\n totalGetDuration += Number(props.durationMs || 0);\n }\n stats.avgGetDuration = totalGets > 0 ? totalGetDuration / totalGets : 0;\n\n let totalSetDuration = 0;\n for (const event of setEvents) {\n const props = getEventData(event);\n totalSetDuration += Number(props.durationMs || 0);\n }\n stats.avgSetDuration = stats.sets > 0 ? totalSetDuration / stats.sets : 0;\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch Cache usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'CACHE_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch cache statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/storage/daily-stats\n // Returns time-bucketed aggregated Storage statistics for time-series visualization\n // Query params: from, to, groupBy (hour|day|week|month), breakdownBy (dot-path), metrics (csv)\n const storageDailyStatsPaths = resolvePaths(basePath, '/adapters/storage/daily-stats');\n for (const path of storageDailyStatsPaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getDailyStats) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support daily statistics',\n },\n });\n }\n\n try {\n const dateRange = extractDateRange(request.query);\n const statsOptions = extractStatsOptions(request.query);\n\n const dailyStats = await analytics.getDailyStats({\n type: ['storage.read.completed', 'storage.write.completed', 'storage.delete.completed'],\n from: dateRange.from,\n to: dateRange.to,\n limit: 50000,\n ...statsOptions,\n });\n\n return reply.send({ ok: true, data: dailyStats });\n } catch (error) {\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: { code: 'INVALID_DATE_RANGE', message: error.message },\n });\n }\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'DAILY_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch daily statistics',\n },\n });\n }\n });\n }\n\n // GET /api/v1/adapters/storage/usage\n // Returns aggregated Storage usage statistics\n const storageUsagePaths = resolvePaths(basePath, '/adapters/storage/usage');\n for (const path of storageUsagePaths) {\n fastify.get(path, async (request, reply) => {\n const analytics = platform.analytics;\n\n if (!analytics.getEvents) {\n return reply.code(501).send({\n ok: false,\n error: {\n code: 'ANALYTICS_NOT_IMPLEMENTED',\n message: 'Analytics adapter does not support reading events',\n },\n });\n }\n\n try {\n // Extract and validate date range\n const dateRange = extractDateRange(request.query);\n\n const readEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'storage.read.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const writeEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'storage.write.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n const deleteEvents = await fetchAllEventsBatched(\n analytics,\n {\n type: 'storage.delete.completed',\n from: dateRange.from,\n to: dateRange.to,\n },\n fastify\n );\n\n const stats = {\n readOperations: readEvents.length,\n writeOperations: writeEvents.length,\n deleteOperations: deleteEvents.length,\n totalBytesRead: 0,\n totalBytesWritten: 0,\n avgReadDuration: 0,\n avgWriteDuration: 0,\n };\n\n let totalReadDuration = 0;\n for (const event of readEvents) {\n const props = getEventData(event);\n stats.totalBytesRead += Number(props.bytesRead || 0);\n totalReadDuration += Number(props.durationMs || 0);\n }\n stats.avgReadDuration = stats.readOperations > 0 ? totalReadDuration / stats.readOperations : 0;\n\n let totalWriteDuration = 0;\n for (const event of writeEvents) {\n const props = getEventData(event);\n stats.totalBytesWritten += Number(props.bytesWritten || 0);\n totalWriteDuration += Number(props.durationMs || 0);\n }\n stats.avgWriteDuration = stats.writeOperations > 0 ? totalWriteDuration / stats.writeOperations : 0;\n\n return { ok: true, data: stats, meta: { source: 'analytics-adapter' } };\n } catch (error) {\n // Handle validation errors\n if (error instanceof Error && error.message.includes('Invalid')) {\n return reply.code(400).send({\n ok: false,\n error: {\n code: 'INVALID_DATE_RANGE',\n message: error.message,\n },\n });\n }\n\n platform.logger.error('Failed to fetch Storage usage stats', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'STORAGE_USAGE_STATS_ERROR',\n message: error instanceof Error ? error.message : 'Failed to fetch storage statistics',\n },\n });\n }\n });\n }\n\n fastify.log.info('Platform adapter routes registered');\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/logs\n * Live log streaming and querying endpoints\n */\n\nimport type { FastifyInstance } from \"fastify\";\nimport type { RestApiConfig } from \"@kb-labs/rest-api-core\";\nimport { platform } from \"@kb-labs/core-runtime\";\nimport type { LogQuery, LogRecord, LogLevel } from \"@kb-labs/core-platform\";\nimport type { EventHub } from \"../events/hub\";\n\n/** Frontend-shaped log record returned by toFrontendLogRecord */\ninterface FrontendLogRecord {\n id: string;\n time: string;\n level: string;\n msg: string;\n plugin?: string;\n [key: string]: unknown;\n}\n\n/** Statistics shape used in summarization */\ninterface LogStats {\n total: number;\n byLevel: Record<string, number>;\n byPlugin: Record<string, number>;\n topErrors: Array<{ message: string; count: number }>;\n timeRange: { from: string | null; to: string | null };\n}\n\n/** Error entry shape used in topErrors iteration */\ninterface TopError {\n message: string;\n count: number;\n}\n\n/**\n * Map Pino numeric level to string level\n */\nfunction mapPinoLevelToString(level: number | string): string {\n if (typeof level === \"string\") {\n return level;\n }\n\n // Pino levels: 10=trace, 20=debug, 30=info, 40=warn, 50=error, 60=fatal\n if (level <= 10) {\n return \"trace\";\n }\n if (level <= 20) {\n return \"debug\";\n }\n if (level <= 30) {\n return \"info\";\n }\n if (level <= 40) {\n return \"warn\";\n }\n if (level <= 50) {\n return \"error\";\n }\n return \"fatal\";\n}\n\n/**\n * Convert internal LogRecord to frontend LogRecord format\n */\nfunction toFrontendLogRecord(record: LogRecord): FrontendLogRecord {\n // Extract level from fields if it's a Pino log (numeric level)\n const pinoLevel = record.fields.level;\n const levelStr =\n typeof pinoLevel === \"number\"\n ? mapPinoLevelToString(pinoLevel)\n : record.level;\n\n // Ensure message is a string\n const messageStr =\n typeof record.message === \"string\"\n ? record.message\n : JSON.stringify(record.message);\n\n // Remove 'level' and 'time' from fields to avoid overwriting our converted values\n const { level: _level, time: _time, ...restFields } = record.fields;\n\n return {\n id: record.id, // Include ID for navigation to detail page\n time: new Date(record.timestamp).toISOString(),\n level: levelStr,\n msg: messageStr,\n ...restFields,\n };\n}\n\n/**\n * Build LLM prompt for log summarization\n */\nfunction buildLogSummaryPrompt(\n question: string,\n logs: FrontendLogRecord[],\n stats: LogStats,\n includeContext: {\n errors?: boolean;\n warnings?: boolean;\n info?: boolean;\n metadata?: boolean;\n stackTraces?: boolean;\n },\n): string {\n let prompt = `You are analyzing application logs. User question: \"${question}\"\\n\\n`;\n\n // Add statistics\n prompt += `Statistics:\\n`;\n prompt += `Total logs: ${stats.total}\\n`;\n prompt += `Errors: ${stats.byLevel.error || 0}\\n`;\n prompt += `Warnings: ${stats.byLevel.warn || 0}\\n`;\n prompt += `Info: ${stats.byLevel.info || 0}\\n`;\n\n if (stats.timeRange.from && stats.timeRange.to) {\n prompt += `Time range: ${stats.timeRange.from} to ${stats.timeRange.to}\\n`;\n }\n\n if (stats.topErrors.length > 0) {\n prompt += `\\nTop Errors:\\n`;\n stats.topErrors.slice(0, 5).forEach((err: TopError, idx: number) => {\n prompt += `${idx + 1}. \"${err.message}\" (${err.count} occurrences)\\n`;\n });\n }\n\n // Filter logs based on includeContext\n const relevantLogs = logs.filter((log) => {\n if (!includeContext.errors && log.level === \"error\") {\n return false;\n }\n if (!includeContext.warnings && log.level === \"warn\") {\n return false;\n }\n if (!includeContext.info && log.level === \"info\") {\n return false;\n }\n return true;\n });\n\n // Add log entries (limit to 100 most recent)\n prompt += `\\nLog Entries (${Math.min(relevantLogs.length, 100)} most recent):\\n`;\n relevantLogs.slice(-100).forEach((log) => {\n prompt += `[${log.time}] ${log.level.toUpperCase()}`;\n\n if (includeContext.metadata && log.plugin) {\n prompt += ` [${log.plugin}]`;\n }\n\n prompt += `: ${log.msg || \"(no message)\"}\\n`;\n\n if (includeContext.metadata && (log.traceId || log.executionId)) {\n if (log.traceId) {\n prompt += ` traceId: ${log.traceId}\\n`;\n }\n if (log.executionId) {\n prompt += ` executionId: ${log.executionId}\\n`;\n }\n }\n\n const logErr = log.err as { stack?: string } | undefined;\n if (includeContext.stackTraces && logErr?.stack) {\n prompt += ` stack: ${logErr.stack.split(\"\\n\").slice(0, 5).join(\"\\n \")}\\n`;\n }\n });\n\n // Add instructions\n prompt += `\\nInstructions:\\n`;\n prompt += `Provide a clear, concise summary answering the user's question as plain text. Focus on:\\n`;\n prompt += `1. What happened (timeline of events)\\n`;\n prompt += `2. Root causes if errors are present\\n`;\n prompt += `3. Patterns or trends you notice\\n`;\n prompt += `4. Actionable recommendations if applicable\\n`;\n prompt += `\\nKeep the summary under 300 words. Use simple paragraphs separated by double newlines. Do not use markdown formatting (no **, ##, -, or other markdown syntax). Write in clear, professional language.\\n`;\n\n return prompt;\n}\n\n/**\n * Extract correlation keys from log for finding related logs\n */\nfunction extractCorrelationKeys(log: LogRecord): {\n requestId?: string;\n traceId?: string;\n executionId?: string;\n sessionId?: string;\n} {\n return {\n requestId: log.fields.requestId as string | undefined,\n traceId: log.fields.traceId as string | undefined,\n executionId: log.fields.executionId as string | undefined,\n sessionId: log.fields.sessionId as string | undefined,\n };\n}\n\n/**\n * Find logs related to the given log\n * Strategy:\n * 1. Try requestId/traceId/executionId (most specific)\n * 2. Fallback to time window + same source\n */\nasync function findRelatedLogs(\n targetLog: LogRecord,\n): Promise<FrontendLogRecord[]> {\n const correlationKeys = extractCorrelationKeys(targetLog);\n const timeWindow = 60000; // 1 minute before/after\n\n // Strategy 1: Find by correlation IDs (most precise)\n if (\n correlationKeys.requestId ||\n correlationKeys.traceId ||\n correlationKeys.executionId\n ) {\n const relatedLogs: LogRecord[] = [];\n\n // Query all logs in time window\n const result = await platform.logs.query(\n {\n from: targetLog.timestamp - timeWindow,\n to: targetLog.timestamp + timeWindow,\n },\n {\n limit: 1000,\n },\n );\n\n // Filter in-memory by correlation keys\n for (const log of result.logs) {\n if (log.id === targetLog.id) {\n continue;\n } // Skip self\n\n const logKeys = extractCorrelationKeys(log);\n\n // Match any correlation key\n if (\n (correlationKeys.requestId &&\n logKeys.requestId === correlationKeys.requestId) ||\n (correlationKeys.traceId &&\n logKeys.traceId === correlationKeys.traceId) ||\n (correlationKeys.executionId &&\n logKeys.executionId === correlationKeys.executionId) ||\n (correlationKeys.sessionId &&\n logKeys.sessionId === correlationKeys.sessionId)\n ) {\n relatedLogs.push(log);\n }\n }\n\n if (relatedLogs.length > 0) {\n return relatedLogs\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(toFrontendLogRecord);\n }\n }\n\n // Strategy 2: Fallback to time window + same source\n const result = await platform.logs.query(\n {\n source: targetLog.source,\n from: targetLog.timestamp - timeWindow,\n to: targetLog.timestamp + timeWindow,\n },\n {\n limit: 50,\n },\n );\n\n return result.logs\n .filter((log) => log.id !== targetLog.id)\n .sort((a, b) => a.timestamp - b.timestamp)\n .map(toFrontendLogRecord);\n}\n\n/**\n * Generate fallback summary when LLM is unavailable\n */\nfunction generateFallbackSummary(\n stats: LogStats,\n logs: FrontendLogRecord[],\n): string {\n let summary = `Log Summary\\n\\n`;\n\n summary += `Total Logs: ${stats.total}\\n\\n`;\n\n // Level breakdown\n summary += `By Level:\\n`;\n Object.entries(stats.byLevel).forEach(([level, count]) => {\n summary += `${level}: ${count}\\n`;\n });\n summary += `\\n`;\n\n // Plugin breakdown\n if (Object.keys(stats.byPlugin).length > 0) {\n summary += `By Plugin:\\n`;\n Object.entries(stats.byPlugin)\n .sort(\n (a: [string, unknown], b: [string, unknown]) =>\n (b[1] as number) - (a[1] as number),\n )\n .slice(0, 5)\n .forEach(([plugin, count]) => {\n summary += `${plugin}: ${count}\\n`;\n });\n summary += `\\n`;\n }\n\n // Top errors\n if (stats.topErrors.length > 0) {\n summary += `Top Errors:\\n`;\n stats.topErrors.slice(0, 5).forEach((err: TopError, idx: number) => {\n summary += `${idx + 1}. \"${err.message}\" (${err.count} times)\\n`;\n });\n summary += `\\n`;\n }\n\n // Time range\n if (stats.timeRange.from && stats.timeRange.to) {\n summary += `Time Range: ${stats.timeRange.from} to ${stats.timeRange.to}\\n\\n`;\n }\n\n summary += `Note: LLM summarization is not available. This is a basic statistical summary.`;\n\n return summary;\n}\n\n/**\n * Register log observability routes\n */\nexport async function registerLogRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n eventHub: EventHub,\n): Promise<void> {\n /**\n * GET /api/v1/logs\n * Query logs with filters\n */\n server.get<{\n Querystring: {\n from?: string;\n to?: string;\n level?: string;\n plugin?: string;\n executionId?: string;\n tenantId?: string;\n search?: string;\n limit?: string;\n offset?: string;\n };\n }>(\n \"/api/v1/logs\",\n { schema: { tags: [\"Logs\"], summary: \"Query logs with filters\" } },\n async (request, reply) => {\n try {\n // Parse numeric query params (Fastify doesn't parse them automatically)\n const limit = request.query.limit\n ? parseInt(request.query.limit, 10)\n : 100;\n const offset = request.query.offset\n ? parseInt(request.query.offset, 10)\n : 0;\n\n // Build query from request params\n const query: LogQuery = {\n level: request.query.level as LogLevel,\n source: request.query.plugin,\n from: request.query.from\n ? new Date(request.query.from).getTime()\n : undefined,\n to: request.query.to\n ? new Date(request.query.to).getTime()\n : undefined,\n };\n\n // Query logs using unified service\n let result;\n if (request.query.search) {\n // Use full-text search if search query provided\n result = await platform.logs.search(request.query.search, {\n limit,\n offset,\n });\n } else {\n // Regular query with filters\n result = await platform.logs.query(query, {\n limit,\n offset,\n });\n }\n\n // Convert to frontend format\n const frontendLogs = result.logs.map(toFrontendLogRecord);\n\n // Get stats for response metadata\n const stats = await platform.logs.getStats();\n\n return {\n ok: true,\n data: {\n logs: frontendLogs,\n total: result.total,\n hasMore: result.hasMore,\n filters: request.query,\n source: \"source\" in result ? result.source : undefined,\n stats: {\n buffer: stats.buffer\n ? {\n size: stats.buffer.size,\n maxSize: stats.buffer.maxSize,\n oldest: stats.buffer.oldestTimestamp\n ? new Date(stats.buffer.oldestTimestamp).toISOString()\n : undefined,\n newest: stats.buffer.newestTimestamp\n ? new Date(stats.buffer.newestTimestamp).toISOString()\n : undefined,\n }\n : undefined,\n persistence: stats.persistence\n ? {\n totalLogs: stats.persistence.totalLogs,\n oldestTimestamp: stats.persistence.oldestTimestamp\n ? new Date(\n stats.persistence.oldestTimestamp,\n ).toISOString()\n : undefined,\n newestTimestamp: stats.persistence.newestTimestamp\n ? new Date(\n stats.persistence.newestTimestamp,\n ).toISOString()\n : undefined,\n sizeBytes: stats.persistence.sizeBytes,\n }\n : undefined,\n },\n },\n };\n } catch (error: unknown) {\n return reply.code(503).send({\n ok: false,\n error: \"Log query failed\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n },\n );\n\n /**\n * GET /api/v1/logs/:id\n * Get single log by ID with related logs\n */\n server.get<{\n Params: { id: string };\n Querystring: { includeRelated?: string };\n }>(\n \"/api/v1/logs/:id\",\n { schema: { tags: [\"Logs\"], summary: \"Get log entry by ID\" } },\n async (request, reply) => {\n try {\n const log = await platform.logs.getById(request.params.id);\n\n if (!log) {\n return reply.code(404).send({\n ok: false,\n error: \"Log not found\",\n message: `Log with ID '${request.params.id}' does not exist`,\n });\n }\n\n const frontendLog = toFrontendLogRecord(log);\n\n // Optionally include related logs\n let relatedLogs: FrontendLogRecord[] = [];\n if (request.query.includeRelated === \"true\") {\n relatedLogs = await findRelatedLogs(log);\n }\n\n return {\n ok: true,\n data: {\n log: frontendLog,\n related: relatedLogs.length > 0 ? relatedLogs : undefined,\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: \"Failed to fetch log\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n },\n );\n\n /**\n * GET /api/v1/logs/:id/related\n * Get logs related to a specific log (same trace/execution/request)\n */\n server.get<{ Params: { id: string } }>(\n \"/api/v1/logs/:id/related\",\n {\n schema: {\n tags: [\"Logs\"],\n summary: \"Get logs related to a specific entry\",\n },\n },\n async (request, reply) => {\n try {\n const log = await platform.logs.getById(request.params.id);\n\n if (!log) {\n return reply.code(404).send({\n ok: false,\n error: \"Log not found\",\n message: `Log with ID '${request.params.id}' does not exist`,\n });\n }\n\n const relatedLogs = await findRelatedLogs(log);\n\n return {\n ok: true,\n data: {\n total: relatedLogs.length,\n logs: relatedLogs,\n correlationKeys: extractCorrelationKeys(log),\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: \"Failed to fetch related logs\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n },\n );\n\n /**\n * GET /api/v1/logs/stream\n * Server-Sent Events stream for real-time logs\n */\n server.get(\n \"/api/v1/logs/stream\",\n { schema: { hide: true } },\n async (request, reply) => {\n // Check if streaming is supported\n const caps = platform.logs.getCapabilities();\n if (!caps.hasStreaming) {\n return reply.code(503).send({\n error: \"Log streaming not enabled\",\n message:\n \"Logger adapter does not support streaming. Enable logRingBuffer in kb.config.json\",\n });\n }\n\n // Tell Fastify we're manually managing the response\n reply.hijack();\n\n // Track if stream is closed to prevent double-end\n let streamClosed = false;\n\n // Explicit CORS headers for EventSource\n const origin = request.headers.origin;\n if (\n origin === \"http://localhost:3000\" ||\n origin === \"http://localhost:5173\"\n ) {\n reply.raw.setHeader(\"Access-Control-Allow-Origin\", origin);\n reply.raw.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\n } else {\n reply.raw.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n }\n\n // Setup SSE headers\n reply.raw.setHeader(\"Content-Type\", \"text/event-stream\");\n reply.raw.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\n reply.raw.setHeader(\"Connection\", \"keep-alive\");\n\n try {\n reply.raw.flushHeaders?.();\n reply.raw.write(\": connected\\n\\n\");\n } catch (err) {\n // Headers already sent or connection closed\n streamClosed = true;\n return;\n }\n\n // Subscribe to log stream using unified service\n const unsubscribe = platform.logs.subscribe((log) => {\n // Check if connection is still alive before writing\n if (!streamClosed && !reply.raw.writableEnded && !reply.raw.destroyed) {\n try {\n // Frontend expects event name 'log'\n const frontendLog = toFrontendLogRecord(log);\n reply.raw.write(`event: log\\n`);\n reply.raw.write(`data: ${JSON.stringify(frontendLog)}\\n\\n`);\n } catch (err) {\n // Connection closed while writing - ignore\n streamClosed = true;\n }\n }\n });\n\n // Cleanup on disconnect\n const cleanup = () => {\n if (!streamClosed) {\n streamClosed = true;\n unsubscribe();\n try {\n if (!reply.raw.writableEnded && !reply.raw.destroyed) {\n reply.raw.end();\n }\n } catch (err) {\n // Already closed - ignore\n }\n }\n };\n\n request.raw.on(\"close\", cleanup);\n request.raw.on(\"error\", cleanup);\n\n // Keep connection alive indefinitely\n await new Promise<void>(() => {});\n },\n );\n\n /**\n * GET /api/v1/logs/stats\n * Get combined log statistics from all backends\n */\n server.get(\n \"/api/v1/logs/stats\",\n { schema: { tags: [\"Logs\"], summary: \"Get log storage statistics\" } },\n async (request, reply) => {\n try {\n const stats = await platform.logs.getStats();\n const caps = platform.logs.getCapabilities();\n\n return {\n ok: true,\n data: {\n capabilities: caps,\n buffer: stats.buffer\n ? {\n size: stats.buffer.size,\n maxSize: stats.buffer.maxSize,\n oldest: stats.buffer.oldestTimestamp\n ? new Date(stats.buffer.oldestTimestamp).toISOString()\n : undefined,\n newest: stats.buffer.newestTimestamp\n ? new Date(stats.buffer.newestTimestamp).toISOString()\n : undefined,\n }\n : undefined,\n persistence: stats.persistence\n ? {\n totalLogs: stats.persistence.totalLogs,\n oldest: stats.persistence.oldestTimestamp\n ? new Date(stats.persistence.oldestTimestamp).toISOString()\n : undefined,\n newest: stats.persistence.newestTimestamp\n ? new Date(stats.persistence.newestTimestamp).toISOString()\n : undefined,\n sizeBytes: stats.persistence.sizeBytes,\n }\n : undefined,\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: \"Failed to fetch stats\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n },\n );\n\n /**\n * POST /api/v1/logs/summarize\n * AI-powered log summarization (placeholder for future implementation)\n *\n * Expected request body:\n * {\n * \"timeRange\": { \"from\": \"ISO timestamp\", \"to\": \"ISO timestamp\" },\n * \"filters\": { \"level\": \"error\", \"plugin\": \"rest\", \"traceId\": \"...\" },\n * \"groupBy\": \"trace\" | \"execution\" | \"plugin\",\n * \"question\": \"What happened in the last 5 minutes?\" (optional)\n * }\n */\n server.post<{\n Body: {\n timeRange?: { from?: string; to?: string };\n filters?: {\n level?: string;\n plugin?: string;\n traceId?: string;\n executionId?: string;\n };\n groupBy?: \"trace\" | \"execution\" | \"plugin\";\n question?: string;\n includeContext?: {\n errors?: boolean;\n warnings?: boolean;\n info?: boolean;\n metadata?: boolean;\n stackTraces?: boolean;\n };\n };\n }>(\n \"/api/v1/logs/summarize\",\n { schema: { tags: [\"Logs\"], summary: \"AI-powered log summarization\" } },\n async (request, reply) => {\n const { timeRange, filters, groupBy, question, includeContext } =\n request.body;\n\n try {\n // Build query from request\n const query: LogQuery = {\n level: filters?.level as LogLevel,\n source: filters?.plugin,\n from: timeRange?.from\n ? new Date(timeRange.from).getTime()\n : undefined,\n to: timeRange?.to ? new Date(timeRange.to).getTime() : undefined,\n };\n\n // Query logs using unified service\n const result = await platform.logs.query(query, { limit: 1000 });\n const frontendLogs = result.logs.map(toFrontendLogRecord);\n\n // Additional filters (traceId, executionId)\n let filteredLogs = frontendLogs;\n if (filters?.traceId) {\n filteredLogs = filteredLogs.filter(\n (log) => log.traceId === filters.traceId,\n );\n }\n if (filters?.executionId) {\n filteredLogs = filteredLogs.filter(\n (log) => log.executionId === filters.executionId,\n );\n }\n\n // Calculate aggregated statistics\n const stats = {\n total: filteredLogs.length,\n byLevel: {} as Record<string, number>,\n byPlugin: {} as Record<string, number>,\n topErrors: [] as Array<{ message: string; count: number }>,\n timeRange: {\n from: filteredLogs.length > 0 ? filteredLogs[0]!.time : null,\n to:\n filteredLogs.length > 0\n ? filteredLogs[filteredLogs.length - 1]!.time\n : null,\n },\n };\n\n const errorMessages = new Map<string, number>();\n\n for (const log of filteredLogs) {\n // Count by level\n stats.byLevel[log.level] = (stats.byLevel[log.level] || 0) + 1;\n\n // Count by plugin\n if (log.plugin) {\n stats.byPlugin[log.plugin] = (stats.byPlugin[log.plugin] || 0) + 1;\n }\n\n // Track error messages\n if (log.level === \"error\" && log.msg) {\n errorMessages.set(log.msg, (errorMessages.get(log.msg) || 0) + 1);\n }\n }\n\n // Top 10 errors\n stats.topErrors = Array.from(errorMessages.entries())\n .map(([message, count]) => ({ message, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 10);\n\n // Group logs if requested\n let groups: Record<string, FrontendLogRecord[]> | null = null;\n if (groupBy) {\n // Map frontend groupBy values to actual log field names\n const fieldMap: Record<string, string> = {\n trace: \"traceId\",\n execution: \"executionId\",\n plugin: \"plugin\",\n };\n\n const groupMap = new Map<string, FrontendLogRecord[]>();\n for (const log of filteredLogs) {\n const fieldName = fieldMap[groupBy] || groupBy;\n const key = String(log[fieldName] || \"unknown\");\n if (!groupMap.has(key)) {\n groupMap.set(key, []);\n }\n groupMap.get(key)!.push(log);\n }\n groups = Object.fromEntries(groupMap.entries());\n }\n\n // AI Summarization\n let aiSummary: string | null = null;\n let message: string | null = null;\n\n if (platform.llm && question) {\n try {\n const context = includeContext || {\n errors: true,\n warnings: true,\n info: false,\n metadata: true,\n stackTraces: true,\n };\n\n const prompt = buildLogSummaryPrompt(\n question,\n filteredLogs,\n stats,\n context,\n );\n\n const response = await platform.llm.complete(prompt, {\n temperature: 0.7,\n maxTokens: 1000,\n systemPrompt:\n \"You are a technical log analysis assistant. Provide clear, actionable insights based on application logs.\",\n });\n\n aiSummary = response.content.trim();\n } catch (error) {\n // Graceful degradation\n platform.logger.warn(\"LLM summarization failed, using fallback\", {\n error: error instanceof Error ? error.message : String(error),\n });\n aiSummary = generateFallbackSummary(stats, filteredLogs);\n message =\n \"AI summarization unavailable, showing statistical summary\";\n }\n } else {\n // No LLM or no question - return fallback\n aiSummary = generateFallbackSummary(stats, filteredLogs);\n message = platform.llm\n ? \"No question provided\"\n : \"LLM not configured\";\n }\n\n // Return structured data with AI summary\n return {\n ok: true,\n data: {\n summary: {\n question: question || \"General log summary\",\n timeRange: stats.timeRange,\n total: stats.total,\n stats,\n groups,\n },\n aiSummary,\n message,\n },\n };\n } catch (error: unknown) {\n return reply.code(500).send({\n ok: false,\n error: \"Log summarization failed\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n },\n );\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/platform\n * Platform configuration endpoints\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { PlatformConfigResponse, PlatformConfigPayload } from '@kb-labs/rest-api-contracts';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\nimport { readKbConfig } from '@kb-labs/core-config';\nimport { platform } from '@kb-labs/core-runtime';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n/**\n * Sensitive keys to redact from adapterOptions\n */\nconst SENSITIVE_KEYS = [\n 'apiKey',\n 'secret',\n 'password',\n 'token',\n 'key',\n 'credentials',\n 'auth',\n];\n\n/**\n * Recursively redact sensitive keys from an object\n */\nfunction redactSensitiveData(\n obj: Record<string, any>,\n redacted: string[] = [],\n path: string = ''\n): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(obj)) {\n const currentPath = path ? `${path}.${key}` : key;\n const lowerKey = key.toLowerCase();\n\n // Check if key contains sensitive patterns\n const isSensitive = SENSITIVE_KEYS.some(pattern => lowerKey.includes(pattern.toLowerCase()));\n\n if (isSensitive && typeof value === 'string') {\n result[key] = '***REDACTED***';\n redacted.push(currentPath);\n } else if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n result[key] = redactSensitiveData(value, redacted, currentPath);\n } else {\n result[key] = value;\n }\n }\n\n return result;\n}\n\n/**\n * Load platform configuration from kb.config.json using core-config utilities\n */\nasync function loadPlatformConfig(repoRoot: string): Promise<{\n adapters: Record<string, string | null>;\n adapterOptions: Record<string, unknown>;\n execution: { mode: string };\n}> {\n try {\n const configResult = await readKbConfig(repoRoot);\n\n if (!configResult || !configResult.data) {\n // Return empty/default values if config not found\n return {\n adapters: {},\n adapterOptions: {},\n execution: { mode: 'in-process' },\n };\n }\n\n const config = configResult.data as Record<string, unknown>;\n const configPlatform = (typeof config.platform === 'object' && config.platform !== null)\n ? config.platform as Record<string, unknown>\n : {} as Record<string, unknown>;\n\n return {\n adapters: (configPlatform.adapters ?? {}) as Record<string, string | null>,\n adapterOptions: (configPlatform.adapterOptions ?? {}) as Record<string, unknown>,\n execution: (configPlatform.execution ?? { mode: 'in-process' }) as { mode: string },\n };\n } catch (error) {\n // Return empty/default values on error\n return {\n adapters: {},\n adapterOptions: {},\n execution: { mode: 'in-process' },\n };\n }\n}\n\n/**\n * Register platform configuration routes\n */\nexport async function registerPlatformRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const configPaths = resolvePaths(basePath, '/platform/config');\n\n for (const path of configPaths) {\n fastify.get(path, async (_request, reply) => {\n try {\n const { adapters, adapterOptions, execution } = await restDomainOperationMetrics.observeOperation(\n 'platform.config.get',\n () => loadPlatformConfig(repoRoot),\n );\n\n const redacted: string[] = [];\n const sanitizedOptions = redactSensitiveData(adapterOptions as Record<string, any>, redacted);\n\n const payload: PlatformConfigPayload = {\n schema: 'kb.platform.config/1',\n ts: new Date().toISOString(),\n adapters,\n adapterOptions: sanitizedOptions,\n execution,\n redacted,\n };\n\n const response: PlatformConfigResponse = {\n ok: true,\n data: payload,\n };\n\n return reply.send(response);\n } catch (error) {\n platform.logger.error('Failed to load platform config', error instanceof Error ? error : new Error(String(error)));\n return reply.code(500).send({\n ok: false,\n error: {\n code: 'INTERNAL_SERVER_ERROR',\n message: 'Failed to load platform configuration',\n },\n });\n }\n });\n }\n}\n","/**\n * Internal adapter-call endpoint — reverse proxy for Workspace Agent.\n *\n * Receives adapter:call from Gateway (forwarded from Host via WS),\n * executes against platform services, returns result.\n *\n * Flow: Host → WS adapter:call → Gateway → HTTP POST here → platform.adapter.method()\n *\n * Security:\n * - Auth: x-internal-secret (server-to-server, same as /internal/dispatch)\n * - Adapter allowlist enforced (AdapterNameSchema)\n * - Method allowlist per adapter (AdapterRegistry)\n * - Zod validation on input/output\n * - Audit logging on every call\n *\n * @see ADR-0051: Bidirectional Gateway Protocol\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { z } from 'zod';\nimport { platform } from '@kb-labs/core-runtime';\nimport { AdapterNameSchema, type AdapterName } from '@kb-labs/gateway-contracts';\nimport { restDomainOperationMetrics } from '../middleware/metrics.js';\n\n// ── Adapter Registry ──\n\ninterface AdapterMethodEntry {\n inputSchema: z.ZodType;\n outputSchema: z.ZodType;\n execute: (args: unknown[], context: AdapterCallContext) => Promise<unknown>;\n}\n\ninterface AdapterCallContext {\n namespaceId: string;\n hostId: string;\n workspaceId?: string;\n environmentId?: string;\n executionRequestId?: string;\n userId?: string;\n sessionId?: string;\n}\n\nclass AdapterRegistry {\n private methods = new Map<string, AdapterMethodEntry>();\n\n register(\n adapter: AdapterName,\n method: string,\n entry: AdapterMethodEntry,\n ): void {\n this.methods.set(`${adapter}.${method}`, entry);\n }\n\n get(adapter: string, method: string): AdapterMethodEntry | undefined {\n return this.methods.get(`${adapter}.${method}`);\n }\n\n has(adapter: string, method: string): boolean {\n return this.methods.has(`${adapter}.${method}`);\n }\n}\n\n// ── Request schema ──\n\nconst AdapterCallRequestSchema = z.object({\n requestId: z.string(),\n adapter: AdapterNameSchema,\n method: z.string(),\n args: z.array(z.unknown()),\n context: z.object({\n namespaceId: z.string(),\n hostId: z.string(),\n workspaceId: z.string().optional(),\n environmentId: z.string().optional(),\n executionRequestId: z.string().optional(),\n userId: z.string().optional(),\n sessionId: z.string().optional(),\n }),\n});\n\n// ── Registry initialization ──\n\nfunction createAdapterRegistry(): AdapterRegistry {\n const registry = new AdapterRegistry();\n\n // LLM\n registry.register('llm', 'complete', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const llm = platform.getAdapter<any>('llm');\n if (!llm) { throw new Error('LLM adapter not available'); }\n return llm.complete(...args);\n },\n });\n\n // Cache\n registry.register('cache', 'get', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown().nullable(),\n execute: async (args) => platform.cache.get(args[0] as string),\n });\n\n registry.register('cache', 'set', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.void(),\n execute: async (args) => platform.cache.set(args[0] as string, args[1], args[2] as number | undefined),\n });\n\n registry.register('cache', 'delete', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.void(),\n execute: async (args) => platform.cache.delete(args[0] as string),\n });\n\n // VectorStore\n registry.register('vectorStore', 'search', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const vs = platform.getAdapter<any>('vectorStore');\n if (!vs) { throw new Error('VectorStore adapter not available'); }\n return vs.search(...args);\n },\n });\n\n // Embeddings\n registry.register('embeddings', 'embed', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const emb = platform.getAdapter<any>('embeddings');\n if (!emb) { throw new Error('Embeddings adapter not available'); }\n return emb.embed(...args);\n },\n });\n\n // Storage\n registry.register('storage', 'read', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.unknown(),\n execute: async (args) => {\n const storage = platform.getAdapter<any>('storage');\n if (!storage) { throw new Error('Storage adapter not available'); }\n return storage.read(...args);\n },\n });\n\n registry.register('storage', 'write', {\n inputSchema: z.array(z.unknown()),\n outputSchema: z.void(),\n execute: async (args) => {\n const storage = platform.getAdapter<any>('storage');\n if (!storage) { throw new Error('Storage adapter not available'); }\n return storage.write(...args);\n },\n });\n\n return registry;\n}\n\n// ── Route registration ──\n\nexport async function registerAdapterCallRoutes(\n server: FastifyInstance,\n): Promise<void> {\n const registry = createAdapterRegistry();\n const internalSecret = process.env.GATEWAY_INTERNAL_SECRET;\n const logger = platform.logger.child({ layer: 'rest', route: 'adapter-call' });\n\n server.post('/api/v1/internal/adapter-call', async (\n request: FastifyRequest,\n reply: FastifyReply,\n ) => {\n // 1. Auth: x-internal-secret\n const provided = request.headers['x-internal-secret'] as string | undefined;\n if (!internalSecret || provided !== internalSecret) {\n return reply.code(403).send({ ok: false, error: { code: 'FORBIDDEN', message: 'Invalid internal secret', retryable: false } });\n }\n\n // 2. Parse & validate request\n const parsed = AdapterCallRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ ok: false, error: { code: 'VALIDATION_ERROR', message: parsed.error.message, retryable: false } });\n }\n\n const { requestId, adapter, method, args, context } = parsed.data;\n const startMs = Date.now();\n\n // 3. Check registry\n const entry = registry.get(adapter as string, method);\n if (!entry) {\n logger.warn('Adapter call rejected', { requestId, adapter, method, hostId: context.hostId });\n return reply.code(403).send({ ok: false, error: { code: 'ADAPTER_CALL_REJECTED', message: `Method not allowed: ${adapter}.${method}`, retryable: false } });\n }\n\n // 4. Execute\n try {\n const operation = `adapter.call.${adapter}.${method}`;\n const result = await restDomainOperationMetrics.observeOperation(operation, async () =>\n entry.execute(args, context),\n );\n const latencyMs = Date.now() - startMs;\n\n logger.info('Adapter call success', { requestId, adapter, method, hostId: context.hostId, latencyMs });\n\n return { ok: true, result };\n } catch (err) {\n const latencyMs = Date.now() - startMs;\n const message = err instanceof Error ? err.message : String(err);\n\n logger.error('Adapter call failed', err instanceof Error ? err : undefined, { requestId, adapter, method, hostId: context.hostId, latencyMs });\n\n return reply.code(500).send({\n ok: false,\n error: { code: 'ADAPTER_ERROR', message, retryable: false },\n });\n }\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/routes/debug-routes\n * Debug endpoint to list all registered routes\n *\n * GET /api/v1/routes - List all registered routes with methods\n */\n\nimport type { FastifyInstance, RouteOptions } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { normalizeBasePath, resolvePaths } from './path-helpers';\n\ninterface RouteInfo {\n method: string;\n url: string;\n}\n\n// Store for collected routes (populated via onRoute hook)\nconst collectedRoutes: RouteInfo[] = [];\nconst seenRoutes = new Set<string>();\n\n/**\n * Hook to collect routes as they are registered\n */\nfunction collectRoute(routeOptions: RouteOptions): void {\n const methods = Array.isArray(routeOptions.method)\n ? routeOptions.method\n : [routeOptions.method];\n\n for (const method of methods) {\n // Skip HEAD (auto-generated for GET routes) and internal routes\n if (method === 'HEAD') {continue;}\n\n const url = routeOptions.url;\n const key = `${method}:${url}`;\n\n if (!seenRoutes.has(key)) {\n seenRoutes.add(key);\n collectedRoutes.push({ method, url });\n }\n }\n}\n\n/**\n * Register the onRoute hook to collect routes\n * Must be called early, before other routes are registered\n */\nexport function registerRouteCollector(fastify: FastifyInstance): void {\n fastify.addHook('onRoute', collectRoute);\n}\n\n/**\n * Register debug routes endpoint\n */\nexport async function registerDebugRoutes(\n fastify: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n const basePath = normalizeBasePath(config.basePath);\n const routesPaths = resolvePaths(basePath, '/routes');\n\n for (const path of routesPaths) {\n fastify.get(path, async (_request, reply) => {\n // Filter to only show /api/v1 routes (skip duplicates without prefix)\n let routes = collectedRoutes.filter(r => r.url.startsWith('/api/'));\n\n // If no API routes found, show all (fallback)\n if (routes.length === 0) {\n routes = [...collectedRoutes];\n }\n\n // Sort routes by URL, then by method\n routes.sort((a, b) => {\n const urlCompare = a.url.localeCompare(b.url);\n if (urlCompare !== 0) {return urlCompare;}\n return a.method.localeCompare(b.method);\n });\n\n // Get raw printRoutes for debugging (optional)\n let raw: string | null = null;\n try {\n raw = fastify.printRoutes({ commonPrefix: false });\n } catch {\n // Ignore if not available\n }\n\n return reply.send({\n schema: 'kb.routes/1',\n ts: new Date().toISOString(),\n count: routes.length,\n routes,\n raw,\n });\n });\n }\n}\n","/**\n * @module @kb-labs/rest-api-app/routes\n * Route registration\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport type { ICronManager } from '@kb-labs/core-platform';\n\ntype RedisStatus = {\n enabled: boolean;\n healthy: boolean;\n roles: { publisher?: string | null; subscriber?: string | null; cache?: string | null };\n};\nimport { platform } from '@kb-labs/core-runtime';\nimport { EventHub } from '../events/hub';\nimport { registerEventRoutes } from './events';\nimport { registerHealthRoutes } from './health';\nimport { registerOpenAPIRoutes } from './openapi';\nimport { registerMetricsRoutes } from './metrics';\nimport { registerPluginRoutes, registerPluginSnapshotRoutes } from './plugins';\nimport { registerWorkflowRoutes } from './workflows';\nimport { registerJobsRoutes } from './jobs';\nimport { registerCacheRoutes } from './cache';\nimport { registerObservabilityRoutes } from './observability';\nimport { registerAnalyticsRoutes } from './analytics';\nimport { registerAdaptersRoutes } from './adapters';\nimport { registerLogRoutes } from './logs';\nimport { registerPlatformRoutes } from './platform';\nimport { registerAdapterCallRoutes } from './adapter-call';\nimport { registerDebugRoutes, registerRouteCollector } from './debug';\nimport type { ReadinessState } from './readiness';\nimport { isReady, resolveReadinessReason } from './readiness';\nimport { metricsCollector } from '../middleware/metrics.js';\nimport { HistoricalMetricsCollector } from '../daemon/metrics';\n\nfunction normalizeBasePath(basePath?: string): string {\n if (!basePath || basePath === '/') {\n return '';\n }\n return basePath.endsWith('/') ? basePath.slice(0, -1) : basePath;\n}\n\n/**\n * Register all routes\n */\nexport async function registerRoutes(\n server: FastifyInstance,\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry\n): Promise<void> {\n // Register route collector hook FIRST, before any routes are registered\n // This allows us to collect all routes for the /routes endpoint\n registerRouteCollector(server);\n\n const initialSnapshot = registry.snapshot();\n const initialRedisStatus = ('getRedisStatus' in registry && typeof (registry as { getRedisStatus?: () => RedisStatus }).getRedisStatus === 'function')\n ? (registry as { getRedisStatus: () => RedisStatus }).getRedisStatus()\n : undefined;\n const initialRedisStates = {\n publisher: initialRedisStatus?.roles.publisher ?? null,\n subscriber: initialRedisStatus?.roles.subscriber ?? null,\n cache: initialRedisStatus?.roles.cache ?? null,\n };\n\n const registryLoaded =\n initialSnapshot.plugins.length > 0 && !initialSnapshot.partial && !initialSnapshot.stale;\n\n const readiness: ReadinessState = {\n cliApiInitialized: true,\n registryLoaded,\n registryPartial: initialSnapshot.partial,\n registryStale: initialSnapshot.stale,\n pluginRoutesMounted: false,\n pluginMountInProgress: true,\n pluginRoutesCount: 0,\n pluginRouteErrors: 0,\n pluginRouteFailures: [],\n lastPluginMountTs: null,\n pluginRoutesLastDurationMs: null,\n redisEnabled: initialRedisStatus?.enabled ?? false,\n redisConnected: initialRedisStatus?.healthy ?? true,\n redisStates: initialRedisStates,\n };\n\n const handleRedisUpdate = (status: RedisStatus) => {\n metricsCollector.recordRedisStatus(status);\n if (!readiness.redisEnabled && status.enabled) {\n platform.logger.info('Redis support enabled', { redis: status });\n }\n if (readiness.redisConnected !== status.healthy) {\n const message = 'Redis health status changed';\n if (status.healthy) {\n platform.logger.info(message, { redis: status });\n } else {\n platform.logger.warn(message, { redis: status });\n }\n }\n const prevStates = readiness.redisStates;\n if (\n prevStates.publisher !== (status.roles.publisher ?? null) ||\n prevStates.subscriber !== (status.roles.subscriber ?? null) ||\n prevStates.cache !== (status.roles.cache ?? null)\n ) {\n platform.logger.info('Redis role state changed', { redis: status.roles });\n }\n };\n\n if (initialRedisStatus) {\n handleRedisUpdate(initialRedisStatus);\n }\n server.kbReadiness = readiness;\n\n const eventHub = server.kbEventHub ?? new EventHub();\n server.kbEventHub = eventHub;\n\n const broadcastState = async (): Promise<void> => {\n const pluginsSnapshot = metricsCollector.getLastPluginMountSnapshot();\n const redisStatus = ('getRedisStatus' in registry && typeof (registry as { getRedisStatus?: () => RedisStatus }).getRedisStatus === 'function')\n ? (registry as { getRedisStatus: () => RedisStatus }).getRedisStatus()\n : undefined;\n if (redisStatus) {\n handleRedisUpdate(redisStatus);\n readiness.redisEnabled = redisStatus.enabled;\n readiness.redisConnected = redisStatus.healthy;\n readiness.redisStates = {\n publisher: redisStatus.roles.publisher ?? null,\n subscriber: redisStatus.roles.subscriber ?? null,\n cache: redisStatus.roles.cache ?? null,\n };\n }\n try {\n const snapshot = registry.snapshot();\n eventHub.publish({\n type: 'registry',\n rev: snapshot.rev,\n generatedAt: snapshot.generatedAt,\n partial: snapshot.partial,\n stale: snapshot.stale,\n expiresAt: snapshot.expiresAt ?? null,\n ttlMs: snapshot.ttlMs ?? null,\n checksum: snapshot.checksum ?? undefined,\n checksumAlgorithm: snapshot.checksumAlgorithm,\n previousChecksum: snapshot.previousChecksum ?? null,\n });\n } catch (error) {\n platform.logger.warn('Failed to publish registry snapshot event', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n\n try {\n const health = await registry.getSystemHealth();\n const ready = isReady(readiness);\n const reason = resolveReadinessReason(readiness);\n eventHub.publish({\n type: 'health',\n status: health.status,\n ts: health.ts,\n ready,\n reason,\n registryPartial: readiness.registryPartial,\n registryStale: readiness.registryStale,\n registryLoaded: readiness.registryLoaded,\n pluginsMounted: pluginsSnapshot?.succeeded ?? 0,\n pluginsFailed: pluginsSnapshot?.failed ?? 0,\n pluginMountInProgress: readiness.pluginMountInProgress,\n pluginRoutesMounted: readiness.pluginRoutesMounted,\n lastPluginMountTs: readiness.lastPluginMountTs ?? null,\n pluginRoutesLastDurationMs: readiness.pluginRoutesLastDurationMs ?? null,\n redisEnabled: readiness.redisEnabled,\n redisHealthy: readiness.redisConnected,\n redisStates: readiness.redisStates,\n });\n } catch (error) {\n platform.logger.warn('Failed to publish health event', {\n error: error instanceof Error ? error.message : String(error),\n });\n }\n };\n\n await broadcastState();\n\n const runMount = async (): Promise<void> => {\n try {\n await registerPluginRoutes(server, config, repoRoot, registry, readiness);\n } finally {\n await broadcastState();\n }\n };\n\n // Initial mount - wait for completion before server starts listening\n platform.logger.info('Starting initial plugin route mounting');\n try {\n await runMount();\n platform.logger.info('Plugin route mounting completed');\n } catch (error) {\n platform.logger.error(\n 'Plugin route mounting failed',\n error instanceof Error ? error : new Error(String(error))\n );\n }\n\n // Create a resolved promise for initial mount (already completed)\n let mountPromise = Promise.resolve();\n\n const scheduleRemount = (): void => {\n // Check if server is already listening - Fastify doesn't allow adding routes after listen()\n // Check both Fastify's listening property and underlying Node.js server\n const isListening = server.listening ||\n (server.server && (server.server as { listening?: boolean }).listening);\n \n if (isListening) {\n platform.logger.warn(\n 'Cannot remount plugin routes: server is already listening. Restart required.'\n );\n return;\n }\n\n readiness.pluginMountInProgress = true;\n mountPromise = mountPromise\n .catch(() => void 0)\n .then(async () => {\n // Double-check server is not listening before remount\n const stillListening = server.listening ||\n (server.server && (server.server as { listening?: boolean }).listening);\n \n if (stillListening) {\n platform.logger.warn(\n 'Cannot remount plugin routes: server started listening during remount. Restart required.'\n );\n return;\n }\n platform.logger.info('Registry change detected, remounting plugin routes');\n await runMount();\n })\n .then(() => {\n platform.logger.info('Plugin route remount completed');\n })\n .catch(error => {\n platform.logger.error(\n 'Plugin route remount failed',\n error instanceof Error ? error : new Error(String(error))\n );\n });\n\n server.kbPluginMountPromise = mountPromise;\n };\n\n registry.onChange(() => {\n scheduleRemount();\n });\n\n const basePath = normalizeBasePath(config.basePath);\n\n await registerHealthRoutes(server, config, repoRoot, registry, readiness);\n\n await registerOpenAPIRoutes(server, config, repoRoot, registry);\n\n registerMetricsRoutes(server, config);\n\n await registerPluginSnapshotRoutes(server, config, registry);\n\n // Workflow SSE streaming (long-lived connections that can't go through plugin execution)\n // All CRUD operations are handled by the workflow plugin routes (/plugins/workflow/...)\n await registerWorkflowRoutes(server, config);\n\n // Register jobs management endpoints (scheduled jobs)\n const cronManager = (platform as { cron?: ICronManager }).cron ?? null;\n await registerJobsRoutes(server, config, cronManager);\n\n const platformServices = platform;\n\n await registerCacheRoutes(server, config, registry);\n\n // Initialize historical metrics collector\n const historicalCollector = new HistoricalMetricsCollector(\n platformServices.cache,\n {\n intervalMs: 5000, // Collect every 5 seconds\n debug: process.env.NODE_ENV !== 'production',\n },\n platformServices.logger\n );\n\n // Start background collection\n historicalCollector.start();\n platform.logger.info('Historical metrics collector started');\n\n // Stop collector on server close\n server.addHook('onClose', async () => {\n historicalCollector.stop();\n platform.logger.info('Historical metrics collector stopped');\n });\n\n await registerObservabilityRoutes(server, config, repoRoot, historicalCollector, platformServices);\n\n await registerAnalyticsRoutes(server, config);\n\n await registerAdaptersRoutes(server, config);\n\n await registerLogRoutes(server, config, eventHub);\n\n await registerPlatformRoutes(server, config, repoRoot);\n\n await registerAdapterCallRoutes(server);\n\n await registerDebugRoutes(server, config);\n\n await registerEventRoutes(server, basePath, registry, readiness, eventHub, config);\n}\n","/**\n * @module @kb-labs/rest-api-app/plugins\n * Fastify plugins registration\n */\n\nimport type {\n FastifyInstance,\n FastifyPluginCallback,\n FastifyBaseLogger,\n RawServerDefault,\n FastifyTypeProviderDefault,\n} from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport fastifyCors, { type FastifyCorsOptions } from '@fastify/cors';\nimport fastifyRateLimit, { type RateLimitPluginOptions } from '@fastify/rate-limit';\nimport { registerOpenAPI } from '@kb-labs/shared-http';\n\n/**\n * Register all Fastify plugins\n */\nexport async function registerPlugins(\n server: FastifyInstance,\n config: RestApiConfig\n): Promise<void> {\n // CORS plugin with profile support\n const corsProfile = config.cors.profile || 'dev';\n let corsOrigins: string[] | boolean = config.cors.origins;\n \n if (corsProfile === 'dev') {\n // Dev: allow localhost origins\n corsOrigins = config.cors.origins.length > 0 \n ? config.cors.origins \n : ['http://localhost:3000', 'http://localhost:5173']; // Vite default + Studio\n } else if (corsProfile === 'preview') {\n // Preview: specific staging domains\n corsOrigins = config.cors.origins.length > 0 \n ? config.cors.origins \n : false; // Disable if not configured\n } else if (corsProfile === 'prod') {\n // Prod: strict whitelist\n corsOrigins = config.cors.origins.length > 0 \n ? config.cors.origins \n : false; // Disable if not configured\n }\n\n const corsOptions: FastifyCorsOptions = {\n origin: corsOrigins,\n credentials: config.cors.allowCredentials,\n methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'HEAD'],\n allowedHeaders: [\n 'Content-Type', \n 'Authorization', \n 'X-Request-Id', \n 'X-Trace-Id', // Added for Studio widget tracing\n 'Idempotency-Key', \n 'X-Client-Version'\n ],\n exposedHeaders: ['X-Request-Id', 'X-Schema-Version', 'X-RateLimit-Limit', 'X-RateLimit-Remaining', 'Retry-After'],\n preflightContinue: false,\n };\n\n const corsPlugin: FastifyPluginCallback<\n FastifyCorsOptions,\n RawServerDefault,\n FastifyTypeProviderDefault,\n FastifyBaseLogger\n > = fastifyCors;\n\n await server.register(corsPlugin, corsOptions);\n\n // Add Vary: Origin header for CORS caching\n server.addHook('onSend', async (request, reply) => {\n if (corsProfile !== 'prod') {\n try {\n if (!reply.raw.headersSent) {\n reply.header('Vary', 'Origin');\n }\n } catch (err) {\n // Headers already sent, ignore\n }\n }\n });\n\n // Rate limit plugin\n if (config.rateLimit) {\n const rateLimitOpts: RateLimitPluginOptions = {\n max: config.rateLimit.max,\n timeWindow: config.rateLimit.timeWindow,\n allowList: (req) => {\n // Health/ready/studio-registry must never be rate-limited — kb-dev uses them for health checks\n const url = (req.url ?? '').split('?')[0] ?? '';\n return (\n url === '/health' ||\n url === '/api/v1/health' ||\n url === '/api/v1/ready' ||\n url === '/api/v1/observability/health' ||\n url === '/api/v1/studio/registry' ||\n url === '/api/v1/logs/stream' ||\n url.startsWith('/plugins/')\n );\n },\n addHeaders: {\n 'x-ratelimit-limit': true,\n 'x-ratelimit-remaining': true,\n 'x-ratelimit-reset': true,\n },\n };\n\n const rateLimitPlugin: FastifyPluginCallback<\n RateLimitPluginOptions,\n RawServerDefault,\n FastifyTypeProviderDefault,\n FastifyBaseLogger\n > = fastifyRateLimit;\n\n await server.register(rateLimitPlugin, rateLimitOpts);\n }\n\n // OpenAPI / Swagger UI\n // Must be registered after other plugins and before routes.\n // Spec is at /openapi.json — canonical across all services.\n // UI is disabled in production (hideUntagged: true keeps internal routes invisible).\n await registerOpenAPI(server, {\n title: 'KB Labs REST API',\n description: 'Main platform REST API — jobs, workflows, plugins, adapters',\n version: '1.0.0',\n servers: [{ url: 'http://localhost:5050', description: 'Local dev' }],\n ui: corsProfile !== 'prod',\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/envelope\n * Response envelope wrapper middleware — single source of truth for error formatting.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { errorEnvelopeSchema, type PluginErrorEnvelope } from '@kb-labs/rest-api-contracts';\n\nfunction isPluginErrorEnvelope(err: unknown): err is PluginErrorEnvelope {\n return (\n err !== null &&\n typeof err === 'object' &&\n 'status' in err &&\n (err as PluginErrorEnvelope).status === 'error' &&\n 'meta' in err &&\n typeof (err as PluginErrorEnvelope).meta === 'object' &&\n 'pluginId' in (err as PluginErrorEnvelope).meta\n );\n}\n\n/**\n * Register envelope middleware\n */\nexport function registerEnvelopeMiddleware(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n // Add response schema version header and wrap in envelope\n // Use 'onSend' hook to modify payload after Fastify serializes it but before sending\n // This ensures we get the serialized JSON string and can wrap it properly\n server.addHook('onSend', async (request, reply, payload) => {\n // Set header with try-catch to prevent ERR_HTTP_HEADERS_SENT\n try {\n if (!reply.raw.headersSent) {\n reply.header('x-schema-version', config.apiVersion);\n }\n } catch (err) {\n // Headers already sent, ignore\n }\n\n // Skip envelope wrapping for streaming responses\n if (reply.getHeader('content-type') === 'text/event-stream') {\n return payload;\n }\n\n // Serialize plain objects that reached onSend without going through\n // Fastify's serializer (happens with non-JSON content-type or in error\n // handler fallback chains). Buffer/stream/null pass through unchanged.\n if (typeof payload !== 'string') {\n if (\n payload === null ||\n payload === undefined ||\n Buffer.isBuffer(payload) ||\n typeof (payload as { pipe?: unknown }).pipe === 'function' ||\n typeof (payload as { getReader?: unknown }).getReader === 'function'\n ) {\n return payload;\n }\n // Plain object — serialize so onSendEnd receives a string\n try {\n return JSON.stringify(payload);\n } catch {\n return payload;\n }\n }\n\n // Parse the serialized JSON payload\n let parsedPayload: unknown;\n try {\n parsedPayload = JSON.parse(payload);\n } catch {\n // If not JSON, return as is\n return payload;\n }\n\n // If payload is already an envelope (has 'ok' field), return as is\n if (parsedPayload && typeof parsedPayload === 'object' && 'ok' in parsedPayload) {\n return payload;\n }\n\n // Skip raw OpenAPI spec — marked by x-openapi-spec header set in shared-http\n if (reply.getHeader('x-openapi-spec')) {\n return payload;\n }\n\n // Wrap all non-streaming responses in envelope\n // Note: Even 4xx/5xx responses with data should be wrapped with ok: true\n // (e.g., 503 for health/ready still contains useful data)\n\n // Handle empty payloads\n let dataToWrap = parsedPayload;\n\n // If payload is undefined or null, wrap as null\n if (parsedPayload === null || parsedPayload === undefined) {\n dataToWrap = null;\n }\n\n // For responses with data (including 4xx/5xx with payload), wrap with ok: true\n // The HTTP status code indicates the result, but envelope.ok indicates successful request processing\n // Only responses without payload (handled by error handler) should have ok: false\n const envelope = {\n ok: true as const,\n data: dataToWrap,\n meta: {\n requestId: request.id || '',\n durationMs: reply.elapsedTime || 0,\n apiVersion: config.apiVersion,\n },\n };\n\n // Set Content-Type header if not set\n if (!reply.getHeader('content-type')) {\n try {\n if (!reply.raw.headersSent) {\n reply.header('content-type', 'application/json');\n }\n } catch (err) {\n // Headers already sent, ignore\n }\n }\n\n // Serialize and return envelope as string\n return JSON.stringify(envelope);\n });\n\n // Single error handler: normalises both PluginErrorEnvelope (from plugin runtime)\n // and plain Errors into the canonical ErrorEnvelope { ok: false, error, meta }.\n server.setErrorHandler(async (error: unknown, request, reply) => {\n let statusCode: number;\n let errorCode: string;\n let message: string;\n let details: Record<string, unknown>;\n let cause: unknown;\n let traceId: string | undefined;\n\n if (isPluginErrorEnvelope(error)) {\n statusCode = error.http || 500;\n errorCode = error.code || 'E_PLUGIN';\n message = error.message || 'Plugin error';\n details = {\n ...(error.details ?? {}),\n pluginId: error.meta.pluginId,\n pluginVersion: error.meta.pluginVersion,\n routeOrCommand: error.meta.routeOrCommand,\n ...(error.trace ? { trace: error.trace } : {}),\n };\n cause = undefined;\n traceId = undefined;\n } else {\n const err = error as Error & { statusCode?: number; code?: string; details?: unknown; cause?: unknown; traceId?: string };\n statusCode = err.statusCode || 500;\n errorCode = err.code || 'E_INTERNAL';\n message = err.message || 'Internal server error';\n details = (err.details as Record<string, unknown>) || {};\n cause = err.cause;\n traceId = err.traceId;\n }\n\n reply.errorCode = errorCode;\n\n if (request.kbLogger) {\n request.kbLogger.error('Request error', error instanceof Error ? error : new Error(String(error)), {\n errorCode,\n statusCode,\n });\n }\n\n const errorEnvelope = errorEnvelopeSchema.parse({\n ok: false,\n error: { code: errorCode, message, details, cause, traceId },\n meta: {\n requestId: request.id,\n durationMs: reply.elapsedTime || 0,\n apiVersion: config.apiVersion,\n },\n });\n\n reply.status(statusCode).send(errorEnvelope);\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/request-id\n * Request ID generation and correlation middleware\n */\n\nimport type { FastifyInstance } from \"fastify\";\nimport { ulid } from \"ulid\";\nimport { platform } from \"@kb-labs/core-runtime\";\nimport { createHttpLogger } from \"@kb-labs/shared-http\";\n\n// ADDS: request.id, request.kbLogger | SETS REPLY: X-Request-Id, X-Trace-Id\nexport function registerRequestIdMiddleware(server: FastifyInstance): void {\n server.addHook(\"onRequest\", async (request, reply) => {\n const requestId =\n (request.headers[\"x-request-id\"] as string | undefined) || ulid();\n const traceId =\n (request.headers[\"x-trace-id\"] as string | undefined) || ulid();\n\n request.id = requestId;\n reply.header(\"X-Request-Id\", requestId);\n reply.header(\"X-Trace-Id\", traceId);\n\n // Store logger metadata on request for metrics middleware to use\n const logger = createHttpLogger(platform.logger, {\n serviceId: \"rest\",\n layer: \"service\",\n component: \"http-request\",\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: \"http.request\",\n });\n\n // Log request received\n request.kbLogger = logger;\n logger.debug(\"HTTP request started\");\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/middleware/mock-mode\n * Mock mode middleware (per-request)\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IncomingHttpHeaders } from 'http';\n\ntype MockableRequest = {\n headers: IncomingHttpHeaders;\n mockMode?: boolean;\n};\n\n/**\n * Check if mock mode should be enabled for this request\n */\nexport function isMockModeEnabled(\n request: MockableRequest,\n config: RestApiConfig\n): boolean {\n // Check per-request header\n const headerMock = request.headers['kb-mock'];\n if (headerMock === 'true' || headerMock === '1') {\n return true;\n }\n\n // Check global config\n return config.mockMode || false;\n}\n\n/**\n * Register mock mode middleware\n */\nexport function registerMockModeMiddleware(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n server.addHook('onRequest', async (request) => {\n const mockableRequest = request as MockableRequest;\n mockableRequest.mockMode = isMockModeEnabled(mockableRequest, config);\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/security-headers\n * Security headers middleware\n */\n\nimport type { FastifyInstance } from 'fastify';\n\n/**\n * Register security headers middleware\n */\nexport function registerSecurityHeadersMiddleware(server: FastifyInstance): void {\n server.addHook('onRequest', async (request, reply) => {\n reply.header('X-Content-Type-Options', 'nosniff');\n reply.header('X-Frame-Options', 'DENY');\n reply.header('X-XSS-Protection', '1; mode=block');\n reply.header('Referrer-Policy', 'strict-origin-when-cross-origin');\n reply.header('Permissions-Policy', 'geolocation=(), microphone=(), camera=()');\n\n if (request.protocol === 'https') {\n reply.header('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');\n }\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/cache\n * Cache middleware for ETag/Last-Modified support\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { createHash } from 'crypto';\n\n/**\n * Generate ETag from content\n */\nexport function generateETag(content: string | Buffer | object): string {\n const contentStr = typeof content === 'object' ? JSON.stringify(content) : content.toString();\n const hash = createHash('sha256').update(contentStr).digest('hex');\n return `\"${hash.substring(0, 16)}\"`; // Short hash for ETag\n}\n\n/**\n * Register cache middleware\n */\nexport function registerCacheMiddleware(server: FastifyInstance): void {\n server.addHook('onSend', async (request, reply, payload) => {\n // Only cache successful GET requests\n if (request.method !== 'GET' || reply.statusCode >= 300) {\n return payload;\n }\n\n // Skip cache for streaming responses\n if (reply.getHeader('content-type') === 'text/event-stream') {\n return payload;\n }\n\n // Check If-None-Match header (ETag)\n const ifNoneMatch = request.headers['if-none-match'];\n if (ifNoneMatch && payload) {\n const payloadStr = typeof payload === 'object' ? JSON.stringify(payload) : String(payload);\n const etag = generateETag(payloadStr);\n \n if (ifNoneMatch === etag || ifNoneMatch === `W/${etag}`) {\n reply.code(304).header('ETag', etag);\n return undefined; // Not Modified\n }\n \n reply.header('ETag', etag);\n }\n\n // Check If-Modified-Since header (Last-Modified)\n const ifModifiedSince = request.headers['if-modified-since'];\n if (ifModifiedSince && payload) {\n // For now, we'll use finishedAt from job metadata if available\n // This is a simplified implementation - in production, use actual modification time\n const lastModified = new Date().toUTCString();\n reply.header('Last-Modified', lastModified);\n \n const ifModifiedSinceDate = new Date(ifModifiedSince);\n const lastModifiedDate = new Date(lastModified);\n \n if (lastModifiedDate <= ifModifiedSinceDate) {\n reply.code(304);\n return undefined; // Not Modified\n }\n }\n\n return payload;\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/process-error-guard\n * Process-level error guard: catches uncaught exceptions and unhandled rejections.\n * Request-level error formatting is handled by envelope middleware.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\n\n// NOT a request hook — installs process.on('uncaughtException', 'unhandledRejection')\nexport function registerProcessErrorGuard(server: FastifyInstance): void {\n // Keep a reference to server so the signature stays compatible,\n // but request errors are handled by envelope.ts setErrorHandler.\n void server;\n\n process.on('uncaughtException', (error: Error) => {\n platform.logger.fatal('Uncaught exception', error, { source: 'process-error-guard' });\n });\n\n process.on('unhandledRejection', (reason: unknown) => {\n const error = reason instanceof Error ? reason : new Error(String(reason));\n platform.logger.error('Unhandled rejection', error, { source: 'process-error-guard' });\n });\n}\n","/**\n * @module @kb-labs/rest-api-app/middleware/startup-throttle\n * Throttles concurrent requests during service startup to prevent request storms.\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { isReady } from '../routes/readiness';\n\ntype StartupCounters = {\n inFlight: number;\n};\n\ntype StartupConfig = {\n maxConcurrent?: number;\n queueLimit?: number;\n timeoutMs?: number;\n retryAfterSeconds?: number;\n};\n\n// ADDS: request.kbStartupGuardActive, request.kbStartupGuardTimer\nexport function registerStartupThrottle(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n const startupConfig = (config as RestApiConfig & { startup?: StartupConfig }).startup;\n if (!startupConfig) {\n return;\n }\n\n const counters: StartupCounters = {\n inFlight: 0,\n };\n\n server.kbStartupGuard = counters;\n\n const maxConcurrent = startupConfig.maxConcurrent ?? 32;\n const queueLimit = startupConfig.queueLimit ?? 128;\n const timeoutMs = startupConfig.timeoutMs ?? 5000;\n const retryAfterSeconds = startupConfig.retryAfterSeconds ?? 2;\n\n server.addHook('onRequest', (request, reply, done) => {\n const readiness = server.kbReadiness;\n const infraReady = readiness ? isReady(readiness) : false;\n\n if (infraReady) {\n done();\n return;\n }\n\n if (counters.inFlight >= queueLimit) {\n reply\n .code(503)\n .header('Retry-After', retryAfterSeconds.toString())\n .send({\n schema: 'kb.startup/1',\n status: 'initializing',\n reason: 'startup_queue_limit',\n maxConcurrent,\n queueLimit,\n });\n return;\n }\n\n counters.inFlight += 1;\n request.kbStartupGuardActive = true;\n\n const timer = setTimeout(() => {\n if (!reply.sent) {\n reply\n .code(504)\n .header('Retry-After', retryAfterSeconds.toString())\n .send({\n schema: 'kb.startup/1',\n status: 'timeout',\n reason: 'startup_timeout',\n timeoutMs,\n });\n }\n }, timeoutMs);\n timer.unref();\n request.kbStartupGuardTimer = timer;\n\n if (counters.inFlight > maxConcurrent) {\n if (request.kbLogger) {\n request.kbLogger.warn('Startup guard concurrency threshold exceeded', {\n inFlight: counters.inFlight,\n maxConcurrent,\n });\n }\n }\n\n done();\n });\n\n server.addHook('onResponse', (request, _reply, done) => {\n if (request.kbStartupGuardActive) {\n counters.inFlight = Math.max(0, counters.inFlight - 1);\n if (request.kbStartupGuardTimer) {\n clearTimeout(request.kbStartupGuardTimer);\n request.kbStartupGuardTimer = undefined;\n }\n request.kbStartupGuardActive = false;\n }\n done();\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/request-timeout\n * Enforce route-level request timeouts\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { metricsCollector } from './metrics';\n\ntype RouteConfig = {\n kbRouteBudgetMs?: number | null;\n};\n\nexport function registerRequestTimeoutGuard(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n const defaultTimeout = config.timeouts?.requestTimeout ?? 30_000;\n\n server.addHook('onRequest', (request, reply, done) => {\n const routeConfig = (request.routeOptions?.config || {}) as RouteConfig;\n let budget = typeof routeConfig.kbRouteBudgetMs === 'number' && routeConfig.kbRouteBudgetMs > 0\n ? routeConfig.kbRouteBudgetMs\n : null;\n\n if (!budget) {\n const normalized =\n request.routeOptions?.url ??\n request.url;\n const inferred = normalized ? metricsCollector.getRouteBudget(request.method, normalized) : null;\n if (inferred && inferred > 0) {\n budget = inferred;\n }\n }\n\n if (!budget || budget <= 0) {\n budget = defaultTimeout;\n }\n\n if (!budget || budget <= 0) {\n done();\n return;\n }\n\n reply.raw.setTimeout(budget, () => {\n if (reply.sent) {\n return;\n }\n reply\n .code(504)\n .header('Content-Type', 'application/json')\n .send({\n schema: 'kb.errors/timeout/1',\n status: 'error',\n http: 504,\n code: 'E_GATEWAY_TIMEOUT',\n message: 'Request timed out',\n meta: {\n method: request.method,\n route: request.routeOptions?.url ?? request.url,\n timeoutMs: budget,\n },\n });\n });\n\n done();\n });\n}\n\n","/**\n * @module @kb-labs/rest-api-app/middleware/tenant-rate-limit\n * Wires TenantRateLimiter (backed by platform.cache) into Fastify.\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport type { ICache } from '@kb-labs/core-platform';\nimport { TenantRateLimiter, getDefaultTenantTier } from '@kb-labs/core-tenant';\n\ninterface TenantRateLimiterLike {\n checkLimit(tenantId: string, resource: string): Promise<{\n allowed: boolean;\n limit: number;\n remaining: number;\n resetAt: number;\n }>;\n}\n\nexport function extractTenantId(request: FastifyRequest): string {\n return (\n (request.headers['x-tenant-id'] as string) ||\n process.env.KB_TENANT_ID ||\n 'default'\n );\n}\n\nexport function createRateLimitMiddleware(rateLimiter: TenantRateLimiterLike) {\n return async function rateLimitMiddleware(\n request: FastifyRequest,\n reply: FastifyReply,\n ) {\n const tenantId = extractTenantId(request);\n const result = await rateLimiter.checkLimit(tenantId, 'requests');\n\n reply.header('X-RateLimit-Limit', result.limit);\n reply.header('X-RateLimit-Remaining', result.remaining);\n reply.header('X-RateLimit-Reset', result.resetAt);\n\n if (!result.allowed) {\n const retryAfter = Math.ceil((result.resetAt - Date.now()) / 1000);\n reply.header('Retry-After', retryAfter);\n return reply.code(429).send({\n error: 'RATE_LIMIT_EXCEEDED',\n message: 'Too many requests. Please try again later.',\n retryAfter,\n limit: result.limit,\n resetAt: new Date(result.resetAt).toISOString(),\n });\n }\n\n request.tenantId = tenantId;\n };\n}\n\n/**\n * Register tenant-aware rate limiting as a global preHandler hook.\n *\n * Uses platform.cache as the backing store — same adapter that all other\n * platform components use (memory in dev, Redis in prod, etc.).\n *\n * The 'default' tenant (used when no X-Tenant-ID header is present) gets the\n * tier from KB_TENANT_DEFAULT_TIER env var (defaults to 'free' if unset).\n * In E2E / self-hosted environments set KB_TENANT_DEFAULT_TIER=enterprise to\n * avoid hitting the 10 req/min free-tier rate limit.\n */\nexport function registerTenantRateLimitMiddleware(\n server: FastifyInstance,\n cache: ICache\n): void {\n const limiter = new TenantRateLimiter(cache);\n // Apply the environment-configured tier to the 'default' tenant so that\n // unauthenticated / single-tenant deployments respect KB_TENANT_DEFAULT_TIER.\n limiter.setTier('default', getDefaultTenantTier());\n const handler = createRateLimitMiddleware(limiter);\n server.addHook('preHandler', handler);\n}\n\nexport { TenantRateLimiter };\n","/**\n * @module @kb-labs/rest-api-app/middleware\n * Middleware registration\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport { platform } from '@kb-labs/core-runtime';\nimport { registerEnvelopeMiddleware } from './envelope';\nimport { registerRequestIdMiddleware } from './request-id';\nimport { registerMockModeMiddleware } from './mock-mode';\nimport { registerSecurityHeadersMiddleware } from './security-headers';\nimport { registerCacheMiddleware } from './cache';\nimport { registerMetricsMiddleware } from './metrics';\nimport { registerProcessErrorGuard } from './process-error-guard';\nimport { registerStartupThrottle } from './startup-throttle';\nimport { registerRequestTimeoutGuard } from './request-timeout';\nimport { registerTenantRateLimitMiddleware } from './tenant-rate-limit';\n\n/**\n * Middleware chain — порядок регистрации = порядок выполнения\n * (onRequest: top→bottom, onSend: bottom→top)\n *\n * # File Adds to request\n * ─── ──────────────────────── ─────────────────────────────────────────\n * 1 startup-throttle kbStartupGuardActive, kbStartupGuardTimer\n * 2 security-headers (only reply headers)\n * 3 request-id request.id, kbLogger\n * 4 tenant-rate-limit tenantId\n * 5 mock-mode (short-circuits to mock response)\n * 6 request-timeout (reads kbLogger)\n * 7 metrics kbMetricsStart\n * 8 envelope (wraps errors; must run before cache)\n * 9 cache (reads ETag; may return 304)\n * ── process-error-guard NOT a request hook — process.on handlers\n */\nexport function registerMiddleware(\n server: FastifyInstance,\n config: RestApiConfig\n): void {\n registerStartupThrottle(server, config);\n registerSecurityHeadersMiddleware(server);\n registerRequestIdMiddleware(server);\n registerTenantRateLimitMiddleware(server, platform.cache);\n registerMockModeMiddleware(server, config);\n registerRequestTimeoutGuard(server, config);\n registerMetricsMiddleware(server);\n // Envelope runs before cache: ETag is computed on the final wrapped payload\n registerEnvelopeMiddleware(server, config);\n registerCacheMiddleware(server);\n // Process-level guard (uncaughtException / unhandledRejection) — not a request hook\n registerProcessErrorGuard(server);\n}\n","/**\n * @module @kb-labs/rest-api-app/server\n * Fastify server setup\n */\n\nimport Fastify from 'fastify';\nimport type { FastifyInstance } from 'fastify';\nimport type { FastifyBaseLogger } from 'fastify';\nimport type { RestApiConfig } from '@kb-labs/rest-api-core';\nimport type { IEntityRegistry } from '@kb-labs/core-registry';\nimport { registerRoutes } from './routes/index';\nimport { registerPlugins } from './plugins';\nimport { registerMiddleware } from './middleware/index';\nimport { platform } from '@kb-labs/core-runtime';\nimport { randomUUID } from 'node:crypto';\nimport { readFileSync } from 'node:fs';\nimport { existsSync } from 'node:fs';\nimport type { ILogger } from '@kb-labs/core-platform';\n\n/**\n * Fastify internal symbol to disable request logging\n */\nconst kDisableRequestLogging = Symbol.for('fastify.disableRequestLogging');\n\nfunction serializeForLog(meta: object): string {\n return JSON.stringify(meta, (_key, value) => {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack };\n }\n return value;\n });\n}\n\n/**\n * Create a Pino-compatible wrapper for ILogger\n * Fastify 5 expects a Pino instance, but we want vendor independence\n */\nfunction createPinoCompatibleLogger(logger: ILogger): FastifyBaseLogger {\n const levels = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n };\n\n return {\n // Pino log levels\n trace: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.debug(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.debug(msg, meta);\n }\n },\n debug: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.debug(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.debug(msg, meta);\n }\n },\n info: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.info(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.info(msg, meta);\n }\n },\n warn: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.warn(serializeForLog(msg), msg as Record<string, unknown>);\n } else {\n const meta = (typeof args[0] === 'object' && args[0] !== null) ? args[0] as Record<string, unknown> : undefined;\n logger.warn(msg, meta);\n }\n },\n error: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.error(serializeForLog(msg), msg instanceof Error ? msg : undefined);\n } else {\n logger.error(msg, args[0] instanceof Error ? args[0] : undefined);\n }\n },\n fatal: (msg: string | object, ...args: unknown[]) => {\n if (typeof msg === 'object') {\n logger.error(`[FATAL] ${serializeForLog(msg)}`, msg instanceof Error ? msg : undefined);\n } else {\n logger.error(`[FATAL] ${msg}`, args[0] instanceof Error ? args[0] : undefined);\n }\n },\n // Pino child method\n child: (bindings: Record<string, unknown>) => {\n const childLogger = logger.child(bindings);\n return createPinoCompatibleLogger(childLogger);\n },\n // Pino required properties for Fastify 5\n level: 'info',\n levels: {\n values: levels,\n labels: { 10: 'trace', 20: 'debug', 30: 'info', 40: 'warn', 50: 'error', 60: 'fatal' },\n },\n silent: () => {},\n // Pino version symbol (required by Fastify 5 validation)\n [Symbol.for('pino.version')]: '8.0.0',\n } as unknown as FastifyBaseLogger;\n}\n\n/**\n * Create and configure Fastify server\n */\nexport async function createServer(\n config: RestApiConfig,\n repoRoot: string,\n registry: IEntityRegistry\n): Promise<FastifyInstance> {\n // HTTP/2 configuration (requires HTTPS)\n const useHttp2 = config.http2?.enabled ?? false;\n const allowHTTP1 = config.http2?.allowHTTP1 ?? true;\n\n // SSL configuration\n let httpsOptions: { allowHTTP1: boolean; key: Buffer; cert: Buffer } | undefined;\n if (useHttp2 && config.ssl?.keyPath && config.ssl?.certPath) {\n const keyPath = config.ssl.keyPath;\n const certPath = config.ssl.certPath;\n\n if (existsSync(keyPath) && existsSync(certPath)) {\n httpsOptions = {\n allowHTTP1,\n key: readFileSync(keyPath),\n cert: readFileSync(certPath),\n };\n } else {\n platform.logger.warn('HTTP/2 enabled but SSL certificates not found, falling back to HTTP/1.1', {\n keyPath,\n certPath,\n });\n }\n }\n\n // Create platform logger child for REST layer\n const restLogger = platform.logger.child({\n layer: 'rest',\n service: 'server',\n traceId: randomUUID(),\n });\n\n // Fastify 5 is too strict with logger validation, so disable it and use hooks\n const server = useHttp2 && httpsOptions\n ? Fastify({\n logger: false,\n requestIdHeader: 'X-Request-Id',\n requestIdLogLabel: 'requestId',\n disableRequestLogging: true,\n requestTimeout: config.timeouts?.requestTimeout || 30000,\n bodyLimit: config.timeouts?.bodyLimit || 10485760,\n http2: true,\n https: httpsOptions,\n })\n : Fastify({\n logger: false,\n requestIdHeader: 'X-Request-Id',\n requestIdLogLabel: 'requestId',\n disableRequestLogging: true,\n requestTimeout: config.timeouts?.requestTimeout || 30000,\n bodyLimit: config.timeouts?.bodyLimit || 10485760,\n });\n\n // Add our own logger to server instance\n (server as { log: ILogger }).log = restLogger;\n\n // Override child logger factory to return our custom logger with disable flag\n server.setChildLoggerFactory((logger, bindings, opts, rawReq) => {\n const customLogger = {\n [kDisableRequestLogging]: true, // Disable Fastify's built-in request logging\n debug: (_obj: unknown, _msg?: string) => {},\n info: (_obj: unknown, _msg?: string) => {},\n warn: (_obj: unknown, _msg?: string) => {},\n error: (_obj: unknown, _msg?: string) => {},\n fatal: (_obj: unknown, _msg?: string) => {},\n trace: (_obj: unknown, _msg?: string) => {},\n silent: (_obj: unknown, _msg?: string) => {},\n child: () => customLogger,\n level: 'silent',\n };\n return customLogger as unknown as FastifyBaseLogger;\n });\n\n // Log protocol being used\n if (useHttp2 && httpsOptions) {\n restLogger.info('HTTP/2 enabled with HTTPS', {\n allowHTTP1Fallback: allowHTTP1,\n });\n } else if (useHttp2) {\n restLogger.warn('HTTP/2 requested but SSL certificates missing, using HTTP/1.1');\n } else {\n restLogger.info('Using HTTP/1.1');\n }\n\n // Store registry in server instance\n server.registry = registry;\n\n // Register plugins\n await registerPlugins(server as unknown as FastifyInstance, config);\n\n // Register middleware\n registerMiddleware(server as unknown as FastifyInstance, config);\n\n // Register routes\n await registerRoutes(server as unknown as FastifyInstance, config, repoRoot, registry);\n\n return server as unknown as FastifyInstance;\n}\n\n","/**\n * @module @kb-labs/rest-api-app/bootstrap\n * Server bootstrap and startup\n */\n\nimport { loadRestApiConfig } from \"@kb-labs/rest-api-core\";\nimport { createServer } from \"./server\";\nimport { createRegistry, type IEntityRegistry } from \"@kb-labs/core-registry\";\nimport type { IServiceTransport } from \"@kb-labs/core-platform\";\nimport { makeAssemblyHook } from \"@kb-labs/plugin-runtime\";\nimport { runService, type ServiceContext } from \"@kb-labs/shared-daemon\";\nimport { getListenOptions } from \"@kb-labs/shared-http\";\nimport { SystemMetricsCollector } from \"./daemon/metrics\";\nimport {\n metricsCollector as requestMetricsCollector,\n restDomainOperationMetrics,\n} from \"./middleware/metrics.js\";\nimport { randomUUID } from \"node:crypto\";\nimport { performance } from \"node:perf_hooks\";\n\n// Singleton CLI API instance for cleanup\nlet registryInstance: IEntityRegistry | null = null;\n\n// System metrics collector instance for cleanup\nlet metricsCollector: SystemMetricsCollector | null = null;\n\n/**\n * Bootstrap REST API server\n */\nexport async function bootstrap(cwd: string = process.cwd()): Promise<void> {\n await runService({\n appId: \"rest-api\",\n serviceId: \"rest\",\n startDir: cwd,\n defaultPort: 5050,\n portEnvVar: \"REST_API_PORT\",\n defaultHost: \"0.0.0.0\",\n hostEnvVar: \"REST_API_HOST\",\n platform: {\n assemblyHook: makeAssemblyHook(),\n },\n setup: startRestApi,\n });\n}\n\nasync function startRestApi({\n platform,\n projectRoot: repoRoot,\n platformRoot,\n logger: serviceLogger,\n}: ServiceContext): Promise<() => Promise<void>> {\n // Platform launch has already loaded the layered environment.\n const { config, diagnostics } = await loadRestApiConfig(repoRoot);\n\n // Now we can use platform.logger (configured from kb.config.json)\n const startupRequestId = `rest-startup-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const startupTraceId = randomUUID();\n const startupSpanId = randomUUID();\n const bootstrapLogger = serviceLogger\n .forComponent(\"rest-bootstrap\")\n .forOperation(\"rest.bootstrap\", {\n requestId: startupRequestId,\n traceId: startupTraceId,\n spanId: startupSpanId,\n })\n .with({ invocationId: startupSpanId, executionId: startupSpanId });\n\n if (diagnostics.length > 0) {\n bootstrapLogger.warn(\"Configuration diagnostics\", {\n diagnosticsCount: diagnostics.length,\n });\n for (const diagnostic of diagnostics) {\n bootstrapLogger.warn(\"Configuration diagnostic\", {\n level: diagnostic.level,\n message: diagnostic.message,\n });\n }\n }\n\n bootstrapLogger.info(\"Resolved service roots\", {\n projectRoot: repoRoot,\n platformRoot,\n });\n bootstrapLogger.info(\"Platform adapters initialized\");\n\n // Initialize entity registry\n bootstrapLogger.info(\"Initializing entity registry\");\n\n const isDevelopment = process.env.NODE_ENV !== \"production\";\n const snapshotTTL = isDevelopment\n ? 10 * 60 * 1000 // 10 minutes for development\n : 60 * 60 * 1000; // 1 hour for production\n\n // Project root is always the primary source for plugin discovery.\n // In installed mode (platform.dir set), the platform lock fills gaps —\n // but project marketplace.lock wins on conflict (project overrides platform).\n const registryInitStart = performance.now();\n const registry = await createRegistry({\n root: repoRoot,\n platformRoot: platformRoot !== repoRoot ? platformRoot : undefined,\n cache: {\n ttlMs: snapshotTTL,\n adapter: platform.cache,\n },\n });\n restDomainOperationMetrics.recordOperation(\n \"registry.init\",\n performance.now() - registryInitStart,\n \"ok\",\n );\n\n const plugins = registry.listPlugins();\n bootstrapLogger.info(\"Entity registry initialized\", {\n pluginsFound: plugins.length,\n pluginIds: plugins.map((p) => `${p.id}@${p.version}`),\n });\n\n registryInstance = registry;\n\n registry.onChange((diff) => {\n restDomainOperationMetrics.recordOperation(\"registry.refresh\", 0, \"ok\");\n bootstrapLogger.info(\"Registry changed\", {\n added: diff.added.length,\n removed: diff.removed.length,\n changed: diff.changed.length,\n });\n });\n\n const server = await createServer(config, repoRoot, registry);\n\n // Start system metrics collector\n bootstrapLogger.info(\"Starting system metrics collector\");\n metricsCollector = new SystemMetricsCollector(\"rest\", () =>\n requestMetricsCollector.getActiveRequests(),\n );\n await metricsCollector.start(10000, 60000); // Collect every 10s, TTL 60s\n\n // Bind port from the transport (single declarative network source): rest is a\n // TCP service in the serviceTransport map, so it listens on exactly the port\n // the transport publishes for 'rest' — keeping bind and route consistent\n // (incl. any KB_NET_OFFSET shift). Falls back to config.port when no transport.\n const restTransport =\n platform.getAdapter<IServiceTransport>(\"serviceTransport\");\n const restAddr = restTransport?.listenAddress?.(\"rest\");\n const listenPort =\n restAddr && \"port\" in restAddr ? restAddr.port : config.port;\n const restAddrHost =\n restAddr && \"host\" in restAddr ? restAddr.host : undefined;\n\n // Start server. Host precedence: REST_API_HOST env > transport's advisory host\n // > 0.0.0.0 (0.0.0.0 keeps Docker port-forwarding working; set\n // REST_API_HOST=127.0.0.1 to restrict to loopback when all traffic is routed\n // through the gateway).\n const restHost = process.env.REST_API_HOST ?? restAddrHost ?? \"0.0.0.0\";\n const address = await server.listen(getListenOptions(listenPort, restHost));\n\n bootstrapLogger.info(\"REST API server listening\", { address });\n\n // Setup graceful shutdown\n const shutdown = async (signal: string) => {\n bootstrapLogger.warn(\"Received shutdown signal\", { signal });\n\n // Stop metrics collector\n if (metricsCollector) {\n metricsCollector.stop();\n metricsCollector = null;\n }\n\n // Dispose CLI API\n if (registryInstance) {\n await registryInstance.dispose();\n registryInstance = null;\n }\n\n // Close server\n await server.close();\n bootstrapLogger.info(\"Server closed\");\n };\n\n return () => shutdown(\"service-runner\");\n}\n","/**\n * @module @kb-labs/rest-api-app\n * REST API application entry point\n */\n\nimport { bootstrap } from \"./bootstrap\";\n\n// process.cwd() = workspace root when launched via `node ./platform/kb-labs-rest-api/.../dist/index.js`\nbootstrap(process.cwd()).catch(() => {\n // runService() already emitted the canonical platform/service failure event.\n // Setting exitCode lets its logger flush without duplicating an unstructured stack.\n process.exitCode = 1;\n});\n"]}
|