@kb-labs/gateway-app 2.18.0 → 2.20.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 CHANGED
@@ -1438,8 +1438,33 @@ function createWsHandler(cache, jwtConfig, logger, hostRegistry) {
1438
1438
  }
1439
1439
  const clientRecord = await getClientByHostId(cache, hostId);
1440
1440
  const registryCaps = (clientRecord?.capabilities ?? []).map((c) => HostCapabilitySchema.safeParse(c)).filter((r) => r.success).map((r) => r.data);
1441
- const validatedHelloCaps = clientRecord ? [] : helloCaps.map((c) => HostCapabilitySchema.safeParse(c)).filter((r) => r.success).map((r) => r.data);
1442
- const capabilities = clientRecord ? registryCaps : validatedHelloCaps;
1441
+ let capabilities;
1442
+ if (clientRecord) {
1443
+ capabilities = registryCaps;
1444
+ } else {
1445
+ let existingDescriptor = null;
1446
+ try {
1447
+ existingDescriptor = await registry.get(hostId, namespaceId);
1448
+ } catch (err) {
1449
+ logDiagnosticEvent(logger, {
1450
+ domain: "service",
1451
+ event: "gateway.hosts.ws.handshake",
1452
+ level: "warn",
1453
+ reasonCode: "registry_lookup_failed",
1454
+ message: "Failed to look up host descriptor from registry, falling back to hello capabilities",
1455
+ outcome: "partial",
1456
+ error: err instanceof Error ? err : new Error(String(err)),
1457
+ serviceId: "gateway",
1458
+ route: "/hosts/connect",
1459
+ evidence: { hostId, namespaceId }
1460
+ });
1461
+ }
1462
+ if (existingDescriptor && existingDescriptor.capabilities.length > 0) {
1463
+ capabilities = existingDescriptor.capabilities.map((c) => HostCapabilitySchema.safeParse(c)).filter((r) => r.success).map((r) => r.data);
1464
+ } else {
1465
+ capabilities = helloCaps.map((c) => HostCapabilitySchema.safeParse(c)).filter((r) => r.success).map((r) => r.data);
1466
+ }
1467
+ }
1443
1468
  await registry.ensureRegistered(hostId, namespaceId, clientRecord?.name ?? hostId, capabilities);
1444
1469
  await registry.setOnline(hostId, namespaceId, connectionId);
1445
1470
  globalDispatcher.registerConnection(hostId, namespaceId, socket, capabilities);
@@ -2420,7 +2445,6 @@ async function bootstrap(repoRoot = process.cwd()) {
2420
2445
  persistentStore: !!hostStore
2421
2446
  }
2422
2447
  });
2423
- throw error;
2424
2448
  }
2425
2449
  if (restoredCount > 0) {
2426
2450
  logger.info("Restored hosts from store", { count: restoredCount });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts","../src/auth/tokens.ts","../src/auth/middleware.ts","../src/auth/routes.ts","../src/execute/execution-registry.ts","../src/clients/subscription-registry.ts","../src/execute/errors.ts","../src/execute/retry-executor.ts","../src/execute/routes.ts","../src/llm/routes.ts","../src/telemetry/routes.ts","../src/platform/routes.ts","../src/docs/routes.ts","../src/hosts/registry.ts","../src/hosts/ws-handler.ts","../src/clients/ws-handler.ts","../src/ws/gateway-ws.ts","../src/observability/collector.ts","../src/server.ts","../src/bootstrap.ts","../src/index.ts"],"names":["result","response","platform","randomUUID","logDiagnosticEvent","HELLO_TIMEOUT_MS","send","AuthService","createCorrelatedLogger"],"mappings":"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","file":"index.js","sourcesContent":["import { findNearestConfig, readJsonWithDiagnostics } from '@kb-labs/core-config';\nimport { GatewayConfigSchema, type GatewayConfig } from '@kb-labs/gateway-contracts';\n\nexport async function loadGatewayConfig(repoRoot: string): Promise<GatewayConfig> {\n const { path: configPath } = await findNearestConfig({\n startDir: repoRoot,\n filenames: ['.kb/kb.config.json', 'kb.config.json'],\n });\n\n if (!configPath) {\n return GatewayConfigSchema.parse({});\n }\n\n const result = await readJsonWithDiagnostics<{ gateway?: unknown }>(configPath);\n if (!result.ok || !result.data.gateway) {\n return GatewayConfigSchema.parse({});\n }\n\n return GatewayConfigSchema.parse(result.data.gateway);\n}\n","import type { ICache } from '@kb-labs/core-platform';\nimport type { AuthContext } from '@kb-labs/gateway-contracts';\nimport { AuthService, type JwtConfig } from '@kb-labs/gateway-auth';\n\n/**\n * Resolve a Bearer token to an AuthContext.\n * Tries JWT verification first, falls back to static machine token (dev compat).\n */\nexport async function resolveToken(\n token: string,\n cache: ICache,\n jwtConfig: JwtConfig,\n): Promise<AuthContext | null> {\n const authService = new AuthService(cache, jwtConfig);\n\n // Try JWT first (v2)\n const jwtContext = await authService.verify(token);\n if (jwtContext) {return jwtContext;}\n\n // Fallback: static machine token in ICache (v1 compat — dev-studio-token etc.)\n const machineEntry = await cache.get<{ hostId: string; namespaceId: string }>(\n `host:token:${token}`,\n );\n if (machineEntry) {\n return {\n type: 'machine',\n userId: machineEntry.hostId,\n namespaceId: machineEntry.namespaceId,\n tier: 'free',\n permissions: ['host:connect'],\n };\n }\n\n return null;\n}\n\nexport function extractBearerToken(authHeader: string | undefined): string | null {\n if (!authHeader) {return null;}\n const match = authHeader.match(/^Bearer\\s+(.+)$/i);\n return match ? (match[1] ?? null) : null;\n}\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport type { ICache } from '@kb-labs/core-platform';\nimport type { AuthContext } from '@kb-labs/gateway-contracts';\nimport type { JwtConfig } from '@kb-labs/gateway-auth';\nimport { resolveToken, extractBearerToken } from './tokens.js';\n\n// Routes that don't require auth (handle their own auth internally)\nconst PUBLIC_ROUTES = new Set([\n '/health',\n '/hosts/register',\n // /hosts/connect and /clients/connect are handled at the HTTP upgrade level\n // by gateway-ws.ts (raw ws) — they never reach Fastify routing.\n '/auth/register',\n '/auth/token',\n '/auth/refresh',\n '/internal/dispatch', // has its own x-internal-secret auth\n '/internal/resolve-host', // has its own x-internal-secret auth\n]);\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n authContext?: AuthContext;\n }\n}\n\nexport function createAuthMiddleware(cache: ICache, jwtConfig: JwtConfig) {\n return async function authMiddleware(\n request: FastifyRequest,\n reply: FastifyReply,\n ): Promise<void> {\n const rawPath = new URL(request.url, 'http://localhost').pathname;\n const routePath = rawPath.replace(/\\/+/g, '/').replace(/\\/+$/, '') || '/';\n if (PUBLIC_ROUTES.has(routePath)) {return;}\n\n // Bearer header takes precedence; fall back to ?access_token= for SSE\n // connections where browsers cannot set custom headers.\n const queryToken = (request.query as Record<string, string | undefined>)['access_token'];\n const token = extractBearerToken(request.headers.authorization) ?? queryToken ?? null;\n if (!token) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Missing Authorization header' });\n }\n\n const authContext = await resolveToken(token, cache, jwtConfig);\n if (!authContext) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Invalid token' });\n }\n\n request.authContext = authContext;\n };\n}\n","/**\n * Auth routes — public endpoints for agent registration and token management.\n * POST /auth/register — register new agent, get clientId + clientSecret\n * POST /auth/token — exchange credentials for JWT pair\n * POST /auth/refresh — rotate refresh token, get new pair\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { AuthService } from '@kb-labs/gateway-auth';\nimport {\n RegisterRequestSchema,\n TokenRequestSchema,\n RefreshRequestSchema,\n} from '@kb-labs/gateway-contracts';\n\nexport function registerAuthRoutes(app: FastifyInstance, authService: AuthService): void {\n // Register new agent\n app.post('/auth/register', { schema: { tags: ['Auth'], summary: 'Register new agent and get credentials' } }, async (request, reply) => {\n const parsed = RegisterRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const result = await authService.register(parsed.data);\n return reply.code(201).send(result);\n });\n\n // Issue token pair\n app.post('/auth/token', { schema: { tags: ['Auth'], summary: 'Issue JWT token pair' } }, async (request, reply) => {\n const parsed = TokenRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const tokens = await authService.issueTokens(parsed.data.clientId, parsed.data.clientSecret);\n if (!tokens) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Invalid credentials' });\n }\n\n return reply.send(tokens);\n });\n\n // Refresh token pair\n app.post('/auth/refresh', { schema: { tags: ['Auth'], summary: 'Refresh JWT token pair' } }, async (request, reply) => {\n const parsed = RefreshRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const tokens = await authService.refreshTokens(parsed.data.refreshToken);\n if (!tokens) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Invalid or expired refresh token' });\n }\n\n return reply.send(tokens);\n });\n}\n","/**\n * @module gateway-app/execute/execution-registry\n *\n * Tracks active executions with AbortController for cancellation.\n *\n * Lifecycle:\n * 1. POST /execute → registry.register(executionId, ...) → AbortSignal\n * 2. POST /execute/:id/cancel → registry.cancel(executionId, reason) → abort()\n * 3. Execution completes or aborted → registry.remove(executionId)\n *\n * Also supports host disconnect: cancelByHost() aborts all executions\n * dispatched to a host that went offline.\n */\n\nimport type { CancellationReason } from '@kb-labs/core-contracts';\n\nexport interface ActiveExecution {\n executionId: string;\n requestId: string;\n namespaceId: string;\n hostId: string;\n pluginId: string;\n handlerRef: string;\n controller: AbortController;\n startedAt: number;\n cancelledReason?: CancellationReason;\n}\n\nexport class ExecutionRegistry {\n private executions = new Map<string, ActiveExecution>();\n\n /** Register a new execution. Returns AbortSignal to wire into the dispatch. */\n register(entry: Omit<ActiveExecution, 'controller' | 'startedAt'>): AbortSignal {\n const controller = new AbortController();\n this.executions.set(entry.executionId, {\n ...entry,\n controller,\n startedAt: Date.now(),\n });\n return controller.signal;\n }\n\n /** Cancel an execution by ID. Returns true if found and aborted. */\n cancel(executionId: string, reason: CancellationReason): boolean {\n const entry = this.executions.get(executionId);\n if (!entry) { return false; }\n if (entry.controller.signal.aborted) { return false; }\n\n entry.cancelledReason = reason;\n entry.controller.abort(reason);\n return true;\n }\n\n /** Remove a completed/cancelled execution. */\n remove(executionId: string): void {\n this.executions.delete(executionId);\n }\n\n /** Get an active execution. */\n get(executionId: string): ActiveExecution | undefined {\n return this.executions.get(executionId);\n }\n\n /** Cancel all executions dispatched to a host (on host disconnect). */\n cancelByHost(hostId: string, reason: CancellationReason): string[] {\n const cancelled: string[] = [];\n for (const entry of this.executions.values()) {\n if (entry.hostId === hostId && !entry.controller.signal.aborted) {\n entry.cancelledReason = reason;\n entry.controller.abort(reason);\n cancelled.push(entry.executionId);\n }\n }\n return cancelled;\n }\n\n /** Number of active executions. */\n get size(): number {\n return this.executions.size;\n }\n}\n\n/** Singleton — shared across Gateway process. */\nexport const executionRegistry = new ExecutionRegistry();\n","/**\n * @module gateway-app/clients/subscription-registry\n *\n * Tracks which client connections are subscribed to which executions.\n * Gateway broadcasts ExecutionEvents to all subscribers of an execution.\n *\n * Lifecycle:\n * - client sends client:subscribe → subscribe(connectionId, executionId)\n * - client sends client:unsubscribe → unsubscribe(connectionId, executionId)\n * - execution emits event → broadcast(executionId, event) → all subscribers\n * - client disconnects → removeConnection(connectionId) → cleanup\n *\n * The initiator of POST /api/v1/execute is NOT auto-subscribed here —\n * they receive events inline via ndjson stream. This registry is for\n * secondary observers joining an in-flight execution.\n */\n\nimport type { WebSocket } from '@fastify/websocket';\nimport type { ExecutionEventMessage } from '@kb-labs/gateway-contracts';\n\nexport interface ISubscriptionRegistry {\n subscribe(connectionId: string, executionId: string): void;\n unsubscribe(connectionId: string, executionId: string): void;\n getSubscribers(executionId: string): ReadonlySet<string>;\n getSubscriptions(connectionId: string): ReadonlySet<string>;\n /** Called on client disconnect. Returns executionIds that now have zero subscribers. */\n removeConnection(connectionId: string): string[];\n broadcast(executionId: string, event: ExecutionEventMessage): void;\n}\n\nexport class SubscriptionRegistry implements ISubscriptionRegistry {\n /** executionId → Set<connectionId> */\n private readonly byExecution = new Map<string, Set<string>>();\n /** connectionId → Set<executionId> */\n private readonly byConnection = new Map<string, Set<string>>();\n /** connectionId → WebSocket (for sending events) */\n private readonly sockets = new Map<string, WebSocket>();\n\n /** Register a WebSocket for a connection. Must be called before subscribe(). */\n registerSocket(connectionId: string, socket: WebSocket): void {\n this.sockets.set(connectionId, socket);\n }\n\n /** Remove a connection's socket on disconnect. */\n removeSocket(connectionId: string): void {\n this.sockets.delete(connectionId);\n }\n\n subscribe(connectionId: string, executionId: string): void {\n let executionSubs = this.byExecution.get(executionId);\n if (!executionSubs) {\n executionSubs = new Set();\n this.byExecution.set(executionId, executionSubs);\n }\n executionSubs.add(connectionId);\n\n let connectionSubs = this.byConnection.get(connectionId);\n if (!connectionSubs) {\n connectionSubs = new Set();\n this.byConnection.set(connectionId, connectionSubs);\n }\n connectionSubs.add(executionId);\n }\n\n unsubscribe(connectionId: string, executionId: string): void {\n this.byExecution.get(executionId)?.delete(connectionId);\n this.byConnection.get(connectionId)?.delete(executionId);\n\n // GC empty sets\n if (this.byExecution.get(executionId)?.size === 0) {\n this.byExecution.delete(executionId);\n }\n if (this.byConnection.get(connectionId)?.size === 0) {\n this.byConnection.delete(connectionId);\n }\n }\n\n getSubscribers(executionId: string): ReadonlySet<string> {\n return this.byExecution.get(executionId) ?? new Set();\n }\n\n getSubscriptions(connectionId: string): ReadonlySet<string> {\n return this.byConnection.get(connectionId) ?? new Set();\n }\n\n removeConnection(connectionId: string): string[] {\n const subscriptions = this.byConnection.get(connectionId);\n if (!subscriptions) {\n this.sockets.delete(connectionId);\n return [];\n }\n\n const orphaned: string[] = [];\n for (const executionId of subscriptions) {\n const subs = this.byExecution.get(executionId);\n if (subs) {\n subs.delete(connectionId);\n if (subs.size === 0) {\n this.byExecution.delete(executionId);\n orphaned.push(executionId);\n }\n }\n }\n\n this.byConnection.delete(connectionId);\n this.sockets.delete(connectionId);\n return orphaned;\n }\n\n broadcast(executionId: string, event: ExecutionEventMessage): void {\n const subscribers = this.byExecution.get(executionId);\n if (!subscribers || subscribers.size === 0) { return; }\n\n const payload = JSON.stringify(event);\n for (const connectionId of subscribers) {\n const socket = this.sockets.get(connectionId);\n if (socket && socket.readyState === socket.OPEN) {\n socket.send(payload);\n }\n }\n }\n\n get connectionCount(): number {\n return this.byConnection.size;\n }\n\n get subscriptionCount(): number {\n let total = 0;\n for (const subs of this.byExecution.values()) {\n total += subs.size;\n }\n return total;\n }\n}\n\n/** Singleton — shared across Gateway process. */\nexport const subscriptionRegistry = new SubscriptionRegistry();\n","/**\n * @module gateway-app/execute/errors\n *\n * Shared error types for execution pipeline.\n */\n\nimport type { CancellationReason } from '@kb-labs/core-contracts';\n\n/**\n * Thrown when an execution is cancelled (CC2).\n * Caught by routes.ts to emit execution:cancelled + execution:done(130).\n */\nexport class CancelledError extends Error {\n readonly reason: CancellationReason;\n\n constructor(reason: CancellationReason) {\n super(`Execution cancelled: ${reason}`);\n this.name = 'CancelledError';\n this.reason = reason;\n }\n}\n","/**\n * @module gateway-app/execute/retry-executor\n *\n * Level 2 retry wrapper for execution dispatch (CC3).\n *\n * Wraps a dispatch function with configurable retry + exponential backoff.\n * Emits execution:retry events between attempts so clients see progress.\n * Respects AbortSignal — cancels immediately, no retry after abort.\n *\n * Each attempt is raced against the AbortSignal so that a cancelled\n * execution doesn't block on a hung dispatcher call.\n */\n\nimport type { ExecutionRetryConfig, CancellationReason } from '@kb-labs/core-contracts';\nimport type { ExecutionEventMessage } from '@kb-labs/gateway-contracts';\nimport { CancelledError } from './errors.js';\n\nconst DEFAULTS: Required<ExecutionRetryConfig> = {\n maxAttempts: 1,\n initialDelayMs: 1000,\n backoffMultiplier: 2,\n maxDelayMs: 30_000,\n onlyRetryable: true,\n};\n\nexport interface RetryContext {\n executionId: string;\n requestId: string;\n signal: AbortSignal;\n config: ExecutionRetryConfig | undefined;\n /** Emit event to client stream (and WS subscribers via routes.ts). */\n write: (event: ExecutionEventMessage) => void;\n}\n\n/**\n * Execute dispatch function with retry + abort-race logic.\n *\n * - maxAttempts=1 (default) → single call, raced against signal.\n * - maxAttempts>1 → retry loop with backoff, each attempt raced against signal.\n */\nexport async function executeWithRetry<T>(\n ctx: RetryContext,\n dispatch: () => Promise<T>,\n): Promise<T> {\n const cfg = { ...DEFAULTS, ...ctx.config };\n const maxAttempts = Math.max(1, cfg.maxAttempts);\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (ctx.signal.aborted) {\n throw new CancelledError(ctx.signal.reason as CancellationReason);\n }\n\n try {\n return await raceAbort(ctx.signal, dispatch());\n } catch (err) {\n // Cancellation is never retried\n if (err instanceof CancelledError) { throw err; }\n\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Last attempt — propagate error\n if (attempt >= maxAttempts) { break; }\n\n // Check if error is retryable\n const classified = classifyError(err);\n if (cfg.onlyRetryable && !classified.retryable) { break; }\n\n // Backoff delay\n const delay = Math.min(\n cfg.initialDelayMs * Math.pow(cfg.backoffMultiplier, attempt - 1),\n cfg.maxDelayMs,\n );\n\n ctx.write({\n type: 'execution:retry',\n requestId: ctx.requestId,\n executionId: ctx.executionId,\n attempt,\n maxAttempts,\n delayMs: delay,\n error: classified.message,\n } satisfies ExecutionEventMessage);\n\n await interruptibleDelay(delay, ctx.signal);\n }\n }\n\n throw lastError ?? new Error('executeWithRetry: no attempts made');\n}\n\n// ── Internals ──\n\n/**\n * Race a promise against an AbortSignal.\n */\nfunction raceAbort<T>(signal: AbortSignal, promise: Promise<T>): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new CancelledError(signal.reason as CancellationReason));\n }\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(new CancelledError(signal.reason as CancellationReason));\n signal.addEventListener('abort', onAbort, { once: true });\n\n promise.then(\n (v) => { signal.removeEventListener('abort', onAbort); resolve(v); },\n (e) => { signal.removeEventListener('abort', onAbort); reject(e); },\n );\n });\n}\n\n/**\n * Sleep interruptible by AbortSignal.\n */\nfunction interruptibleDelay(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) {\n return Promise.reject(new CancelledError(signal.reason as CancellationReason));\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new CancelledError(signal.reason as CancellationReason));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\ninterface ClassifiedError {\n code: string;\n message: string;\n retryable: boolean;\n}\n\nfunction classifyError(err: unknown): ClassifiedError {\n if (!(err instanceof Error)) {\n return { code: 'UNKNOWN', message: String(err), retryable: false };\n }\n\n const msg = err.message;\n\n // Transport / network — retryable\n if (msg.includes('ECONNREFUSED') || msg.includes('ECONNRESET') ||\n msg.includes('ETIMEDOUT') || msg.includes('timed out') ||\n msg.includes('503') || msg.includes('Service Unavailable')) {\n return { code: 'TRANSPORT_ERROR', message: msg, retryable: true };\n }\n\n // Host went offline — retryable (may reconnect)\n if (msg.includes('Host not connected')) {\n return { code: 'HOST_UNAVAILABLE', message: msg, retryable: true };\n }\n\n // Everything else — not retryable\n return { code: 'HANDLER_ERROR', message: msg, retryable: false };\n}\n","/**\n * @module gateway-app/execute/routes\n *\n * POST /api/v1/execute — Execute handler via Gateway with ndjson streaming.\n * POST /api/v1/execute/:executionId/cancel — Cancel an active execution.\n *\n * Response: Transfer-Encoding: chunked, Content-Type: application/x-ndjson\n * Each line = JSON ExecutionEvent.\n *\n * Integrates:\n * CC2 — Cancellation via ExecutionRegistry + AbortController\n * CC3 — Retry via executeWithRetry (exponential backoff, retryable errors)\n * CC5 — Broadcast to WS subscribers via SubscriptionRegistry\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { randomUUID } from 'node:crypto';\nimport { ExecuteRequestSchema, type ExecutionEventMessage } from '@kb-labs/gateway-contracts';\nimport { logDiagnosticEvent, type ILogger } from '@kb-labs/core-platform';\nimport type { CancellationReason } from '@kb-labs/core-contracts';\nimport { globalDispatcher } from '../hosts/dispatcher.js';\nimport { executionRegistry } from './execution-registry.js';\nimport { subscriptionRegistry } from '../clients/subscription-registry.js';\nimport { executeWithRetry } from './retry-executor.js';\nimport { CancelledError } from './errors.js';\n\nexport function registerExecuteRoutes(app: FastifyInstance, logger: ILogger): void {\n /**\n * POST /api/v1/execute\n * hide: true — uses ndjson chunked streaming via reply.raw, incompatible with OpenAPI response schema\n */\n app.post('/api/v1/execute', { schema: { tags: ['Execute'], summary: 'Execute a plugin handler', hide: true } }, async (request: FastifyRequest, reply: FastifyReply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const parsed = ExecuteRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const { pluginId, handlerRef, exportName, input, timeoutMs } = parsed.data;\n const executionId = randomUUID();\n const requestId = randomUUID();\n const startTime = Date.now();\n\n logger.info('Execute request received', {\n executionId,\n pluginId,\n handlerRef,\n namespaceId: auth.namespaceId,\n });\n\n // Resolve host with 'execution' capability\n const hostId = globalDispatcher.firstHostWithCapability(auth.namespaceId, 'execution');\n if (!hostId) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.execution.dispatch',\n level: 'warn',\n reasonCode: 'execution_host_unavailable',\n message: 'No execution host connected for namespace',\n outcome: 'failed',\n serviceId: 'gateway',\n evidence: {\n namespaceId: auth.namespaceId,\n pluginId,\n handlerRef,\n },\n });\n return reply.code(503).send({\n error: 'No execution host connected',\n hint: 'Ensure a RuntimeServer is running and connected to Gateway',\n namespaceId: auth.namespaceId,\n });\n }\n\n // Register in execution registry (CC2)\n const signal = executionRegistry.register({\n executionId,\n requestId,\n namespaceId: auth.namespaceId,\n hostId,\n pluginId,\n handlerRef,\n });\n\n // Auto-cancel on client disconnect.\n // reply.raw 'close' fires when connection drops before response finishes.\n // Check writableFinished to distinguish mid-stream disconnect from normal completion.\n reply.raw.on('close', () => {\n if (!reply.raw.writableFinished && !signal.aborted) {\n executionRegistry.cancel(executionId, 'disconnect');\n }\n });\n\n // Hijack response for ndjson streaming\n reply.raw.writeHead(200, {\n 'Content-Type': 'application/x-ndjson',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n 'X-Execution-Id': executionId,\n });\n // Flush headers immediately so the client can see X-Execution-Id before any events\n reply.raw.flushHeaders();\n\n // Write typed event to initiator ndjson stream + broadcast to WS subscribers (CC5)\n const writeEvent = (event: ExecutionEventMessage): void => {\n const payload = JSON.stringify(event) + '\\n';\n if (!reply.raw.writableEnded) {\n reply.raw.write(payload);\n }\n subscriptionRegistry.broadcast(executionId, event);\n };\n\n try {\n // Dispatch with retry + abort-race (CC2 + CC3)\n // TODO: read retry config from platform config when available\n const result = await executeWithRetry(\n { executionId, requestId, signal, config: undefined, write: writeEvent },\n () => globalDispatcher.call(\n auth.namespaceId,\n hostId,\n 'execution',\n 'execute',\n [{ pluginId, handlerRef, exportName, input, executionId, requestId, timeoutMs }],\n ),\n );\n\n writeEvent({\n type: 'execution:done',\n requestId,\n executionId,\n exitCode: 0,\n durationMs: Date.now() - startTime,\n metadata: { result: result as Record<string, unknown> },\n });\n } catch (err) {\n if (err instanceof CancelledError) {\n writeEvent({\n type: 'execution:cancelled',\n requestId,\n executionId,\n reason: err.reason ?? 'user',\n durationMs: Date.now() - startTime,\n });\n\n writeEvent({\n type: 'execution:done',\n requestId,\n executionId,\n exitCode: 130,\n durationMs: Date.now() - startTime,\n });\n } else {\n const message = err instanceof Error ? err.message : String(err);\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.execution.dispatch',\n level: 'error',\n reasonCode: 'execution_dispatch_failed',\n message: 'Gateway execution dispatch failed',\n outcome: 'failed',\n error: err instanceof Error ? err : new Error(String(err)),\n serviceId: 'gateway',\n evidence: {\n namespaceId: auth.namespaceId,\n executionId,\n requestId,\n pluginId,\n handlerRef,\n hostId,\n },\n });\n\n writeEvent({\n type: 'execution:error',\n requestId,\n executionId,\n code: 'EXECUTION_FAILED',\n message,\n retryable: false,\n });\n\n writeEvent({\n type: 'execution:done',\n requestId,\n executionId,\n exitCode: 1,\n durationMs: Date.now() - startTime,\n });\n }\n } finally {\n executionRegistry.remove(executionId);\n if (!reply.raw.writableEnded) {\n reply.raw.end();\n }\n }\n });\n\n /**\n * POST /api/v1/execute/:executionId/cancel\n */\n app.post('/api/v1/execute/:executionId/cancel', { schema: { tags: ['Execute'], summary: 'Cancel an active execution' } }, async (request: FastifyRequest, reply: FastifyReply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const { executionId } = request.params as { executionId: string };\n const body = request.body as { reason?: string } | undefined;\n const reason = (body?.reason ?? 'user') as CancellationReason;\n\n const execution = executionRegistry.get(executionId);\n if (!execution) {\n return reply.code(404).send({ error: 'Execution not found or already completed' });\n }\n\n if (execution.namespaceId !== auth.namespaceId) {\n return reply.code(403).send({ error: 'Forbidden — execution belongs to another namespace' });\n }\n\n const cancelled = executionRegistry.cancel(executionId, reason);\n\n logger.info('Cancel request processed', {\n executionId,\n reason,\n cancelled,\n namespaceId: auth.namespaceId,\n });\n\n return reply.code(cancelled ? 200 : 409).send({\n executionId,\n status: cancelled ? 'cancelled' : 'already_cancelled',\n reason,\n });\n });\n}\n","/**\n * @module AI Gateway — OpenAI-compatible LLM endpoint.\n *\n * Exposes `POST /api/v1/llm/chat/completions` using OpenAI ChatCompletion format.\n * Model field is a tier abstraction (small/medium/large) — never a literal model name.\n * All calls go through the platform LLM chain: QueuedLLM → AnalyticsLLM → LLMRouter → adapter.\n */\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\nimport type {\n ILLM,\n ILogger,\n LLMMessage,\n LLMToolCallOptions,\n LLMTool,\n ILLMRouter,\n LLMTier,\n} from '@kb-labs/core-platform';\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n type ChatCompletionResponse,\n type ChatCompletionChunk,\n} from '@kb-labs/gateway-contracts';\n\n// ── Tier resolution ───────────────────────────────────────────────────────\n\nfunction isLLMRouter(llm: ILLM): llm is ILLM & ILLMRouter {\n return typeof (llm as any).resolveAdapter === 'function';\n}\n\n/**\n * Resolve tier to a concrete ILLM adapter via LLMRouter.\n * If no router (single-adapter setup), returns platform.llm directly.\n */\nasync function resolveLLMForTier(tier: LLMTier): Promise<ILLM | undefined> {\n const llm = platform.llm;\n if (!llm) {return undefined;}\n\n if (isLLMRouter(llm)) {\n const binding = await llm.resolveAdapter({ tier });\n return binding.adapter;\n }\n\n // Single adapter — ignore tier, return as-is\n return llm;\n}\n\n// ── Route registration ────────────────────────────────────────────────────\n\n/**\n * Register AI Gateway routes on the given Fastify scope.\n * The scope is expected to have the auth middleware already applied.\n */\nexport function registerLLMGatewayRoutes(app: FastifyInstance, logger: ILogger): void {\n // hide: true — can stream SSE (text/event-stream), incompatible with OpenAPI response schema\n app.post('/llm/v1/chat/completions', { schema: { tags: ['LLM'], summary: 'OpenAI-compatible chat completions', hide: true } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const parsed = ChatCompletionRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({\n error: {\n message: 'Bad Request',\n type: 'invalid_request_error',\n code: null,\n param: null,\n },\n issues: parsed.error.issues,\n });\n }\n\n const req = parsed.data;\n const requestId = `chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n // Resolve tier to LLM adapter\n const llm = await resolveLLMForTier(req.model);\n if (!llm) {\n return reply.code(503).send({\n error: {\n message: `LLM not available for tier \"${req.model}\"`,\n type: 'server_error',\n code: null,\n param: null,\n },\n });\n }\n\n logger.info('AI Gateway request', {\n requestId,\n tier: req.model,\n stream: req.stream,\n messageCount: req.messages.length,\n hasTools: !!req.tools?.length,\n tenantId: auth.namespaceId,\n });\n\n try {\n if (req.stream) {\n return await handleStreamingRequest(reply, llm, req, requestId, logger);\n }\n return await handleCompletionRequest(reply, llm, req, requestId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n logger.error('AI Gateway error', error, { requestId, tier: req.model });\n return reply.code(500).send({\n error: {\n message: 'Internal server error',\n type: 'server_error',\n code: null,\n param: null,\n },\n });\n }\n });\n}\n\n// ── Non-streaming handler ─────────────────────────────────────────────────\n\nasync function handleCompletionRequest(\n reply: any,\n llm: ILLM,\n req: ChatCompletionRequest,\n requestId: string,\n) {\n const messages = toILLMMessages(req);\n const startTime = Date.now();\n const hasTools = req.tools && req.tools.length > 0;\n\n if (hasTools && llm.chatWithTools) {\n const tools = toILLMTools(req.tools!);\n const options: LLMToolCallOptions = {\n temperature: req.temperature,\n maxTokens: req.max_tokens,\n stop: normalizeStop(req.stop),\n tools,\n toolChoice: req.tool_choice as LLMToolCallOptions['toolChoice'],\n };\n\n const result = await llm.chatWithTools(messages, options);\n\n const toolCalls = result.toolCalls?.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input),\n },\n }));\n\n const finishReason =\n result.stopReason === 'tool_use'\n ? ('tool_calls' as const)\n : result.stopReason === 'max_tokens'\n ? ('length' as const)\n : ('stop' as const);\n\n const response: ChatCompletionResponse = {\n id: requestId,\n object: 'chat.completion',\n created: Math.floor(startTime / 1000),\n model: req.model,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: result.content || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: finishReason,\n },\n ],\n usage: {\n prompt_tokens: result.usage.promptTokens,\n completion_tokens: result.usage.completionTokens,\n total_tokens: result.usage.promptTokens + result.usage.completionTokens,\n },\n };\n\n return reply.code(200).send(response);\n }\n\n // No tools — use simple complete()\n const systemPrompt = messages.find((m) => m.role === 'system')?.content;\n const userMessages = messages.filter((m) => m.role !== 'system');\n const prompt = userMessages.map((m) => m.content).join('\\n\\n');\n\n const result = await llm.complete(prompt, {\n systemPrompt,\n temperature: req.temperature,\n maxTokens: req.max_tokens,\n stop: normalizeStop(req.stop),\n });\n\n const response: ChatCompletionResponse = {\n id: requestId,\n object: 'chat.completion',\n created: Math.floor(startTime / 1000),\n model: req.model,\n choices: [\n {\n index: 0,\n message: { role: 'assistant', content: result.content },\n finish_reason: 'stop',\n },\n ],\n usage: {\n prompt_tokens: result.usage.promptTokens,\n completion_tokens: result.usage.completionTokens,\n total_tokens: result.usage.promptTokens + result.usage.completionTokens,\n },\n };\n\n return reply.code(200).send(response);\n}\n\n// ── Streaming handler ─────────────────────────────────────────────────────\n\nasync function handleStreamingRequest(\n reply: any,\n llm: ILLM,\n req: ChatCompletionRequest,\n requestId: string,\n logger: ILogger,\n) {\n const created = Math.floor(Date.now() / 1000);\n\n reply.raw.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Request-Id': requestId,\n });\n reply.raw.flushHeaders();\n\n const writeChunk = (chunk: ChatCompletionChunk): void => {\n if (!reply.raw.writableEnded) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n };\n\n const writeDone = (): void => {\n if (!reply.raw.writableEnded) {\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n }\n };\n\n try {\n // Initial role chunk\n writeChunk({\n id: requestId,\n object: 'chat.completion.chunk',\n created,\n model: req.model,\n choices: [{ index: 0, delta: { role: 'assistant' }, finish_reason: null }],\n });\n\n // Stream text from LLM\n const systemPrompt = req.messages.find((m) => m.role === 'system')?.content;\n const userMessages = req.messages.filter((m) => m.role !== 'system');\n const prompt = userMessages.map((m) => m.content).join('\\n\\n');\n\n for await (const text of llm.stream(prompt, {\n systemPrompt,\n temperature: req.temperature,\n maxTokens: req.max_tokens,\n stop: normalizeStop(req.stop),\n })) {\n writeChunk({\n id: requestId,\n object: 'chat.completion.chunk',\n created,\n model: req.model,\n choices: [{ index: 0, delta: { content: text }, finish_reason: null }],\n });\n }\n\n // Finish chunk\n writeChunk({\n id: requestId,\n object: 'chat.completion.chunk',\n created,\n model: req.model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop' }],\n });\n\n writeDone();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n logger.error('AI Gateway stream error', error, { requestId });\n if (!reply.raw.writableEnded) {\n reply.raw.write(\n `data: ${JSON.stringify({ error: { message: error.message, type: 'server_error' } })}\\n\\n`,\n );\n reply.raw.end();\n }\n }\n\n return reply;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction toILLMMessages(req: ChatCompletionRequest): LLMMessage[] {\n return req.messages.map((m) => {\n const msg: LLMMessage = { role: m.role, content: m.content };\n if (m.tool_call_id) {msg.toolCallId = m.tool_call_id;}\n if (m.tool_calls) {\n msg.toolCalls = m.tool_calls.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: safeJsonParse(tc.function.arguments),\n }));\n }\n return msg;\n });\n}\n\nfunction toILLMTools(tools: NonNullable<ChatCompletionRequest['tools']>): LLMTool[] {\n return tools.map((t) => ({\n name: t.function.name,\n description: t.function.description ?? '',\n inputSchema: t.function.parameters ?? {},\n }));\n}\n\nfunction normalizeStop(stop: string | string[] | undefined): string[] | undefined {\n if (!stop) {return undefined;}\n return Array.isArray(stop) ? stop : [stop];\n}\n\nfunction safeJsonParse(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n}\n","/**\n * @module Telemetry Ingestion — unified event collection endpoint.\n *\n * Exposes `POST /telemetry/v1/ingest` for external products to send events.\n * Events are written to platform analytics via IAnalytics.track().\n * Auth required — tenantId extracted from auth context.\n */\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport {\n TelemetryIngestRequestSchema,\n type TelemetryIngestResponse,\n} from '@kb-labs/gateway-contracts';\n\n/**\n * Register telemetry ingestion routes on the given Fastify scope.\n * The scope is expected to have the auth middleware already applied.\n */\nexport function registerTelemetryRoutes(app: FastifyInstance, logger: ILogger): void {\n app.post('/telemetry/v1/ingest', { schema: { tags: ['Telemetry'], summary: 'Ingest telemetry events' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const parsed = TelemetryIngestRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({\n error: 'Bad Request',\n issues: parsed.error.issues,\n });\n }\n\n const analytics = platform.analytics;\n if (!analytics) {\n return reply.code(503).send({\n error: 'Analytics adapter not configured',\n });\n }\n\n const { events } = parsed.data;\n let accepted = 0;\n let rejected = 0;\n const errors: Array<{ index: number; message: string }> = [];\n\n for (let i = 0; i < events.length; i++) {\n const event = events[i]!;\n try {\n await analytics.track(event.type, {\n // Source attribution — who sent this event\n _source: event.source,\n _tenantId: auth.namespaceId,\n _ts: event.timestamp ?? new Date().toISOString(),\n // Tags as flat properties for indexing\n ...event.tags,\n // Free-form payload\n ...event.payload,\n });\n accepted++;\n } catch (err) {\n rejected++;\n const message = err instanceof Error ? err.message : String(err);\n errors.push({ index: i, message });\n logger.warn('Telemetry event rejected', {\n index: i,\n type: event.type,\n source: event.source,\n error: message,\n });\n }\n }\n\n logger.info('Telemetry ingest', {\n tenantId: auth.namespaceId,\n accepted,\n rejected,\n totalEvents: events.length,\n });\n\n const response: TelemetryIngestResponse = {\n accepted,\n rejected,\n ...(errors.length > 0 ? { errors } : {}),\n };\n\n return reply.code(accepted > 0 ? 200 : 422).send(response);\n });\n}\n","/**\n * @module Unified Platform API — single dispatch for any adapter.\n *\n * Route: POST /platform/v1/{adapter}/{method}\n *\n * Provides a single entry point for all platform adapters (LLM, Cache,\n * VectorStore, Analytics, Storage, Embeddings, etc.). Adapter and method\n * come from URL params; arguments come from the request body.\n *\n * Security: only methods explicitly listed in ALLOWED_METHODS are callable.\n */\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport {\n PlatformCallRequestSchema,\n type PlatformCallResponse,\n} from '@kb-labs/gateway-contracts';\n\n// ── Method allowlist ──────────────────────────────────────────────────────\n// Only methods listed here are callable via the Platform API.\n// Internal/lifecycle methods (setSource, shutdown, etc.) are NOT exposed.\n\nconst ALLOWED_METHODS: Record<string, Set<string>> = {\n llm: new Set(['complete', 'stream', 'chatWithTools']),\n cache: new Set(['get', 'set', 'delete', 'clear']),\n vectorStore: new Set(['search', 'upsert', 'delete', 'count']),\n analytics: new Set(['track', 'identify', 'flush', 'getEvents', 'getStats', 'getDailyStats']),\n embeddings: new Set(['embed']),\n storage: new Set(['read', 'write', 'delete', 'list', 'exists']),\n eventBus: new Set(['publish', 'subscribe']),\n sqlDatabase: new Set(['query', 'execute']),\n documentDatabase: new Set(['find', 'findOne', 'insert', 'update', 'delete']),\n};\n\n// ── Adapter resolution ────────────────────────────────────────────────────\n\nfunction resolveAdapter(name: string): unknown | undefined {\n // Map URL param to platform property\n const adapterMap: Record<string, () => unknown> = {\n llm: () => platform.llm,\n cache: () => platform.cache,\n analytics: () => platform.analytics,\n vectorStore: () => platform.vectorStore,\n embeddings: () => platform.embeddings,\n storage: () => platform.storage,\n eventBus: () => platform.eventBus,\n sqlDatabase: () => platform.sqlDatabase,\n documentDatabase: () => platform.documentDatabase,\n };\n\n const getter = adapterMap[name];\n return getter ? getter() : undefined;\n}\n\n// ── Streaming detection ───────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n typeof value === 'object' &&\n Symbol.asyncIterator in (value as object)\n );\n}\n\n// ── Route registration ────────────────────────────────────────────────────\n\nexport function registerPlatformRoutes(app: FastifyInstance, logger: ILogger): void {\n // hide: true — can return SSE (text/event-stream) for streaming adapter calls, incompatible with OpenAPI response schema\n app.post<{ Params: { adapter: string; method: string } }>(\n '/platform/v1/:adapter/:method',\n { schema: { tags: ['Platform'], summary: 'Invoke a platform adapter method', hide: true } },\n async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const { adapter: adapterName, method: methodName } = request.params;\n\n // 1. Check adapter is in allowlist\n const allowedMethods = ALLOWED_METHODS[adapterName];\n if (!allowedMethods) {\n return reply.code(404).send({\n ok: false,\n error: { message: `Unknown adapter: \"${adapterName}\"`, code: 'ADAPTER_NOT_FOUND' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 2. Check method is allowed\n if (!allowedMethods.has(methodName)) {\n return reply.code(403).send({\n ok: false,\n error: { message: `Method \"${methodName}\" not allowed on adapter \"${adapterName}\"`, code: 'METHOD_NOT_ALLOWED' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 3. Resolve adapter instance\n const adapter = resolveAdapter(adapterName);\n if (!adapter) {\n return reply.code(503).send({\n ok: false,\n error: { message: `Adapter \"${adapterName}\" not configured`, code: 'ADAPTER_UNAVAILABLE' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 4. Check method exists on adapter\n const method = (adapter as Record<string, unknown>)[methodName];\n if (typeof method !== 'function') {\n return reply.code(501).send({\n ok: false,\n error: { message: `Method \"${methodName}\" not implemented on adapter \"${adapterName}\"`, code: 'METHOD_NOT_IMPLEMENTED' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 5. Parse args\n const parsed = PlatformCallRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({\n ok: false,\n error: { message: 'Invalid request body', code: 'VALIDATION_ERROR' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n const { args } = parsed.data;\n\n logger.info('Platform API call', {\n adapter: adapterName,\n method: methodName,\n argCount: args.length,\n tenantId: auth.namespaceId,\n });\n\n // 6. Execute\n const startTime = Date.now();\n\n try {\n const result = method.apply(adapter, args);\n\n // Handle async results\n const resolved = result instanceof Promise ? await result : result;\n\n // 7. Detect streaming response (e.g., llm.stream)\n if (isAsyncIterable(resolved)) {\n reply.raw.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n });\n reply.raw.flushHeaders();\n\n for await (const chunk of resolved) {\n if (!reply.raw.writableEnded) {\n const data = typeof chunk === 'string' ? chunk : JSON.stringify(chunk);\n reply.raw.write(`data: ${data}\\n\\n`);\n }\n }\n\n if (!reply.raw.writableEnded) {\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n }\n\n return reply;\n }\n\n // 8. Regular response\n const durationMs = Date.now() - startTime;\n return reply.code(200).send({\n ok: true,\n result: resolved,\n durationMs,\n } satisfies PlatformCallResponse);\n } catch (err) {\n const durationMs = Date.now() - startTime;\n const error = err instanceof Error ? err : new Error(String(err));\n logger.error('Platform API error', error, {\n adapter: adapterName,\n method: methodName,\n tenantId: auth.namespaceId,\n });\n return reply.code(502).send({\n ok: false,\n error: { message: error.message, code: 'ADAPTER_ERROR' },\n durationMs,\n } satisfies PlatformCallResponse);\n }\n },\n );\n}\n","/**\n * @module gateway-app/docs/routes\n * Aggregated OpenAPI documentation endpoints.\n *\n * GET /openapi-merged.json — merged spec from all upstream services\n * GET /docs-all — Swagger UI pointing at the merged spec\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { mergeOpenAPISpecs } from '@kb-labs/core-registry';\nimport type { ICache } from '@kb-labs/core-platform';\n\nconst MERGED_CACHE_KEY = '__gateway_merged_openapi';\nconst MERGED_CACHE_TTL = 30_000; // 30 second cache\n\nconst UPSTREAM_SPEC_URLS = [\n 'http://localhost:5050/openapi.json',\n 'http://localhost:7778/openapi.json',\n];\n\nexport function registerAggregatedDocsRoutes(app: FastifyInstance, cache?: ICache): void {\n // Merged OpenAPI spec from all upstreams\n app.get('/openapi-merged.json', async (_req, reply) => {\n // Try cache first\n if (cache) {\n try {\n const hit = await cache.get<Record<string, unknown>>(MERGED_CACHE_KEY);\n if (hit) {\n return reply.send(hit);\n }\n } catch { /* cache miss */ }\n }\n\n // Fetch all upstream specs in parallel\n const results = await Promise.allSettled(\n UPSTREAM_SPEC_URLS.map((url) =>\n fetch(url, { signal: AbortSignal.timeout(3000) }).then((r) => r.json()),\n ),\n );\n\n const specs = results\n .filter((r): r is PromiseFulfilledResult<unknown> => r.status === 'fulfilled')\n .map((r) => r.value);\n\n const merged = mergeOpenAPISpecs(specs as Parameters<typeof mergeOpenAPISpecs>[0]);\n\n // Cache result\n if (cache) {\n try {\n await cache.set(MERGED_CACHE_KEY, merged as unknown as Record<string, unknown>, MERGED_CACHE_TTL);\n } catch { /* cache write failure is non-critical */ }\n }\n\n return reply.send(merged);\n });\n\n // Second Swagger UI pointing at merged spec\n // Registered last so /docs (gateway-native) is already bound at this point\n app.register(async function docsAll(scope) {\n const swaggerUi = await import('@fastify/swagger-ui');\n await scope.register(swaggerUi.default ?? swaggerUi, {\n routePrefix: '/docs-all',\n uiConfig: {\n url: '/openapi-merged.json',\n docExpansion: 'list',\n deepLinking: true,\n },\n });\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport type { ICache } from '@kb-labs/core-platform';\nimport type { HostDescriptor, HostRegistration, IHostStore } from '@kb-labs/gateway-contracts';\n\nexport interface HostRegisterResult {\n descriptor: HostDescriptor;\n machineToken: string;\n}\n\n/**\n * Host Registry — coordinates cache (hot) and store (cold) layers.\n *\n * - Cache: online/offline status, connections, heartbeat (transient)\n * - Store: host descriptors, tokens (durable, survives restarts)\n *\n * Write path: store.save() + cache.set()\n * Read path: cache.get() ?? store.get() → cache warm\n */\nconst DEFAULT_RECONNECT_GRACE_MS = 10_000;\n\nexport class HostRegistry {\n private readonly graceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly reconnectGraceMs: number;\n\n constructor(\n private readonly cache: ICache,\n private readonly store?: IHostStore,\n options?: { reconnectGraceMs?: number },\n ) {\n this.reconnectGraceMs = options?.reconnectGraceMs ?? DEFAULT_RECONNECT_GRACE_MS;\n }\n\n /**\n * Restore hosts from persistent store into cache on startup.\n * All restored hosts start as offline — live status comes from WS connections.\n *\n * Also resets any stale online/reconnecting hosts in cache to offline,\n * since no WebSocket connections survive a Gateway restart.\n */\n async restore(): Promise<number> {\n // 1. Reset stale hosts in cache (covers Redis cache surviving restarts)\n await this.resetStaleHosts();\n\n // 2. Restore from store if available\n if (!this.store) {return 0;}\n const hosts = await this.store.listAll();\n for (const host of hosts) {\n const offline = { ...host, status: 'offline' as const, connections: [] as string[] };\n const cacheKey = this.hostKey(host.namespaceId, host.hostId);\n await this.cache.set(cacheKey, offline);\n await this.store.save(offline);\n await this.addToIndex(host.namespaceId, host.hostId);\n }\n return hosts.length;\n }\n\n /**\n * Reset all hosts in cache to offline.\n * Called on startup — no WS connections exist yet, so nothing should be online.\n * Uses namespace index maintained in cache to discover all namespaces.\n */\n private async resetStaleHosts(): Promise<void> {\n const namespaces = await this.cache.get<string[]>('host:namespaces') ?? ['default'];\n for (const ns of namespaces) {\n const hostIds = await this.cache.get<string[]>(`host:index:${ns}`) ?? [];\n for (const hostId of hostIds) {\n const host = await this.cache.get<HostDescriptor>(this.hostKey(ns, hostId));\n if (host && (host.status === 'online' || host.status === 'reconnecting')) {\n await this.cache.set(this.hostKey(ns, hostId), {\n ...host, status: 'offline', connections: [],\n });\n }\n }\n }\n }\n\n async register(reg: HostRegistration): Promise<HostRegisterResult> {\n const hostId = `host_${randomUUID().replace(/-/g, '').slice(0, 24)}`;\n const machineToken = randomUUID();\n const now = Date.now();\n\n const descriptor: HostDescriptor = {\n hostId,\n name: reg.name,\n namespaceId: reg.namespaceId,\n capabilities: reg.capabilities,\n status: 'offline',\n lastSeen: now,\n connections: [],\n hostType: reg.hostType,\n createdAt: now,\n updatedAt: now,\n };\n\n // Persist to store (durable)\n if (this.store) {\n await this.store.save(descriptor);\n await this.store.saveToken(machineToken, hostId, reg.namespaceId);\n }\n\n // Write to cache (hot)\n await this.cache.set(this.hostKey(reg.namespaceId, hostId), descriptor);\n await this.cache.set(this.tokenKey(machineToken), { hostId, namespaceId: reg.namespaceId });\n await this.addToIndex(reg.namespaceId, hostId);\n\n return { descriptor, machineToken };\n }\n\n async setOnline(hostId: string, namespaceId: string, connectionId: string): Promise<void> {\n const host = await this.getFromCache(hostId, namespaceId);\n if (!host) {return;}\n\n // Cancel grace timer if reconnecting\n const graceKey = `${namespaceId}:${hostId}`;\n const graceTimer = this.graceTimers.get(graceKey);\n if (graceTimer) {\n clearTimeout(graceTimer);\n this.graceTimers.delete(graceKey);\n }\n\n const updated = {\n ...host,\n status: 'online' as const,\n lastSeen: Date.now(),\n connections: [connectionId],\n };\n await this.cache.set(this.hostKey(namespaceId, hostId), updated);\n if (this.store) {await this.store.save(updated);}\n }\n\n async setOffline(hostId: string, namespaceId: string, connectionId: string): Promise<void> {\n const host = await this.getFromCache(hostId, namespaceId);\n if (!host) {return;}\n const connections = host.connections.filter((c) => c !== connectionId);\n\n if (connections.length > 0) {\n // Other connections still active — stay online\n await this.cache.set(this.hostKey(namespaceId, hostId), {\n ...host, status: 'online', lastSeen: Date.now(), connections,\n });\n return;\n }\n\n // Last connection gone — enter grace period (reconnecting)\n const reconnecting = {\n ...host, status: 'reconnecting' as const, lastSeen: Date.now(), connections: [] as string[],\n };\n await this.cache.set(this.hostKey(namespaceId, hostId), reconnecting);\n if (this.store) {await this.store.save(reconnecting);}\n\n // Cancel any existing grace timer for this host\n const graceKey = `${namespaceId}:${hostId}`;\n const existing = this.graceTimers.get(graceKey);\n if (existing) {clearTimeout(existing);}\n\n // After grace period, mark truly offline\n this.graceTimers.set(graceKey, setTimeout(async () => {\n this.graceTimers.delete(graceKey);\n const current = await this.getFromCache(hostId, namespaceId);\n if (current?.status === 'reconnecting') {\n const offline = { ...current, status: 'offline' as const, lastSeen: Date.now() };\n await this.cache.set(this.hostKey(namespaceId, hostId), offline);\n if (this.store) {await this.store.save(offline);}\n }\n }, this.reconnectGraceMs));\n }\n\n async heartbeat(hostId: string, namespaceId: string): Promise<void> {\n const host = await this.getFromCache(hostId, namespaceId);\n if (!host) {return;}\n await this.cache.set(this.hostKey(namespaceId, hostId), { ...host, lastSeen: Date.now() });\n }\n\n async get(hostId: string, namespaceId: string): Promise<HostDescriptor | null> {\n // Try cache first (hot)\n const cached = await this.cache.get<HostDescriptor>(this.hostKey(namespaceId, hostId));\n if (cached) {return cached;}\n\n // Fall through to store (cold)\n if (!this.store) {return null;}\n const stored = await this.store.get(hostId, namespaceId);\n if (!stored) {return null;}\n\n // Warm cache\n await this.cache.set(this.hostKey(namespaceId, hostId), { ...stored, status: 'offline', connections: [] });\n await this.addToIndex(namespaceId, hostId);\n return { ...stored, status: 'offline', connections: [] };\n }\n\n async resolveToken(token: string): Promise<{ hostId: string; namespaceId: string } | null> {\n // Try cache first\n const cached = await this.cache.get<{ hostId: string; namespaceId: string }>(this.tokenKey(token));\n if (cached) {return cached;}\n\n // Fall through to store\n if (!this.store) {return null;}\n const stored = await this.store.resolveToken(token);\n if (!stored) {return null;}\n\n // Warm cache\n await this.cache.set(this.tokenKey(token), stored);\n return stored;\n }\n\n async list(namespaceId: string): Promise<HostDescriptor[]> {\n // Use store as authoritative source if available\n if (this.store) {\n const persisted = await this.store.list(namespaceId);\n // Enrich with live status from cache\n return Promise.all(\n persisted.map(async (host) => {\n const cached = await this.cache.get<HostDescriptor>(this.hostKey(namespaceId, host.hostId));\n return cached ?? { ...host, status: 'offline' as const, connections: [] };\n }),\n );\n }\n\n // Fallback: cache-only (no store)\n const indexKey = `host:index:${namespaceId}`;\n const hostIds = (await this.cache.get<string[]>(indexKey)) ?? [];\n const results = await Promise.all(\n hostIds.map((id) => this.cache.get<HostDescriptor>(this.hostKey(namespaceId, id))),\n );\n return results.filter((h): h is HostDescriptor => h !== null);\n }\n\n async deregister(hostId: string, namespaceId: string): Promise<boolean> {\n // Remove from store\n const deleted = this.store ? await this.store.delete(hostId, namespaceId) : false;\n\n // Remove from cache\n await this.cache.delete(this.hostKey(namespaceId, hostId));\n await this.removeFromIndex(namespaceId, hostId);\n\n return deleted;\n }\n\n async ensureRegistered(\n hostId: string,\n namespaceId: string,\n name: string,\n capabilities: HostDescriptor['capabilities'] = [],\n ): Promise<void> {\n const existing = await this.get(hostId, namespaceId);\n if (existing) {\n if (capabilities.length > 0 && JSON.stringify(existing.capabilities) !== JSON.stringify(capabilities)) {\n const updated = { ...existing, capabilities, updatedAt: Date.now() };\n if (this.store) {await this.store.save(updated);}\n await this.cache.set(this.hostKey(namespaceId, hostId), updated);\n }\n return;\n }\n\n const now = Date.now();\n const descriptor: HostDescriptor = {\n hostId,\n name,\n namespaceId,\n capabilities,\n status: 'offline',\n lastSeen: now,\n connections: [],\n createdAt: now,\n updatedAt: now,\n };\n\n if (this.store) {await this.store.save(descriptor);}\n await this.cache.set(this.hostKey(namespaceId, hostId), descriptor);\n await this.addToIndex(namespaceId, hostId);\n }\n\n // ── Private helpers ──────────────────────────────────────────────\n\n private hostKey(namespaceId: string, hostId: string): string {\n return `host:registry:${namespaceId}:${hostId}`;\n }\n\n private tokenKey(token: string): string {\n return `host:token:${token}`;\n }\n\n private async getFromCache(hostId: string, namespaceId: string): Promise<HostDescriptor | null> {\n return this.cache.get<HostDescriptor>(this.hostKey(namespaceId, hostId));\n }\n\n private async addToIndex(namespaceId: string, hostId: string): Promise<void> {\n const indexKey = `host:index:${namespaceId}`;\n const hostIds = (await this.cache.get<string[]>(indexKey)) ?? [];\n if (!hostIds.includes(hostId)) {\n await this.cache.set(indexKey, [...hostIds, hostId]);\n }\n // Track namespace for resetStaleHosts()\n const nsKey = 'host:namespaces';\n const namespaces = (await this.cache.get<string[]>(nsKey)) ?? [];\n if (!namespaces.includes(namespaceId)) {\n await this.cache.set(nsKey, [...namespaces, namespaceId]);\n }\n }\n\n private async removeFromIndex(namespaceId: string, hostId: string): Promise<void> {\n const indexKey = `host:index:${namespaceId}`;\n const hostIds = (await this.cache.get<string[]>(indexKey)) ?? [];\n await this.cache.set(indexKey, hostIds.filter((id) => id !== hostId));\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { WebSocket } from 'ws';\n\ninterface WsRequest {\n headers: { authorization?: string };\n url?: string;\n}\nimport { logDiagnosticEvent, type ICache, type ILogger } from '@kb-labs/core-platform';\nimport {\n HelloMessageSchema,\n AdapterCallMessageSchema,\n AdapterNameSchema,\n HostCapabilitySchema,\n SUPPORTED_PROTOCOL_VERSIONS,\n type OutboundMessage,\n} from '@kb-labs/gateway-contracts';\nimport { AdaptiveBuffer } from '@kb-labs/gateway-core';\nimport { getClientByHostId, type JwtConfig } from '@kb-labs/gateway-auth';\nimport { HostRegistry } from './registry.js';\nimport { extractBearerToken, resolveToken } from '../auth/tokens.js';\nimport { globalDispatcher } from './dispatcher.js';\nimport { executionRegistry } from '../execute/execution-registry.js';\n\nconst HELLO_TIMEOUT_MS = 5_000;\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst HEARTBEAT_GRACE_MS = 10_000;\n\nfunction send(ws: WebSocket, msg: OutboundMessage): void {\n ws.send(JSON.stringify(msg));\n}\n\nexport function createWsHandler(\n cache: ICache,\n jwtConfig: JwtConfig,\n logger: ILogger,\n hostRegistry?: HostRegistry,\n) {\n const registry = hostRegistry ?? new HostRegistry(cache);\n const buffer = new AdaptiveBuffer(cache);\n\n return async function wsHandler(\n socket: WebSocket,\n request: WsRequest,\n ): Promise<void> {\n // 1. Auth — machine token required\n const token = extractBearerToken(request.headers.authorization);\n if (!token) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.auth',\n level: 'warn',\n reasonCode: 'websocket_auth_failed',\n message: 'Host WebSocket connection missing authorization token',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n });\n socket.close(1008, 'Missing Authorization header');\n return;\n }\n\n const tokenEntry = await resolveToken(token, cache, jwtConfig);\n if (!tokenEntry || tokenEntry.type !== 'machine') {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.auth',\n level: 'warn',\n reasonCode: 'websocket_auth_failed',\n message: 'Host WebSocket machine token rejected',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n });\n socket.close(1008, 'Invalid machine token');\n return;\n }\n\n const { userId: hostId, namespaceId } = tokenEntry;\n const connectionId = randomUUID();\n const sessionId = randomUUID();\n\n // 2. Wait for hello (with timeout)\n let protocolVersion: string | null = null;\n let helloCaps: string[] = [];\n let helloDone = false;\n\n const protocolVersions: readonly string[] = SUPPORTED_PROTOCOL_VERSIONS;\n\n await new Promise<void>((resolve, reject) => {\n const helloTimeout = setTimeout(() => {\n if (!helloDone) {\n helloDone = true;\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'websocket_hello_timeout',\n message: 'Host WebSocket hello timed out',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n },\n });\n socket.close(1008, 'Hello timeout');\n reject(new Error('Hello timeout'));\n }\n }, HELLO_TIMEOUT_MS);\n\n socket.once('message', (raw) => {\n if (helloDone) {return;}\n helloDone = true;\n clearTimeout(helloTimeout);\n\n try {\n const msg = HelloMessageSchema.parse(JSON.parse(raw.toString()));\n\n // Version negotiation\n if (!protocolVersions.includes(msg.protocolVersion)) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'websocket_protocol_unsupported',\n message: 'Host WebSocket protocol version is unsupported',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n protocolVersion: msg.protocolVersion,\n supportedVersions: [...SUPPORTED_PROTOCOL_VERSIONS],\n },\n });\n send(socket, {\n type: 'negotiate',\n supportedVersions: [...SUPPORTED_PROTOCOL_VERSIONS],\n });\n socket.close(1008, 'Unsupported protocol version');\n reject(new Error('Unsupported protocol version'));\n return;\n }\n\n protocolVersion = msg.protocolVersion;\n helloCaps = msg.capabilities ?? [];\n resolve();\n } catch (error) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'websocket_handshake_invalid',\n message: 'Host WebSocket hello message is invalid',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n },\n });\n socket.close(1008, 'Invalid hello message');\n reject(new Error('Invalid hello'));\n }\n });\n }).catch(() => {\n // socket already closed — errors logged above\n });\n\n if (!protocolVersion) {return;}\n\n // 3. Ensure host descriptor exists (JWT-registered hosts have no registry entry yet)\n const clientRecord = await getClientByHostId(cache, hostId);\n const registryCaps = (clientRecord?.capabilities ?? [])\n .map((c) => HostCapabilitySchema.safeParse(c))\n .filter((r) => r.success)\n .map((r) => r.data);\n\n // Security: for JWT-registered hosts use capabilities from clientRecord only.\n // For static-token hosts (no clientRecord) accept capabilities from hello message,\n // but validate each against HostCapabilitySchema to reject unknown values.\n const validatedHelloCaps = clientRecord ? [] : helloCaps\n .map((c) => HostCapabilitySchema.safeParse(c))\n .filter((r) => r.success)\n .map((r) => r.data);\n\n const capabilities = clientRecord ? registryCaps : validatedHelloCaps;\n await registry.ensureRegistered(hostId, namespaceId, clientRecord?.name ?? hostId, capabilities);\n\n // 4. Set online + register in dispatcher (with capabilities for routing) + send connected\n await registry.setOnline(hostId, namespaceId, connectionId);\n globalDispatcher.registerConnection(hostId, namespaceId, socket, capabilities);\n\n send(socket, {\n type: 'connected',\n protocolVersion,\n hostId,\n sessionId,\n });\n\n // 4. Flush buffered calls\n const buffered = await buffer.flush(hostId);\n for (const call of buffered) {\n send(socket, {\n type: 'call',\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n args: call.args,\n trace: { traceId: call.requestId, spanId: randomUUID() },\n });\n }\n\n // 5. Heartbeat watchdog\n let lastHeartbeat = Date.now();\n const heartbeatWatchdog = setInterval(async () => {\n const elapsed = Date.now() - lastHeartbeat;\n if (elapsed > HEARTBEAT_INTERVAL_MS + HEARTBEAT_GRACE_MS) {\n // Mark as degraded (don't close — allow recovery)\n const host = await registry.get(hostId, namespaceId);\n if (host && host.status !== 'degraded') {\n await cache.set(`host:registry:${namespaceId}:${hostId}`, {\n ...host,\n status: 'degraded',\n });\n }\n }\n }, HEARTBEAT_INTERVAL_MS);\n\n // 6. Message handler\n socket.on('message', async (raw) => {\n try {\n const msg = JSON.parse(raw.toString()) as { type: string; requestId?: string };\n\n switch (msg.type) {\n case 'heartbeat':\n lastHeartbeat = Date.now();\n await registry.heartbeat(hostId, namespaceId);\n send(socket, { type: 'ack' });\n break;\n\n case 'chunk':\n case 'result':\n case 'error':\n globalDispatcher.handleInbound(msg as { type: string; requestId?: string; data?: unknown; error?: unknown });\n break;\n\n case 'adapter:call':\n void handleAdapterCall(msg, socket, hostId, namespaceId);\n break;\n }\n } catch (error) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.message',\n level: 'warn',\n reasonCode: 'websocket_message_invalid',\n message: 'Host WebSocket message is malformed',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n },\n });\n }\n });\n\n // 7. Disconnect cleanup\n socket.on('close', async () => {\n clearInterval(heartbeatWatchdog);\n globalDispatcher.removeConnection(hostId, namespaceId);\n\n // Cancel all executions dispatched to this host (CC2)\n const cancelled = executionRegistry.cancelByHost(hostId, 'disconnect');\n if (cancelled.length > 0) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.disconnect',\n level: 'warn',\n reasonCode: 'execution_dispatch_failed',\n message: 'Host disconnected and active executions were cancelled',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n cancelledExecutions: cancelled.length,\n },\n });\n }\n\n await registry.setOffline(hostId, namespaceId, connectionId);\n });\n };\n\n /**\n * Handle adapter:call from Host — forward to REST API for platform service execution.\n * Flow: Host → WS adapter:call → Gateway → HTTP POST /api/v1/internal/adapter-call → REST API\n *\n * @see ADR-0051: Bidirectional Gateway Protocol\n */\n async function handleAdapterCall(\n msg: Record<string, unknown>,\n socket: WebSocket,\n hostId: string,\n namespaceId: string,\n ): Promise<void> {\n const requestId = msg['requestId'] as string;\n\n // 1. Validate message schema\n const parsed = AdapterCallMessageSchema.safeParse(msg);\n if (!parsed.success) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.adapter-call',\n level: 'warn',\n reasonCode: 'websocket_message_invalid',\n message: 'Host adapter call message is invalid',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n requestId,\n },\n });\n send(socket, {\n type: 'adapter:error',\n requestId: requestId ?? 'unknown',\n error: { code: 'INVALID_MESSAGE', message: parsed.error.message, retryable: false },\n });\n return;\n }\n\n const call = parsed.data;\n\n // 2. Validate adapter is in allowlist\n const adapterCheck = AdapterNameSchema.safeParse(call.adapter);\n if (!adapterCheck.success) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.adapter-call',\n level: 'warn',\n reasonCode: 'adapter_call_rejected',\n message: 'Host adapter call rejected by gateway allowlist',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n },\n });\n send(socket, {\n type: 'adapter:error',\n requestId: call.requestId,\n error: { code: 'ADAPTER_CALL_REJECTED', message: `Adapter not allowed: ${call.adapter}`, retryable: false },\n });\n return;\n }\n\n // 3. Forward to REST API\n const restApiUrl = process.env.REST_API_URL ?? 'http://localhost:5050';\n const internalSecret = process.env.GATEWAY_INTERNAL_SECRET ?? '';\n\n try {\n const response = await fetch(`${restApiUrl}/api/v1/internal/adapter-call`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-internal-secret': internalSecret,\n },\n body: JSON.stringify({\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n args: call.args,\n context: {\n ...call.context,\n namespaceId,\n hostId,\n },\n }),\n });\n\n const body = await response.json() as {\n ok: boolean;\n result?: unknown;\n error?: { code: string; message: string; retryable: boolean; details?: unknown };\n };\n\n if (body.ok) {\n send(socket, {\n type: 'adapter:response',\n requestId: call.requestId,\n result: body.result,\n });\n } else {\n send(socket, {\n type: 'adapter:error',\n requestId: call.requestId,\n error: body.error ?? { code: 'ADAPTER_ERROR', message: 'Unknown error', retryable: false },\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.adapter-call',\n level: 'error',\n reasonCode: 'adapter_bridge_unavailable',\n message: 'Gateway could not reach REST adapter bridge',\n outcome: 'failed',\n error: err instanceof Error ? err : new Error(String(err)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n restApiUrl,\n },\n });\n send(socket, {\n type: 'adapter:error',\n requestId: call.requestId,\n error: { code: 'ADAPTER_CALL_TIMEOUT', message: `REST API unreachable: ${message}`, retryable: true },\n });\n }\n }\n}\n","/**\n * @module gateway-app/clients/ws-handler\n *\n * WebSocket handler for observer clients (CLI, Studio, IDE).\n * Endpoint: GET /clients/connect (requires Bearer JWT)\n *\n * Supports:\n * - client:subscribe — start receiving events for an executionId\n * - client:unsubscribe — stop receiving events\n * - client:cancel — cancel an execution (proxied to ExecutionRegistry)\n *\n * Auth: same Bearer JWT as HTTP endpoints (user or machine token, NOT host machine token).\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { WebSocket } from 'ws';\n\ninterface WsRequest {\n headers: { authorization?: string };\n url?: string;\n}\nimport type { ICache, ILogger } from '@kb-labs/core-platform';\nimport type { CancellationReason } from '@kb-labs/core-contracts';\nimport {\n ClientHelloSchema,\n ClientSubscribeSchema,\n ClientUnsubscribeSchema,\n ClientCancelSchema,\n CLIENT_PROTOCOL_VERSION,\n type ClientOutboundMessage,\n} from '@kb-labs/gateway-contracts';\nimport { type JwtConfig } from '@kb-labs/gateway-auth';\nimport { extractBearerToken, resolveToken } from '../auth/tokens.js';\nimport { executionRegistry } from '../execute/execution-registry.js';\nimport { subscriptionRegistry } from './subscription-registry.js';\n\nconst HELLO_TIMEOUT_MS = 5_000;\n\nfunction send(ws: WebSocket, msg: ClientOutboundMessage): void {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n}\n\nexport function createClientWsHandler(cache: ICache, jwtConfig: JwtConfig, logger: ILogger) {\n return async function clientWsHandler(\n socket: WebSocket,\n request: WsRequest,\n ): Promise<void> {\n // 1. Auth — Bearer JWT required (user or machine token)\n const queryToken = new URL(request.url ?? '/', 'http://localhost').searchParams.get('access_token');\n const token = extractBearerToken(request.headers.authorization)\n ?? queryToken\n ?? null;\n\n if (!token) {\n socket.close(1008, 'Missing Authorization');\n return;\n }\n\n const authContext = await resolveToken(token, cache, jwtConfig);\n if (!authContext) {\n socket.close(1008, 'Invalid token');\n return;\n }\n\n const connectionId = randomUUID();\n\n // 2. Wait for client:hello (with timeout)\n let helloDone = false;\n\n await new Promise<void>((resolve, reject) => {\n const helloTimeout = setTimeout(() => {\n if (!helloDone) {\n helloDone = true;\n socket.close(1008, 'Hello timeout');\n reject(new Error('Hello timeout'));\n }\n }, HELLO_TIMEOUT_MS);\n\n socket.once('message', (raw) => {\n if (helloDone) { return; }\n helloDone = true;\n clearTimeout(helloTimeout);\n\n try {\n const msg = ClientHelloSchema.parse(JSON.parse(raw.toString()));\n void msg; // clientVersion logged below if needed\n resolve();\n } catch {\n socket.close(1008, 'Invalid hello message');\n reject(new Error('Invalid client:hello'));\n }\n });\n }).catch(() => {\n // socket already closed\n });\n\n if (!helloDone || socket.readyState !== socket.OPEN) { return; }\n\n // 3. Register connection\n subscriptionRegistry.registerSocket(connectionId, socket);\n\n send(socket, {\n type: 'client:connected',\n protocolVersion: CLIENT_PROTOCOL_VERSION,\n connectionId,\n });\n\n logger.debug('Client connected', { connectionId, namespaceId: authContext.namespaceId });\n\n // 4. Message handler\n socket.on('message', (raw) => {\n let parsed: { type: string };\n try {\n parsed = JSON.parse(raw.toString()) as { type: string };\n } catch {\n send(socket, {\n type: 'client:error',\n code: 'INVALID_MESSAGE',\n message: 'Malformed JSON',\n });\n return;\n }\n\n switch (parsed.type) {\n case 'client:subscribe': {\n const result = ClientSubscribeSchema.safeParse(parsed);\n if (!result.success) {\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: 'Invalid subscribe message' });\n return;\n }\n const { executionId } = result.data;\n\n // Verify execution exists and belongs to this namespace\n const execution = executionRegistry.get(executionId);\n if (!execution) {\n send(socket, { type: 'client:error', code: 'EXECUTION_NOT_FOUND', message: `Execution ${executionId} not found`, executionId });\n return;\n }\n if (execution.namespaceId !== authContext.namespaceId) {\n send(socket, { type: 'client:error', code: 'FORBIDDEN', message: 'Execution belongs to another namespace', executionId });\n return;\n }\n\n subscriptionRegistry.subscribe(connectionId, executionId);\n break;\n }\n\n case 'client:unsubscribe': {\n const result = ClientUnsubscribeSchema.safeParse(parsed);\n if (!result.success) {\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: 'Invalid unsubscribe message' });\n return;\n }\n subscriptionRegistry.unsubscribe(connectionId, result.data.executionId);\n break;\n }\n\n case 'client:cancel': {\n const result = ClientCancelSchema.safeParse(parsed);\n if (!result.success) {\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: 'Invalid cancel message' });\n return;\n }\n const { executionId, reason } = result.data;\n\n const execution = executionRegistry.get(executionId);\n if (!execution) {\n send(socket, { type: 'client:error', code: 'EXECUTION_NOT_FOUND', message: `Execution ${executionId} not found`, executionId });\n return;\n }\n if (execution.namespaceId !== authContext.namespaceId) {\n send(socket, { type: 'client:error', code: 'FORBIDDEN', message: 'Execution belongs to another namespace', executionId });\n return;\n }\n\n const cancelled = executionRegistry.cancel(executionId, (reason ?? 'user') as CancellationReason);\n if (!cancelled) {\n send(socket, { type: 'client:error', code: 'CANCEL_FAILED', message: 'Execution already completed or cancelled', executionId });\n }\n break;\n }\n\n default:\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: `Unknown message type: ${String(parsed.type)}` });\n }\n });\n\n // 5. Disconnect cleanup\n socket.on('close', () => {\n subscriptionRegistry.removeConnection(connectionId);\n logger.debug('Client disconnected', { connectionId });\n });\n };\n}\n","/**\n * @module gateway-app/ws/gateway-ws\n *\n * Unified WebSocket upgrade handler for the gateway.\n *\n * Intercepts upgrade requests BEFORE @fastify/http-proxy:\n * - Gateway-own WS paths (/hosts/connect, /clients/connect) → raw ws handlers\n * - Everything else → delegated to @fastify/http-proxy for upstream WS proxy\n *\n * This eliminates the conflict between @fastify/websocket and @fastify/http-proxy\n * which both try to attach 'upgrade' listeners and call assignSocket().\n */\n\nimport type { Server, IncomingMessage } from 'node:http';\nimport type { Duplex } from 'node:stream';\nimport { WebSocketServer } from 'ws';\nimport type { ICache, ILogger } from '@kb-labs/core-platform';\nimport type { JwtConfig } from '@kb-labs/gateway-auth';\nimport { createWsHandler } from '../hosts/ws-handler.js';\nimport { createClientWsHandler } from '../clients/ws-handler.js';\n\nconst GATEWAY_WS_PATHS = new Set(['/hosts/connect', '/clients/connect']);\n\n/**\n * Attach gateway-own WebSocket endpoints using raw `ws` package.\n *\n * Must be called AFTER `app.ready()` (so http-proxy has registered its\n * upgrade listener) but BEFORE `app.listen()`.\n *\n * Captures all existing 'upgrade' listeners, removes them, then installs\n * a single unified handler that dispatches:\n * - Gateway WS paths → raw ws handlers\n * - All other paths → delegated to captured listeners (http-proxy)\n */\nexport function attachGatewayWs(\n server: Server,\n cache: ICache,\n jwtConfig: JwtConfig,\n logger: ILogger,\n hostRegistry?: import('../hosts/registry.js').HostRegistry,\n): void {\n const wss = new WebSocketServer({ noServer: true });\n const hostsHandler = createWsHandler(cache, jwtConfig, logger, hostRegistry);\n const clientsHandler = createClientWsHandler(cache, jwtConfig, logger);\n\n // Capture @fastify/http-proxy's upgrade listener(s)\n const existingListeners = server.listeners('upgrade').slice() as Array<\n (req: IncomingMessage, socket: Duplex, head: Buffer) => void\n >;\n server.removeAllListeners('upgrade');\n\n server.on('upgrade', (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;\n\n if (GATEWAY_WS_PATHS.has(pathname)) {\n // Gateway-own WS — handle directly with raw ws\n wss.handleUpgrade(req, socket, head, (ws) => {\n if (pathname === '/hosts/connect') {\n hostsHandler(ws, req);\n } else {\n clientsHandler(ws, req);\n }\n });\n } else {\n // Delegate to @fastify/http-proxy for upstream WS proxy\n for (const listener of existingListeners) {\n listener.call(server, req, socket, head);\n }\n }\n });\n\n logger.info('Gateway WS endpoints attached', { paths: [...GATEWAY_WS_PATHS] });\n}\n","import type { FastifyInstance, FastifyReply, FastifyRequest, HookHandlerDoneFunction } from 'fastify';\nimport type { GatewayConfig } from '@kb-labs/gateway-contracts';\nimport {\n OBSERVABILITY_CONTRACT_VERSION,\n OBSERVABILITY_SCHEMA,\n CANONICAL_OBSERVABILITY_METRICS,\n type ServiceHealthStatus,\n type ObservabilityCheck,\n} from '@kb-labs/core-contracts';\nimport type { ServiceObservabilityDescribe, ServiceObservabilityHealth } from '@kb-labs/core-contracts';\nimport {\n createServiceObservabilityDescribe,\n createServiceObservabilityHealth,\n OperationMetricsTracker,\n} from '@kb-labs/shared-http';\nimport { hostname } from 'node:os';\nimport { monitorEventLoopDelay, performance } from 'node:perf_hooks';\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n kbMetricsStart?: number;\n }\n}\n\ntype RouteStats = {\n count: number;\n totalDurationMs: number;\n maxDurationMs: number;\n errorCount: number;\n};\n\nfunction normalizeRoute(route: string | undefined): string {\n if (!route) {\n return 'unknown';\n }\n return route\n .split('?')[0]!\n .replace(/\\/[0-9a-fA-F-]{6,}/g, '/:id');\n}\n\nfunction metricLine(name: string, value: number, labels?: Record<string, string>): string {\n if (!labels || Object.keys(labels).length === 0) {\n return `${name} ${value}`;\n }\n const pairs = Object.entries(labels).map(([key, labelValue]) => `${key}=\"${labelValue.replace(/\"/g, '\\\\\"')}\"`);\n return `${name}{${pairs.join(',')}} ${value}`;\n}\n\nexport class GatewayObservabilityCollector {\n private readonly instanceId = `${hostname()}:${process.pid}`;\n private readonly eventLoop = monitorEventLoopDelay({ resolution: 20 });\n private readonly routeStats = new Map<string, RouteStats>();\n private readonly operationMetrics = new OperationMetricsTracker();\n private readonly startedAt = Date.now();\n private readonly dependencies;\n private lastCpuUsage = process.cpuUsage();\n private lastCpuTime = Date.now();\n private intervalId: NodeJS.Timeout | null = null;\n private activeOperations = 0;\n private requestsTotal = 0;\n private errorsTotal = 0;\n private lastSnapshot = {\n cpuPercent: 0,\n rssBytes: process.memoryUsage().rss,\n heapUsedBytes: process.memoryUsage().heapUsed,\n eventLoopLagMs: 0,\n };\n\n constructor(private readonly config: GatewayConfig) {\n this.dependencies = Object.keys(this.config.upstreams).map((serviceId) => ({\n serviceId,\n required: false,\n description: 'Gateway upstream',\n }));\n }\n\n register(server: unknown): void {\n const hookServer = server as FastifyInstance;\n this.eventLoop.enable();\n this.intervalId = setInterval(() => this.captureRuntimeSnapshot(), 10_000);\n this.captureRuntimeSnapshot();\n\n hookServer.addHook('onRequest', (request: FastifyRequest, _reply: FastifyReply, done: HookHandlerDoneFunction) => {\n request.kbMetricsStart = performance.now();\n this.activeOperations += 1;\n done();\n });\n\n hookServer.addHook('onResponse', (request: FastifyRequest, reply: FastifyReply, done: HookHandlerDoneFunction) => {\n const started = request.kbMetricsStart ?? performance.now();\n const durationMs = Math.max(performance.now() - started, 0);\n const route = `${request.method.toUpperCase()} ${normalizeRoute(request.routeOptions?.url ?? request.url)}`;\n const stats = this.routeStats.get(route) ?? {\n count: 0,\n totalDurationMs: 0,\n maxDurationMs: 0,\n errorCount: 0,\n };\n\n stats.count += 1;\n stats.totalDurationMs += durationMs;\n stats.maxDurationMs = Math.max(stats.maxDurationMs, durationMs);\n if (reply.statusCode >= 400) {\n stats.errorCount += 1;\n this.errorsTotal += 1;\n }\n this.routeStats.set(route, stats);\n this.requestsTotal += 1;\n this.activeOperations = Math.max(0, this.activeOperations - 1);\n done();\n });\n\n hookServer.addHook('onClose', (_instance: unknown, done: HookHandlerDoneFunction) => {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.eventLoop.disable();\n done();\n });\n }\n\n buildDescribe(): ServiceObservabilityDescribe {\n return createServiceObservabilityDescribe({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'gateway',\n instanceId: this.instanceId,\n serviceType: 'gateway',\n version: '1.0.0',\n environment: process.env.NODE_ENV ?? 'development',\n startedAt: new Date(this.startedAt).toISOString(),\n dependencies: this.dependencies,\n metricsEndpoint: '/metrics',\n healthEndpoint: '/observability/health',\n logsSource: 'gateway',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n metricFamilies: [...CANONICAL_OBSERVABILITY_METRICS],\n });\n }\n\n buildHealth(input: {\n status: ServiceHealthStatus;\n adapterChecks: Array<{ id: string; available: boolean; latencyMs?: number }>;\n upstreamChecks: Array<{ id: string; status: string; latencyMs?: number }>;\n }): ServiceObservabilityHealth {\n const checks: ObservabilityCheck[] = [\n ...input.adapterChecks.map((entry): ObservabilityCheck => ({\n id: `adapter:${entry.id}`,\n status: entry.available ? 'ok' : 'warn',\n latencyMs: entry.latencyMs,\n message: entry.available ? 'Adapter available' : 'Adapter unavailable',\n })),\n ...input.upstreamChecks.map((entry): ObservabilityCheck => ({\n id: `upstream:${entry.id}`,\n status: entry.status === 'up' ? 'ok' : 'warn',\n latencyMs: entry.latencyMs,\n message: entry.status === 'up' ? 'Upstream healthy' : 'Upstream unavailable',\n })),\n ];\n\n const topOperations = mergeTopOperations(\n Array.from(this.routeStats.entries())\n .sort((a, b) => b[1].count - a[1].count || b[1].maxDurationMs - a[1].maxDurationMs)\n .slice(0, 5)\n .map(([operation, stats]) => ({\n operation: `http.${operation}`,\n count: stats.count,\n avgDurationMs: stats.count > 0 ? stats.totalDurationMs / stats.count : 0,\n maxDurationMs: stats.maxDurationMs,\n errorCount: stats.errorCount,\n })),\n this.operationMetrics.getTopOperations(),\n );\n\n return createServiceObservabilityHealth({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'gateway',\n instanceId: this.instanceId,\n observedAt: new Date().toISOString(),\n status: input.status,\n uptimeSec: Math.floor((Date.now() - this.startedAt) / 1000),\n metricsEndpoint: '/metrics',\n logsSource: 'gateway',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n checks,\n snapshot: {\n cpuPercent: this.lastSnapshot.cpuPercent,\n rssBytes: this.lastSnapshot.rssBytes,\n heapUsedBytes: this.lastSnapshot.heapUsedBytes,\n eventLoopLagMs: this.lastSnapshot.eventLoopLagMs,\n activeOperations: this.activeOperations,\n },\n topOperations,\n state: input.status === 'healthy' ? 'active' : input.status === 'degraded' ? 'partial_observability' : 'insufficient_data',\n meta: {\n requestsTotal: this.requestsTotal,\n errorsTotal: this.errorsTotal,\n },\n });\n }\n\n async renderPrometheusMetrics(healthStatus: ServiceHealthStatus): Promise<string> {\n this.captureRuntimeSnapshot();\n\n const lines = [\n '# HELP process_cpu_percent Current process CPU usage percentage',\n '# TYPE process_cpu_percent gauge',\n metricLine('process_cpu_percent', this.lastSnapshot.cpuPercent),\n '# HELP process_rss_bytes Current process resident set size in bytes',\n '# TYPE process_rss_bytes gauge',\n metricLine('process_rss_bytes', this.lastSnapshot.rssBytes),\n '# HELP process_heap_used_bytes Current process heap used in bytes',\n '# TYPE process_heap_used_bytes gauge',\n metricLine('process_heap_used_bytes', this.lastSnapshot.heapUsedBytes),\n '# HELP process_event_loop_lag_ms Current event loop lag in milliseconds',\n '# TYPE process_event_loop_lag_ms gauge',\n metricLine('process_event_loop_lag_ms', this.lastSnapshot.eventLoopLagMs),\n '# HELP service_health_status Service health status (2=healthy, 1=degraded, 0=unhealthy)',\n '# TYPE service_health_status gauge',\n metricLine('service_health_status', healthStatus === 'healthy' ? 2 : healthStatus === 'degraded' ? 1 : 0),\n '# HELP service_restarts_total Service restart counter within current process lifetime',\n '# TYPE service_restarts_total gauge',\n metricLine('service_restarts_total', 0),\n '# HELP service_active_operations Current number of active operations',\n '# TYPE service_active_operations gauge',\n metricLine('service_active_operations', this.activeOperations),\n '# HELP http_requests_total Total number of HTTP requests',\n '# TYPE http_requests_total counter',\n '# HELP http_errors_total Total number of HTTP errors (4xx, 5xx)',\n '# TYPE http_errors_total counter',\n '# HELP http_request_duration_ms Total duration of HTTP requests grouped by route',\n '# TYPE http_request_duration_ms summary',\n '# HELP service_operation_total Total number of service operations',\n '# TYPE service_operation_total counter',\n '# HELP service_operation_duration_ms Total duration of service operations grouped by route',\n '# TYPE service_operation_duration_ms summary',\n ];\n\n for (const [route, stats] of this.routeStats.entries()) {\n const status = stats.errorCount > 0 ? 'error' : 'ok';\n lines.push(metricLine('http_requests_total', stats.count, { route }));\n lines.push(metricLine('http_errors_total', stats.errorCount, { route }));\n lines.push(metricLine('http_request_duration_ms', Number(stats.totalDurationMs.toFixed(2)), { route }));\n lines.push(metricLine('service_operation_total', stats.count, { operation: `http.${route}`, status }));\n lines.push(metricLine('service_operation_duration_ms', Number(stats.totalDurationMs.toFixed(2)), { operation: `http.${route}`, status }));\n }\n\n lines.push(...this.operationMetrics.getMetricLines());\n\n return `${lines.join('\\n')}\\n`;\n }\n\n recordOperation(operation: string, durationMs = 0, status: 'ok' | 'error' = 'ok'): void {\n this.operationMetrics.recordOperation(operation, durationMs, status);\n }\n\n observeOperation<T>(operation: string, work: () => T | Promise<T>): Promise<T> {\n return this.operationMetrics.observeOperation(operation, work);\n }\n\n private captureRuntimeSnapshot(): void {\n const currentUsage = process.cpuUsage(this.lastCpuUsage);\n const currentTime = Date.now();\n const deltaTime = Math.max(currentTime - this.lastCpuTime, 1);\n\n this.lastCpuUsage = process.cpuUsage();\n this.lastCpuTime = currentTime;\n\n const cpuTimeMs = (currentUsage.user + currentUsage.system) / 1000;\n const memory = process.memoryUsage();\n const eventLoopLagMs = Number((this.eventLoop.mean / 1_000_000).toFixed(2));\n\n this.lastSnapshot = {\n cpuPercent: Number(Math.min((cpuTimeMs / deltaTime) * 100, 100).toFixed(2)),\n rssBytes: memory.rss,\n heapUsedBytes: memory.heapUsed,\n eventLoopLagMs: Number.isFinite(eventLoopLagMs) ? eventLoopLagMs : 0,\n };\n\n this.eventLoop.reset();\n }\n}\n\nfunction mergeTopOperations(\n httpOperations: Array<{\n operation: string;\n count: number;\n avgDurationMs: number;\n maxDurationMs: number;\n errorCount: number;\n }>,\n domainOperations: Array<{\n operation: string;\n count?: number;\n avgDurationMs?: number;\n maxDurationMs?: number;\n errorCount?: number;\n }>,\n limit = 5,\n) {\n const merged = new Map<string, {\n operation: string;\n count?: number;\n avgDurationMs?: number;\n maxDurationMs?: number;\n errorCount?: number;\n }>();\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","import Fastify from 'fastify';\nimport fastifyCors from '@fastify/cors';\nimport fastifyHttpProxy from '@fastify/http-proxy';\nimport { platform } from '@kb-labs/core-runtime';\nimport {\n createCorrelatedLogger,\n createServiceReadyResponse,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\nimport { logDiagnosticEvent, type ICache, type ILogger } from '@kb-labs/core-platform';\nimport type { GatewayConfig } from '@kb-labs/gateway-contracts';\nimport { HostRegistrationSchema } from '@kb-labs/gateway-contracts';\nimport { AuthService, type JwtConfig } from '@kb-labs/gateway-auth';\nimport { createAuthMiddleware } from './auth/middleware.js';\nimport { registerAuthRoutes } from './auth/routes.js';\nimport { registerExecuteRoutes } from './execute/routes.js';\nimport { registerLLMGatewayRoutes } from './llm/routes.js';\nimport { registerTelemetryRoutes } from './telemetry/routes.js';\nimport { registerPlatformRoutes } from './platform/routes.js';\nimport { registerAggregatedDocsRoutes } from './docs/routes.js';\nimport { HostRegistry } from './hosts/registry.js';\nimport { globalDispatcher } from './hosts/dispatcher.js';\nimport { attachGatewayWs } from './ws/gateway-ws.js';\nimport { GatewayObservabilityCollector } from './observability/collector.js';\nimport { randomUUID } from 'node:crypto';\n\nexport async function createServer(\n config: GatewayConfig,\n cache: ICache,\n logger: ILogger,\n jwtConfig: JwtConfig,\n registry?: HostRegistry,\n) {\n const gatewayLogger = createCorrelatedLogger(logger, {\n serviceId: 'gateway',\n logsSource: 'gateway',\n layer: 'gateway',\n service: 'server',\n operation: 'gateway.http',\n });\n const app = Fastify({\n logger: false,\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n // OpenAPI / Swagger UI — must be registered before routes\n await registerOpenAPI(app, {\n title: 'KB Labs Gateway',\n description: 'Central API gateway — auth, LLM, telemetry, platform dispatch',\n version: '1.0.0',\n servers: [{ url: 'http://localhost:4000', description: 'Local dev' }],\n ui: !isProduction,\n });\n\n await app.register(fastifyCors, { origin: true });\n const observability = new GatewayObservabilityCollector(config);\n observability.register(app);\n app.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || request.id || randomUUID();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || randomUUID();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n (request as any).kbLogger = createCorrelatedLogger(logger, {\n serviceId: 'gateway',\n logsSource: 'gateway',\n layer: 'gateway',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n (request as any).kbLogger.info(`→ ${request.method.toUpperCase()} ${request.url}`);\n });\n\n app.addHook('onResponse', async (request, reply) => {\n const requestLogger = (request as any).kbLogger as { info: (message: string, meta?: Record<string, unknown>) => void } | undefined;\n if (!requestLogger) {\n return;\n }\n\n requestLogger.info(`✓ ${request.method.toUpperCase()} ${request.url} ${reply.statusCode}`, {\n statusCode: reply.statusCode,\n });\n });\n\n // ── Proxy upstreams ────────────────────────────────────────────────\n // Registered FIRST, before any hooks. Auth is handled by upstreams themselves.\n // @fastify/http-proxy with websocket:true intercepts upgrades at the HTTP\n // server level — no Fastify hooks must touch these requests.\n // Gateway is a dumb proxy — real per-route timeout enforcement lives in REST API.\n // 1 hour hard ceiling; anything longer should be a background job.\n const PROXY_TIMEOUT_MS = 3_600_000;\n\n for (const [name, upstream] of Object.entries(config.upstreams)) {\n await app.register(fastifyHttpProxy, {\n upstream: upstream.url,\n prefix: upstream.prefix,\n rewritePrefix: upstream.rewritePrefix ?? upstream.prefix,\n disableCache: true,\n websocket: upstream.websocket ?? false,\n http: {\n requestOptions: {\n timeout: PROXY_TIMEOUT_MS,\n },\n },\n });\n gatewayLogger.info(`Upstream registered: ${name} → ${upstream.url} (${upstream.prefix}${upstream.websocket ? ', ws' : ''})`);\n }\n\n // ── Gateway's own routes (with auth) ───────────────────────────────\n // Encapsulated scope: auth hook only applies to gateway-owned routes,\n // not to proxy upstreams registered above.\n await app.register(async function gatewayRoutes(scope) {\n scope.addHook('onRequest', createAuthMiddleware(cache, jwtConfig));\n\n // Auth service + public routes (/auth/register, /auth/token, /auth/refresh)\n const authService = new AuthService(cache, jwtConfig);\n registerAuthRoutes(scope as unknown as Parameters<typeof registerAuthRoutes>[0], authService);\n\n // Health (public) — comprehensive adapter + upstream health\n const HEALTH_CACHE_KEY = '__gateway_health';\n const HEALTH_CACHE_TTL = 15_000; // 15s cache to prevent health DDoS\n const startupTime = Date.now();\n\n const collectHealthSnapshot = async () => {\n const cached = await cache.get<Record<string, unknown>>(HEALTH_CACHE_KEY).catch(() => null);\n if (cached) {\n return cached;\n }\n\n const adapterNames = ['llm', 'cache', 'analytics', 'vectorStore', 'embeddings'] as const;\n const adapters: Record<string, { available: boolean; latencyMs?: number }> = {};\n\n for (const name of adapterNames) {\n await observability.observeOperation(`gateway.adapter.${name}`, async () => {\n const probeStart = Date.now();\n try {\n const adapter = (platform as any)[name];\n adapters[name] = { available: !!adapter, latencyMs: Date.now() - probeStart };\n } catch {\n adapters[name] = { available: false, latencyMs: Date.now() - probeStart };\n }\n });\n }\n\n const upstreams: Record<string, { status: string; latencyMs?: number }> = {};\n for (const [name, upstream] of Object.entries(config.upstreams)) {\n await observability.observeOperation(`gateway.upstream.${name}.health`, async () => {\n const probeStart = Date.now();\n try {\n const res = await fetch(`${upstream.url}/health`, {\n signal: AbortSignal.timeout(2000),\n });\n const latencyMs = Date.now() - probeStart;\n upstreams[name] = { status: res.ok ? 'up' : 'down', latencyMs };\n if (!res.ok) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.upstream.health',\n level: 'warn',\n reasonCode: 'upstream_unavailable',\n message: 'Gateway upstream health probe failed',\n outcome: 'failed',\n serviceId: 'gateway',\n route: `${upstream.prefix}/health`,\n evidence: {\n upstreamId: name,\n upstreamUrl: upstream.url,\n statusCode: res.status,\n latencyMs,\n },\n });\n }\n } catch (error) {\n const latencyMs = Date.now() - probeStart;\n upstreams[name] = { status: 'down', latencyMs };\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.upstream.health',\n level: 'warn',\n reasonCode: 'upstream_unavailable',\n message: 'Gateway upstream health probe failed',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n route: `${upstream.prefix}/health`,\n evidence: {\n upstreamId: name,\n upstreamUrl: upstream.url,\n latencyMs,\n },\n });\n }\n });\n }\n\n const llmOk = adapters.llm?.available ?? false;\n const allOk = Object.values(adapters).every((a) => a.available);\n const snapshot = {\n status: llmOk ? (allOk ? 'healthy' : 'degraded') : 'unhealthy',\n version: '1.0',\n uptime: Math.floor((Date.now() - startupTime) / 1000),\n timestamp: new Date().toISOString(),\n adapters,\n upstreams,\n };\n\n await cache.set(HEALTH_CACHE_KEY, snapshot, HEALTH_CACHE_TTL).catch(() => {});\n return snapshot;\n };\n\n scope.get('/health', { schema: { tags: ['System'], summary: 'Gateway health check' } }, async () => {\n return collectHealthSnapshot();\n });\n\n scope.get('/ready', { schema: { tags: ['System'], summary: 'Gateway readiness check' } }, async (_request, reply) => {\n const health = await collectHealthSnapshot();\n const upstreams = (health.upstreams as Record<string, { status?: string }> | undefined) ?? {};\n const missingRequiredUpstreams = ['rest']\n .filter((id) => (upstreams[id]?.status ?? 'down') !== 'up');\n const ready = missingRequiredUpstreams.length === 0;\n\n return reply.code(ready ? 200 : 503).send(createServiceReadyResponse({\n ready,\n status: ready ? 'ready' : 'degraded',\n reason: ready ? 'ready' : `upstream_unavailable:${missingRequiredUpstreams.join(',')}`,\n components: {\n gatewayAdapters: {\n ready: true,\n },\n restUpstream: {\n ready: (upstreams.rest?.status ?? 'down') === 'up',\n status: upstreams.rest?.status ?? 'down',\n },\n workflowUpstream: {\n ready: (upstreams.workflow?.status ?? 'down') === 'up',\n status: upstreams.workflow?.status ?? 'down',\n },\n marketplaceUpstream: {\n ready: (upstreams.marketplace?.status ?? 'down') === 'up',\n status: upstreams.marketplace?.status ?? 'down',\n },\n },\n }));\n });\n\n scope.get('/metrics', { schema: { tags: ['Observability'], summary: 'Gateway metrics in Prometheus format' } }, async (_request, reply) => {\n const health = await collectHealthSnapshot();\n const status = (health.status as 'healthy' | 'degraded' | 'unhealthy' | undefined) ?? 'healthy';\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return observability.renderPrometheusMetrics(status);\n });\n\n scope.get('/observability/describe', {\n schema: { tags: ['Observability'], summary: 'Gateway observability contract descriptor' },\n }, async () => observability.buildDescribe());\n\n scope.get('/observability/health', {\n schema: { tags: ['Observability'], summary: 'Gateway observability health snapshot' },\n }, async () => {\n const health = await collectHealthSnapshot();\n const adapterChecks = Object.entries((health.adapters as Record<string, { available?: boolean; latencyMs?: number }> | undefined) ?? {})\n .map(([id, value]) => ({ id, available: !!value?.available, latencyMs: value?.latencyMs }));\n const upstreamChecks = Object.entries((health.upstreams as Record<string, { status?: string; latencyMs?: number }> | undefined) ?? {})\n .map(([id, value]) => ({ id, status: value?.status ?? 'unknown', latencyMs: value?.latencyMs }));\n const status = (health.status as 'healthy' | 'degraded' | 'unhealthy' | undefined) ?? 'healthy';\n return observability.buildHealth({ status, adapterChecks, upstreamChecks });\n });\n\n // Host registration (public)\n // Use injected registry (with persistence) or fallback to cache-only\n if (!registry) {\n gatewayLogger.warn('No persistent HostRegistry injected — hosts will be lost on restart');\n }\n const hostRegistry = registry ?? new HostRegistry(cache);\n scope.post('/hosts/register', { schema: { tags: ['Hosts'], summary: 'Register a host' } }, async (request, reply) => {\n const parsed = HostRegistrationSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n const result = await hostRegistry.register(parsed.data);\n return reply.code(201).send({\n hostId: result.descriptor.hostId,\n machineToken: result.machineToken,\n status: result.descriptor.status,\n });\n });\n\n // List hosts (auth required)\n scope.get('/hosts', { schema: { tags: ['Hosts'], summary: 'List registered hosts' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n const hosts = await hostRegistry.list(auth.namespaceId);\n return { hosts };\n });\n\n // Get host by ID (auth required)\n scope.get<{ Params: { hostId: string } }>('/hosts/:hostId', { schema: { tags: ['Hosts'], summary: 'Get host by ID' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n const { hostId } = request.params;\n const host = await hostRegistry.get(hostId, auth.namespaceId);\n if (!host) {\n return reply.code(404).send({ error: 'Host not found' });\n }\n return host;\n });\n\n // Deregister host (auth required)\n scope.delete<{ Params: { hostId: string } }>('/hosts/:hostId', { schema: { tags: ['Hosts'], summary: 'Deregister a host' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n const { hostId } = request.params;\n const deleted = await hostRegistry.deregister(hostId, auth.namespaceId);\n if (!deleted) {\n return reply.code(404).send({ error: 'Host not found' });\n }\n return reply.code(204).send();\n });\n\n // Execute endpoint — public API for CLI/Studio clients (auth required)\n registerExecuteRoutes(scope as unknown as Parameters<typeof registerExecuteRoutes>[0], logger);\n\n // AI Gateway — OpenAI-compatible LLM endpoint (auth required)\n registerLLMGatewayRoutes(scope as unknown as Parameters<typeof registerLLMGatewayRoutes>[0], logger);\n\n // Telemetry ingestion — unified event collection (auth required)\n registerTelemetryRoutes(scope as unknown as Parameters<typeof registerTelemetryRoutes>[0], logger);\n\n // Unified Platform API — single dispatch for any adapter (auth required)\n registerPlatformRoutes(scope as unknown as Parameters<typeof registerPlatformRoutes>[0], logger);\n\n // Aggregated docs — /openapi-merged.json + /docs-all\n registerAggregatedDocsRoutes(scope as unknown as Parameters<typeof registerAggregatedDocsRoutes>[0], cache);\n\n\n // Internal dispatch endpoint\n const internalSecret = process.env.GATEWAY_INTERNAL_SECRET;\n scope.post('/internal/dispatch', async (request, reply) => {\n const provided = request.headers['x-internal-secret'];\n if (!internalSecret || provided !== internalSecret) {\n return reply.code(403).send({ error: 'Forbidden' });\n }\n\n const body = request.body as {\n namespaceId?: string;\n hostId?: string;\n adapter?: string;\n method?: string;\n args?: unknown[];\n };\n\n if (!body.namespaceId || !body.adapter || !body.method) {\n return reply.code(400).send({ error: 'Missing required fields: namespaceId, adapter, method' });\n }\n\n const hostId = body.hostId\n ?? globalDispatcher.firstHostWithCapability(body.namespaceId, body.adapter)\n ?? globalDispatcher.firstHost(body.namespaceId);\n if (!hostId) {\n return reply.code(503).send({\n error: 'No host connected',\n namespaceId: body.namespaceId,\n });\n }\n\n try {\n const result = await globalDispatcher.call(\n body.namespaceId,\n hostId,\n body.adapter,\n body.method,\n body.args ?? [],\n );\n return { result };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes('Host not connected')) {\n return reply.code(503).send({ error: message });\n }\n return reply.code(502).send({ error: message });\n }\n });\n\n // Internal host resolution endpoint\n scope.post('/internal/resolve-host', async (request, reply) => {\n const provided = request.headers['x-internal-secret'];\n if (!internalSecret || provided !== internalSecret) {\n return reply.code(403).send({ error: 'Forbidden' });\n }\n\n const body = request.body as {\n namespaceId?: string;\n target?: {\n hostId?: string;\n hostSelection?: string;\n repoFingerprint?: string;\n };\n };\n\n const namespaceId = body.namespaceId ?? 'default';\n const target = body.target ?? {};\n const strategy = (target.hostSelection ?? 'any-matching') as string;\n\n let hostId: string | undefined;\n\n if (strategy === 'pinned' && target.hostId) {\n // Verify host exists and is reachable (online or reconnecting)\n const host = await hostRegistry.get(target.hostId, namespaceId);\n if (host?.status === 'online' || host?.status === 'reconnecting') {\n hostId = target.hostId;\n }\n } else {\n // any-matching / prefer-local / prefer-cloud: find first with execution capability\n hostId = globalDispatcher.firstHostWithCapability(namespaceId, 'execution');\n }\n\n if (!hostId) {\n return reply.code(404).send({ error: 'No matching host found' });\n }\n\n return { hostId, strategy, namespaceId };\n });\n });\n\n // ── Gateway WebSocket endpoints ────────────────────────────────────\n // Must be after ready() so http-proxy's upgrade listener is registered.\n // attachGatewayWs captures it, removes it, and installs a unified handler\n // that dispatches gateway WS paths to raw ws handlers and delegates\n // everything else (upstream WS proxy) to http-proxy.\n await app.ready();\n attachGatewayWs(app.server, cache, jwtConfig, logger, registry);\n\n return app;\n}\n","import { logDiagnosticEvent } from '@kb-labs/core-platform';\nimport { platform, createServiceBootstrap } from '@kb-labs/core-runtime';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport type { IHostStore } from '@kb-labs/gateway-contracts';\nimport { SqliteHostStore } from '@kb-labs/gateway-core';\nimport { loadGatewayConfig } from './config.js';\nimport { createServer } from './server.js';\nimport { HostRegistry } from './hosts/registry.js';\n\nexport async function bootstrap(repoRoot: string = process.cwd()): Promise<void> {\n // 1. Initialize platform (loads .env + adapters from kb.config.json)\n await createServiceBootstrap({ appId: 'gateway', repoRoot });\n\n const logger = createCorrelatedLogger(platform.logger, {\n serviceId: 'gateway',\n logsSource: 'gateway',\n layer: 'gateway',\n service: 'bootstrap',\n operation: 'gateway.bootstrap',\n });\n logger.info('Platform initialized', { repoRoot });\n\n // 2. Load gateway config — reads gateway.upstreams from kb.config.json\n const config = await loadGatewayConfig(repoRoot);\n logger.info('Gateway config loaded', {\n port: config.port,\n upstreams: Object.keys(config.upstreams),\n });\n\n // 3. Create persistent host store (SQLite if available, otherwise cache-only)\n let hostStore: IHostStore | undefined;\n const db = platform.getAdapter<import('@kb-labs/core-platform').ISQLDatabase>('sqlDatabase');\n if (db) {\n hostStore = new SqliteHostStore(db);\n logger.info('Host store: SQLite (persistent)');\n } else {\n logger.warn('Host store: none (cache-only, hosts will be lost on restart)');\n }\n\n // 4. Create host registry with cache + store\n const registry = new HostRegistry(platform.cache, hostStore);\n\n // 5. Restore persisted hosts into cache\n let restoredCount = 0;\n try {\n restoredCount = await registry.restore();\n } catch (error) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'gateway.hosts.restore',\n level: 'error',\n reasonCode: 'registry_restore_failed',\n message: 'Failed to restore gateway host registry',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n evidence: {\n persistentStore: !!hostStore,\n },\n });\n throw error;\n }\n if (restoredCount > 0) {\n logger.info('Restored hosts from store', { count: restoredCount });\n }\n\n // 6. Seed static tokens into cache so resolveToken() accepts them\n for (const [token, entry] of Object.entries(config.staticTokens)) {\n await platform.cache.set(`host:token:${token}`, entry);\n logger.info('Static token seeded', { hostId: entry.hostId, namespaceId: entry.namespaceId });\n }\n\n // 7. Build JWT config — secret from env, required in production\n const jwtSecret = process.env.GATEWAY_JWT_SECRET;\n if (!jwtSecret) {\n logger.warn('GATEWAY_JWT_SECRET not set — using insecure default (dev only!)');\n }\n const jwtConfig = { secret: jwtSecret ?? 'dev-insecure-secret-change-me' };\n\n // 8. Create server with injected registry\n const server = await createServer(config, platform.cache, platform.logger, jwtConfig, registry);\n\n // 9. Listen\n const address = await server.listen({ port: config.port, host: '0.0.0.0' });\n logger.info('Gateway listening', { address });\n\n // 10. Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.warn('Received shutdown signal', { signal });\n await platform.shutdown();\n await server.close();\n logger.info('Gateway shutdown complete');\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n}\n","import { bootstrap } from './bootstrap.js';\n\n// process.cwd() = workspace root when launched via `node ./infra/kb-labs-gateway/.../dist/index.js`\nbootstrap(process.cwd()).catch((error) => {\n console.error('Failed to start gateway:', error);\n process.exit(1);\n});\n"]}
1
+ {"version":3,"sources":["../src/config.ts","../src/auth/tokens.ts","../src/auth/middleware.ts","../src/auth/routes.ts","../src/execute/execution-registry.ts","../src/clients/subscription-registry.ts","../src/execute/errors.ts","../src/execute/retry-executor.ts","../src/execute/routes.ts","../src/llm/routes.ts","../src/telemetry/routes.ts","../src/platform/routes.ts","../src/docs/routes.ts","../src/hosts/registry.ts","../src/hosts/ws-handler.ts","../src/clients/ws-handler.ts","../src/ws/gateway-ws.ts","../src/observability/collector.ts","../src/server.ts","../src/bootstrap.ts","../src/index.ts"],"names":["result","response","platform","randomUUID","logDiagnosticEvent","HELLO_TIMEOUT_MS","send","AuthService","createCorrelatedLogger"],"mappings":"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","file":"index.js","sourcesContent":["import { findNearestConfig, readJsonWithDiagnostics } from '@kb-labs/core-config';\nimport { GatewayConfigSchema, type GatewayConfig } from '@kb-labs/gateway-contracts';\n\nexport async function loadGatewayConfig(repoRoot: string): Promise<GatewayConfig> {\n const { path: configPath } = await findNearestConfig({\n startDir: repoRoot,\n filenames: ['.kb/kb.config.json', 'kb.config.json'],\n });\n\n if (!configPath) {\n return GatewayConfigSchema.parse({});\n }\n\n const result = await readJsonWithDiagnostics<{ gateway?: unknown }>(configPath);\n if (!result.ok || !result.data.gateway) {\n return GatewayConfigSchema.parse({});\n }\n\n return GatewayConfigSchema.parse(result.data.gateway);\n}\n","import type { ICache } from '@kb-labs/core-platform';\nimport type { AuthContext } from '@kb-labs/gateway-contracts';\nimport { AuthService, type JwtConfig } from '@kb-labs/gateway-auth';\n\n/**\n * Resolve a Bearer token to an AuthContext.\n * Tries JWT verification first, falls back to static machine token (dev compat).\n */\nexport async function resolveToken(\n token: string,\n cache: ICache,\n jwtConfig: JwtConfig,\n): Promise<AuthContext | null> {\n const authService = new AuthService(cache, jwtConfig);\n\n // Try JWT first (v2)\n const jwtContext = await authService.verify(token);\n if (jwtContext) {return jwtContext;}\n\n // Fallback: static machine token in ICache (v1 compat — dev-studio-token etc.)\n const machineEntry = await cache.get<{ hostId: string; namespaceId: string }>(\n `host:token:${token}`,\n );\n if (machineEntry) {\n return {\n type: 'machine',\n userId: machineEntry.hostId,\n namespaceId: machineEntry.namespaceId,\n tier: 'free',\n permissions: ['host:connect'],\n };\n }\n\n return null;\n}\n\nexport function extractBearerToken(authHeader: string | undefined): string | null {\n if (!authHeader) {return null;}\n const match = authHeader.match(/^Bearer\\s+(.+)$/i);\n return match ? (match[1] ?? null) : null;\n}\n","import type { FastifyRequest, FastifyReply } from 'fastify';\nimport type { ICache } from '@kb-labs/core-platform';\nimport type { AuthContext } from '@kb-labs/gateway-contracts';\nimport type { JwtConfig } from '@kb-labs/gateway-auth';\nimport { resolveToken, extractBearerToken } from './tokens.js';\n\n// Routes that don't require auth (handle their own auth internally)\nconst PUBLIC_ROUTES = new Set([\n '/health',\n '/hosts/register',\n // /hosts/connect and /clients/connect are handled at the HTTP upgrade level\n // by gateway-ws.ts (raw ws) — they never reach Fastify routing.\n '/auth/register',\n '/auth/token',\n '/auth/refresh',\n '/internal/dispatch', // has its own x-internal-secret auth\n '/internal/resolve-host', // has its own x-internal-secret auth\n]);\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n authContext?: AuthContext;\n }\n}\n\nexport function createAuthMiddleware(cache: ICache, jwtConfig: JwtConfig) {\n return async function authMiddleware(\n request: FastifyRequest,\n reply: FastifyReply,\n ): Promise<void> {\n const rawPath = new URL(request.url, 'http://localhost').pathname;\n const routePath = rawPath.replace(/\\/+/g, '/').replace(/\\/+$/, '') || '/';\n if (PUBLIC_ROUTES.has(routePath)) {return;}\n\n // Bearer header takes precedence; fall back to ?access_token= for SSE\n // connections where browsers cannot set custom headers.\n const queryToken = (request.query as Record<string, string | undefined>)['access_token'];\n const token = extractBearerToken(request.headers.authorization) ?? queryToken ?? null;\n if (!token) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Missing Authorization header' });\n }\n\n const authContext = await resolveToken(token, cache, jwtConfig);\n if (!authContext) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Invalid token' });\n }\n\n request.authContext = authContext;\n };\n}\n","/**\n * Auth routes — public endpoints for agent registration and token management.\n * POST /auth/register — register new agent, get clientId + clientSecret\n * POST /auth/token — exchange credentials for JWT pair\n * POST /auth/refresh — rotate refresh token, get new pair\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport type { AuthService } from '@kb-labs/gateway-auth';\nimport {\n RegisterRequestSchema,\n TokenRequestSchema,\n RefreshRequestSchema,\n} from '@kb-labs/gateway-contracts';\n\nexport function registerAuthRoutes(app: FastifyInstance, authService: AuthService): void {\n // Register new agent\n app.post('/auth/register', { schema: { tags: ['Auth'], summary: 'Register new agent and get credentials' } }, async (request, reply) => {\n const parsed = RegisterRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const result = await authService.register(parsed.data);\n return reply.code(201).send(result);\n });\n\n // Issue token pair\n app.post('/auth/token', { schema: { tags: ['Auth'], summary: 'Issue JWT token pair' } }, async (request, reply) => {\n const parsed = TokenRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const tokens = await authService.issueTokens(parsed.data.clientId, parsed.data.clientSecret);\n if (!tokens) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Invalid credentials' });\n }\n\n return reply.send(tokens);\n });\n\n // Refresh token pair\n app.post('/auth/refresh', { schema: { tags: ['Auth'], summary: 'Refresh JWT token pair' } }, async (request, reply) => {\n const parsed = RefreshRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const tokens = await authService.refreshTokens(parsed.data.refreshToken);\n if (!tokens) {\n return reply.code(401).send({ error: 'Unauthorized', message: 'Invalid or expired refresh token' });\n }\n\n return reply.send(tokens);\n });\n}\n","/**\n * @module gateway-app/execute/execution-registry\n *\n * Tracks active executions with AbortController for cancellation.\n *\n * Lifecycle:\n * 1. POST /execute → registry.register(executionId, ...) → AbortSignal\n * 2. POST /execute/:id/cancel → registry.cancel(executionId, reason) → abort()\n * 3. Execution completes or aborted → registry.remove(executionId)\n *\n * Also supports host disconnect: cancelByHost() aborts all executions\n * dispatched to a host that went offline.\n */\n\nimport type { CancellationReason } from '@kb-labs/core-contracts';\n\nexport interface ActiveExecution {\n executionId: string;\n requestId: string;\n namespaceId: string;\n hostId: string;\n pluginId: string;\n handlerRef: string;\n controller: AbortController;\n startedAt: number;\n cancelledReason?: CancellationReason;\n}\n\nexport class ExecutionRegistry {\n private executions = new Map<string, ActiveExecution>();\n\n /** Register a new execution. Returns AbortSignal to wire into the dispatch. */\n register(entry: Omit<ActiveExecution, 'controller' | 'startedAt'>): AbortSignal {\n const controller = new AbortController();\n this.executions.set(entry.executionId, {\n ...entry,\n controller,\n startedAt: Date.now(),\n });\n return controller.signal;\n }\n\n /** Cancel an execution by ID. Returns true if found and aborted. */\n cancel(executionId: string, reason: CancellationReason): boolean {\n const entry = this.executions.get(executionId);\n if (!entry) { return false; }\n if (entry.controller.signal.aborted) { return false; }\n\n entry.cancelledReason = reason;\n entry.controller.abort(reason);\n return true;\n }\n\n /** Remove a completed/cancelled execution. */\n remove(executionId: string): void {\n this.executions.delete(executionId);\n }\n\n /** Get an active execution. */\n get(executionId: string): ActiveExecution | undefined {\n return this.executions.get(executionId);\n }\n\n /** Cancel all executions dispatched to a host (on host disconnect). */\n cancelByHost(hostId: string, reason: CancellationReason): string[] {\n const cancelled: string[] = [];\n for (const entry of this.executions.values()) {\n if (entry.hostId === hostId && !entry.controller.signal.aborted) {\n entry.cancelledReason = reason;\n entry.controller.abort(reason);\n cancelled.push(entry.executionId);\n }\n }\n return cancelled;\n }\n\n /** Number of active executions. */\n get size(): number {\n return this.executions.size;\n }\n}\n\n/** Singleton — shared across Gateway process. */\nexport const executionRegistry = new ExecutionRegistry();\n","/**\n * @module gateway-app/clients/subscription-registry\n *\n * Tracks which client connections are subscribed to which executions.\n * Gateway broadcasts ExecutionEvents to all subscribers of an execution.\n *\n * Lifecycle:\n * - client sends client:subscribe → subscribe(connectionId, executionId)\n * - client sends client:unsubscribe → unsubscribe(connectionId, executionId)\n * - execution emits event → broadcast(executionId, event) → all subscribers\n * - client disconnects → removeConnection(connectionId) → cleanup\n *\n * The initiator of POST /api/v1/execute is NOT auto-subscribed here —\n * they receive events inline via ndjson stream. This registry is for\n * secondary observers joining an in-flight execution.\n */\n\nimport type { WebSocket } from '@fastify/websocket';\nimport type { ExecutionEventMessage } from '@kb-labs/gateway-contracts';\n\nexport interface ISubscriptionRegistry {\n subscribe(connectionId: string, executionId: string): void;\n unsubscribe(connectionId: string, executionId: string): void;\n getSubscribers(executionId: string): ReadonlySet<string>;\n getSubscriptions(connectionId: string): ReadonlySet<string>;\n /** Called on client disconnect. Returns executionIds that now have zero subscribers. */\n removeConnection(connectionId: string): string[];\n broadcast(executionId: string, event: ExecutionEventMessage): void;\n}\n\nexport class SubscriptionRegistry implements ISubscriptionRegistry {\n /** executionId → Set<connectionId> */\n private readonly byExecution = new Map<string, Set<string>>();\n /** connectionId → Set<executionId> */\n private readonly byConnection = new Map<string, Set<string>>();\n /** connectionId → WebSocket (for sending events) */\n private readonly sockets = new Map<string, WebSocket>();\n\n /** Register a WebSocket for a connection. Must be called before subscribe(). */\n registerSocket(connectionId: string, socket: WebSocket): void {\n this.sockets.set(connectionId, socket);\n }\n\n /** Remove a connection's socket on disconnect. */\n removeSocket(connectionId: string): void {\n this.sockets.delete(connectionId);\n }\n\n subscribe(connectionId: string, executionId: string): void {\n let executionSubs = this.byExecution.get(executionId);\n if (!executionSubs) {\n executionSubs = new Set();\n this.byExecution.set(executionId, executionSubs);\n }\n executionSubs.add(connectionId);\n\n let connectionSubs = this.byConnection.get(connectionId);\n if (!connectionSubs) {\n connectionSubs = new Set();\n this.byConnection.set(connectionId, connectionSubs);\n }\n connectionSubs.add(executionId);\n }\n\n unsubscribe(connectionId: string, executionId: string): void {\n this.byExecution.get(executionId)?.delete(connectionId);\n this.byConnection.get(connectionId)?.delete(executionId);\n\n // GC empty sets\n if (this.byExecution.get(executionId)?.size === 0) {\n this.byExecution.delete(executionId);\n }\n if (this.byConnection.get(connectionId)?.size === 0) {\n this.byConnection.delete(connectionId);\n }\n }\n\n getSubscribers(executionId: string): ReadonlySet<string> {\n return this.byExecution.get(executionId) ?? new Set();\n }\n\n getSubscriptions(connectionId: string): ReadonlySet<string> {\n return this.byConnection.get(connectionId) ?? new Set();\n }\n\n removeConnection(connectionId: string): string[] {\n const subscriptions = this.byConnection.get(connectionId);\n if (!subscriptions) {\n this.sockets.delete(connectionId);\n return [];\n }\n\n const orphaned: string[] = [];\n for (const executionId of subscriptions) {\n const subs = this.byExecution.get(executionId);\n if (subs) {\n subs.delete(connectionId);\n if (subs.size === 0) {\n this.byExecution.delete(executionId);\n orphaned.push(executionId);\n }\n }\n }\n\n this.byConnection.delete(connectionId);\n this.sockets.delete(connectionId);\n return orphaned;\n }\n\n broadcast(executionId: string, event: ExecutionEventMessage): void {\n const subscribers = this.byExecution.get(executionId);\n if (!subscribers || subscribers.size === 0) { return; }\n\n const payload = JSON.stringify(event);\n for (const connectionId of subscribers) {\n const socket = this.sockets.get(connectionId);\n if (socket && socket.readyState === socket.OPEN) {\n socket.send(payload);\n }\n }\n }\n\n get connectionCount(): number {\n return this.byConnection.size;\n }\n\n get subscriptionCount(): number {\n let total = 0;\n for (const subs of this.byExecution.values()) {\n total += subs.size;\n }\n return total;\n }\n}\n\n/** Singleton — shared across Gateway process. */\nexport const subscriptionRegistry = new SubscriptionRegistry();\n","/**\n * @module gateway-app/execute/errors\n *\n * Shared error types for execution pipeline.\n */\n\nimport type { CancellationReason } from '@kb-labs/core-contracts';\n\n/**\n * Thrown when an execution is cancelled (CC2).\n * Caught by routes.ts to emit execution:cancelled + execution:done(130).\n */\nexport class CancelledError extends Error {\n readonly reason: CancellationReason;\n\n constructor(reason: CancellationReason) {\n super(`Execution cancelled: ${reason}`);\n this.name = 'CancelledError';\n this.reason = reason;\n }\n}\n","/**\n * @module gateway-app/execute/retry-executor\n *\n * Level 2 retry wrapper for execution dispatch (CC3).\n *\n * Wraps a dispatch function with configurable retry + exponential backoff.\n * Emits execution:retry events between attempts so clients see progress.\n * Respects AbortSignal — cancels immediately, no retry after abort.\n *\n * Each attempt is raced against the AbortSignal so that a cancelled\n * execution doesn't block on a hung dispatcher call.\n */\n\nimport type { ExecutionRetryConfig, CancellationReason } from '@kb-labs/core-contracts';\nimport type { ExecutionEventMessage } from '@kb-labs/gateway-contracts';\nimport { CancelledError } from './errors.js';\n\nconst DEFAULTS: Required<ExecutionRetryConfig> = {\n maxAttempts: 1,\n initialDelayMs: 1000,\n backoffMultiplier: 2,\n maxDelayMs: 30_000,\n onlyRetryable: true,\n};\n\nexport interface RetryContext {\n executionId: string;\n requestId: string;\n signal: AbortSignal;\n config: ExecutionRetryConfig | undefined;\n /** Emit event to client stream (and WS subscribers via routes.ts). */\n write: (event: ExecutionEventMessage) => void;\n}\n\n/**\n * Execute dispatch function with retry + abort-race logic.\n *\n * - maxAttempts=1 (default) → single call, raced against signal.\n * - maxAttempts>1 → retry loop with backoff, each attempt raced against signal.\n */\nexport async function executeWithRetry<T>(\n ctx: RetryContext,\n dispatch: () => Promise<T>,\n): Promise<T> {\n const cfg = { ...DEFAULTS, ...ctx.config };\n const maxAttempts = Math.max(1, cfg.maxAttempts);\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n if (ctx.signal.aborted) {\n throw new CancelledError(ctx.signal.reason as CancellationReason);\n }\n\n try {\n return await raceAbort(ctx.signal, dispatch());\n } catch (err) {\n // Cancellation is never retried\n if (err instanceof CancelledError) { throw err; }\n\n lastError = err instanceof Error ? err : new Error(String(err));\n\n // Last attempt — propagate error\n if (attempt >= maxAttempts) { break; }\n\n // Check if error is retryable\n const classified = classifyError(err);\n if (cfg.onlyRetryable && !classified.retryable) { break; }\n\n // Backoff delay\n const delay = Math.min(\n cfg.initialDelayMs * Math.pow(cfg.backoffMultiplier, attempt - 1),\n cfg.maxDelayMs,\n );\n\n ctx.write({\n type: 'execution:retry',\n requestId: ctx.requestId,\n executionId: ctx.executionId,\n attempt,\n maxAttempts,\n delayMs: delay,\n error: classified.message,\n } satisfies ExecutionEventMessage);\n\n await interruptibleDelay(delay, ctx.signal);\n }\n }\n\n throw lastError ?? new Error('executeWithRetry: no attempts made');\n}\n\n// ── Internals ──\n\n/**\n * Race a promise against an AbortSignal.\n */\nfunction raceAbort<T>(signal: AbortSignal, promise: Promise<T>): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(new CancelledError(signal.reason as CancellationReason));\n }\n\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(new CancelledError(signal.reason as CancellationReason));\n signal.addEventListener('abort', onAbort, { once: true });\n\n promise.then(\n (v) => { signal.removeEventListener('abort', onAbort); resolve(v); },\n (e) => { signal.removeEventListener('abort', onAbort); reject(e); },\n );\n });\n}\n\n/**\n * Sleep interruptible by AbortSignal.\n */\nfunction interruptibleDelay(ms: number, signal: AbortSignal): Promise<void> {\n if (signal.aborted) {\n return Promise.reject(new CancelledError(signal.reason as CancellationReason));\n }\n\n return new Promise<void>((resolve, reject) => {\n const timer = setTimeout(resolve, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(new CancelledError(signal.reason as CancellationReason));\n };\n signal.addEventListener('abort', onAbort, { once: true });\n });\n}\n\ninterface ClassifiedError {\n code: string;\n message: string;\n retryable: boolean;\n}\n\nfunction classifyError(err: unknown): ClassifiedError {\n if (!(err instanceof Error)) {\n return { code: 'UNKNOWN', message: String(err), retryable: false };\n }\n\n const msg = err.message;\n\n // Transport / network — retryable\n if (msg.includes('ECONNREFUSED') || msg.includes('ECONNRESET') ||\n msg.includes('ETIMEDOUT') || msg.includes('timed out') ||\n msg.includes('503') || msg.includes('Service Unavailable')) {\n return { code: 'TRANSPORT_ERROR', message: msg, retryable: true };\n }\n\n // Host went offline — retryable (may reconnect)\n if (msg.includes('Host not connected')) {\n return { code: 'HOST_UNAVAILABLE', message: msg, retryable: true };\n }\n\n // Everything else — not retryable\n return { code: 'HANDLER_ERROR', message: msg, retryable: false };\n}\n","/**\n * @module gateway-app/execute/routes\n *\n * POST /api/v1/execute — Execute handler via Gateway with ndjson streaming.\n * POST /api/v1/execute/:executionId/cancel — Cancel an active execution.\n *\n * Response: Transfer-Encoding: chunked, Content-Type: application/x-ndjson\n * Each line = JSON ExecutionEvent.\n *\n * Integrates:\n * CC2 — Cancellation via ExecutionRegistry + AbortController\n * CC3 — Retry via executeWithRetry (exponential backoff, retryable errors)\n * CC5 — Broadcast to WS subscribers via SubscriptionRegistry\n */\n\nimport type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify';\nimport { randomUUID } from 'node:crypto';\nimport { ExecuteRequestSchema, type ExecutionEventMessage } from '@kb-labs/gateway-contracts';\nimport { logDiagnosticEvent, type ILogger } from '@kb-labs/core-platform';\nimport type { CancellationReason } from '@kb-labs/core-contracts';\nimport { globalDispatcher } from '../hosts/dispatcher.js';\nimport { executionRegistry } from './execution-registry.js';\nimport { subscriptionRegistry } from '../clients/subscription-registry.js';\nimport { executeWithRetry } from './retry-executor.js';\nimport { CancelledError } from './errors.js';\n\nexport function registerExecuteRoutes(app: FastifyInstance, logger: ILogger): void {\n /**\n * POST /api/v1/execute\n * hide: true — uses ndjson chunked streaming via reply.raw, incompatible with OpenAPI response schema\n */\n app.post('/api/v1/execute', { schema: { tags: ['Execute'], summary: 'Execute a plugin handler', hide: true } }, async (request: FastifyRequest, reply: FastifyReply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const parsed = ExecuteRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n\n const { pluginId, handlerRef, exportName, input, timeoutMs } = parsed.data;\n const executionId = randomUUID();\n const requestId = randomUUID();\n const startTime = Date.now();\n\n logger.info('Execute request received', {\n executionId,\n pluginId,\n handlerRef,\n namespaceId: auth.namespaceId,\n });\n\n // Resolve host with 'execution' capability\n const hostId = globalDispatcher.firstHostWithCapability(auth.namespaceId, 'execution');\n if (!hostId) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.execution.dispatch',\n level: 'warn',\n reasonCode: 'execution_host_unavailable',\n message: 'No execution host connected for namespace',\n outcome: 'failed',\n serviceId: 'gateway',\n evidence: {\n namespaceId: auth.namespaceId,\n pluginId,\n handlerRef,\n },\n });\n return reply.code(503).send({\n error: 'No execution host connected',\n hint: 'Ensure a RuntimeServer is running and connected to Gateway',\n namespaceId: auth.namespaceId,\n });\n }\n\n // Register in execution registry (CC2)\n const signal = executionRegistry.register({\n executionId,\n requestId,\n namespaceId: auth.namespaceId,\n hostId,\n pluginId,\n handlerRef,\n });\n\n // Auto-cancel on client disconnect.\n // reply.raw 'close' fires when connection drops before response finishes.\n // Check writableFinished to distinguish mid-stream disconnect from normal completion.\n reply.raw.on('close', () => {\n if (!reply.raw.writableFinished && !signal.aborted) {\n executionRegistry.cancel(executionId, 'disconnect');\n }\n });\n\n // Hijack response for ndjson streaming\n reply.raw.writeHead(200, {\n 'Content-Type': 'application/x-ndjson',\n 'Transfer-Encoding': 'chunked',\n 'Cache-Control': 'no-cache',\n 'X-Execution-Id': executionId,\n });\n // Flush headers immediately so the client can see X-Execution-Id before any events\n reply.raw.flushHeaders();\n\n // Write typed event to initiator ndjson stream + broadcast to WS subscribers (CC5)\n const writeEvent = (event: ExecutionEventMessage): void => {\n const payload = JSON.stringify(event) + '\\n';\n if (!reply.raw.writableEnded) {\n reply.raw.write(payload);\n }\n subscriptionRegistry.broadcast(executionId, event);\n };\n\n try {\n // Dispatch with retry + abort-race (CC2 + CC3)\n // TODO: read retry config from platform config when available\n const result = await executeWithRetry(\n { executionId, requestId, signal, config: undefined, write: writeEvent },\n () => globalDispatcher.call(\n auth.namespaceId,\n hostId,\n 'execution',\n 'execute',\n [{ pluginId, handlerRef, exportName, input, executionId, requestId, timeoutMs }],\n ),\n );\n\n writeEvent({\n type: 'execution:done',\n requestId,\n executionId,\n exitCode: 0,\n durationMs: Date.now() - startTime,\n metadata: { result: result as Record<string, unknown> },\n });\n } catch (err) {\n if (err instanceof CancelledError) {\n writeEvent({\n type: 'execution:cancelled',\n requestId,\n executionId,\n reason: err.reason ?? 'user',\n durationMs: Date.now() - startTime,\n });\n\n writeEvent({\n type: 'execution:done',\n requestId,\n executionId,\n exitCode: 130,\n durationMs: Date.now() - startTime,\n });\n } else {\n const message = err instanceof Error ? err.message : String(err);\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.execution.dispatch',\n level: 'error',\n reasonCode: 'execution_dispatch_failed',\n message: 'Gateway execution dispatch failed',\n outcome: 'failed',\n error: err instanceof Error ? err : new Error(String(err)),\n serviceId: 'gateway',\n evidence: {\n namespaceId: auth.namespaceId,\n executionId,\n requestId,\n pluginId,\n handlerRef,\n hostId,\n },\n });\n\n writeEvent({\n type: 'execution:error',\n requestId,\n executionId,\n code: 'EXECUTION_FAILED',\n message,\n retryable: false,\n });\n\n writeEvent({\n type: 'execution:done',\n requestId,\n executionId,\n exitCode: 1,\n durationMs: Date.now() - startTime,\n });\n }\n } finally {\n executionRegistry.remove(executionId);\n if (!reply.raw.writableEnded) {\n reply.raw.end();\n }\n }\n });\n\n /**\n * POST /api/v1/execute/:executionId/cancel\n */\n app.post('/api/v1/execute/:executionId/cancel', { schema: { tags: ['Execute'], summary: 'Cancel an active execution' } }, async (request: FastifyRequest, reply: FastifyReply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const { executionId } = request.params as { executionId: string };\n const body = request.body as { reason?: string } | undefined;\n const reason = (body?.reason ?? 'user') as CancellationReason;\n\n const execution = executionRegistry.get(executionId);\n if (!execution) {\n return reply.code(404).send({ error: 'Execution not found or already completed' });\n }\n\n if (execution.namespaceId !== auth.namespaceId) {\n return reply.code(403).send({ error: 'Forbidden — execution belongs to another namespace' });\n }\n\n const cancelled = executionRegistry.cancel(executionId, reason);\n\n logger.info('Cancel request processed', {\n executionId,\n reason,\n cancelled,\n namespaceId: auth.namespaceId,\n });\n\n return reply.code(cancelled ? 200 : 409).send({\n executionId,\n status: cancelled ? 'cancelled' : 'already_cancelled',\n reason,\n });\n });\n}\n","/**\n * @module AI Gateway — OpenAI-compatible LLM endpoint.\n *\n * Exposes `POST /api/v1/llm/chat/completions` using OpenAI ChatCompletion format.\n * Model field is a tier abstraction (small/medium/large) — never a literal model name.\n * All calls go through the platform LLM chain: QueuedLLM → AnalyticsLLM → LLMRouter → adapter.\n */\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\nimport type {\n ILLM,\n ILogger,\n LLMMessage,\n LLMToolCallOptions,\n LLMTool,\n ILLMRouter,\n LLMTier,\n} from '@kb-labs/core-platform';\nimport {\n ChatCompletionRequestSchema,\n type ChatCompletionRequest,\n type ChatCompletionResponse,\n type ChatCompletionChunk,\n} from '@kb-labs/gateway-contracts';\n\n// ── Tier resolution ───────────────────────────────────────────────────────\n\nfunction isLLMRouter(llm: ILLM): llm is ILLM & ILLMRouter {\n return typeof (llm as any).resolveAdapter === 'function';\n}\n\n/**\n * Resolve tier to a concrete ILLM adapter via LLMRouter.\n * If no router (single-adapter setup), returns platform.llm directly.\n */\nasync function resolveLLMForTier(tier: LLMTier): Promise<ILLM | undefined> {\n const llm = platform.llm;\n if (!llm) {return undefined;}\n\n if (isLLMRouter(llm)) {\n const binding = await llm.resolveAdapter({ tier });\n return binding.adapter;\n }\n\n // Single adapter — ignore tier, return as-is\n return llm;\n}\n\n// ── Route registration ────────────────────────────────────────────────────\n\n/**\n * Register AI Gateway routes on the given Fastify scope.\n * The scope is expected to have the auth middleware already applied.\n */\nexport function registerLLMGatewayRoutes(app: FastifyInstance, logger: ILogger): void {\n // hide: true — can stream SSE (text/event-stream), incompatible with OpenAPI response schema\n app.post('/llm/v1/chat/completions', { schema: { tags: ['LLM'], summary: 'OpenAI-compatible chat completions', hide: true } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const parsed = ChatCompletionRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({\n error: {\n message: 'Bad Request',\n type: 'invalid_request_error',\n code: null,\n param: null,\n },\n issues: parsed.error.issues,\n });\n }\n\n const req = parsed.data;\n const requestId = `chatcmpl-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\n // Resolve tier to LLM adapter\n const llm = await resolveLLMForTier(req.model);\n if (!llm) {\n return reply.code(503).send({\n error: {\n message: `LLM not available for tier \"${req.model}\"`,\n type: 'server_error',\n code: null,\n param: null,\n },\n });\n }\n\n logger.info('AI Gateway request', {\n requestId,\n tier: req.model,\n stream: req.stream,\n messageCount: req.messages.length,\n hasTools: !!req.tools?.length,\n tenantId: auth.namespaceId,\n });\n\n try {\n if (req.stream) {\n return await handleStreamingRequest(reply, llm, req, requestId, logger);\n }\n return await handleCompletionRequest(reply, llm, req, requestId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n logger.error('AI Gateway error', error, { requestId, tier: req.model });\n return reply.code(500).send({\n error: {\n message: 'Internal server error',\n type: 'server_error',\n code: null,\n param: null,\n },\n });\n }\n });\n}\n\n// ── Non-streaming handler ─────────────────────────────────────────────────\n\nasync function handleCompletionRequest(\n reply: any,\n llm: ILLM,\n req: ChatCompletionRequest,\n requestId: string,\n) {\n const messages = toILLMMessages(req);\n const startTime = Date.now();\n const hasTools = req.tools && req.tools.length > 0;\n\n if (hasTools && llm.chatWithTools) {\n const tools = toILLMTools(req.tools!);\n const options: LLMToolCallOptions = {\n temperature: req.temperature,\n maxTokens: req.max_tokens,\n stop: normalizeStop(req.stop),\n tools,\n toolChoice: req.tool_choice as LLMToolCallOptions['toolChoice'],\n };\n\n const result = await llm.chatWithTools(messages, options);\n\n const toolCalls = result.toolCalls?.map((tc) => ({\n id: tc.id,\n type: 'function' as const,\n function: {\n name: tc.name,\n arguments: typeof tc.input === 'string' ? tc.input : JSON.stringify(tc.input),\n },\n }));\n\n const finishReason =\n result.stopReason === 'tool_use'\n ? ('tool_calls' as const)\n : result.stopReason === 'max_tokens'\n ? ('length' as const)\n : ('stop' as const);\n\n const response: ChatCompletionResponse = {\n id: requestId,\n object: 'chat.completion',\n created: Math.floor(startTime / 1000),\n model: req.model,\n choices: [\n {\n index: 0,\n message: {\n role: 'assistant',\n content: result.content || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n },\n finish_reason: finishReason,\n },\n ],\n usage: {\n prompt_tokens: result.usage.promptTokens,\n completion_tokens: result.usage.completionTokens,\n total_tokens: result.usage.promptTokens + result.usage.completionTokens,\n },\n };\n\n return reply.code(200).send(response);\n }\n\n // No tools — use simple complete()\n const systemPrompt = messages.find((m) => m.role === 'system')?.content;\n const userMessages = messages.filter((m) => m.role !== 'system');\n const prompt = userMessages.map((m) => m.content).join('\\n\\n');\n\n const result = await llm.complete(prompt, {\n systemPrompt,\n temperature: req.temperature,\n maxTokens: req.max_tokens,\n stop: normalizeStop(req.stop),\n });\n\n const response: ChatCompletionResponse = {\n id: requestId,\n object: 'chat.completion',\n created: Math.floor(startTime / 1000),\n model: req.model,\n choices: [\n {\n index: 0,\n message: { role: 'assistant', content: result.content },\n finish_reason: 'stop',\n },\n ],\n usage: {\n prompt_tokens: result.usage.promptTokens,\n completion_tokens: result.usage.completionTokens,\n total_tokens: result.usage.promptTokens + result.usage.completionTokens,\n },\n };\n\n return reply.code(200).send(response);\n}\n\n// ── Streaming handler ─────────────────────────────────────────────────────\n\nasync function handleStreamingRequest(\n reply: any,\n llm: ILLM,\n req: ChatCompletionRequest,\n requestId: string,\n logger: ILogger,\n) {\n const created = Math.floor(Date.now() / 1000);\n\n reply.raw.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Request-Id': requestId,\n });\n reply.raw.flushHeaders();\n\n const writeChunk = (chunk: ChatCompletionChunk): void => {\n if (!reply.raw.writableEnded) {\n reply.raw.write(`data: ${JSON.stringify(chunk)}\\n\\n`);\n }\n };\n\n const writeDone = (): void => {\n if (!reply.raw.writableEnded) {\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n }\n };\n\n try {\n // Initial role chunk\n writeChunk({\n id: requestId,\n object: 'chat.completion.chunk',\n created,\n model: req.model,\n choices: [{ index: 0, delta: { role: 'assistant' }, finish_reason: null }],\n });\n\n // Stream text from LLM\n const systemPrompt = req.messages.find((m) => m.role === 'system')?.content;\n const userMessages = req.messages.filter((m) => m.role !== 'system');\n const prompt = userMessages.map((m) => m.content).join('\\n\\n');\n\n for await (const text of llm.stream(prompt, {\n systemPrompt,\n temperature: req.temperature,\n maxTokens: req.max_tokens,\n stop: normalizeStop(req.stop),\n })) {\n writeChunk({\n id: requestId,\n object: 'chat.completion.chunk',\n created,\n model: req.model,\n choices: [{ index: 0, delta: { content: text }, finish_reason: null }],\n });\n }\n\n // Finish chunk\n writeChunk({\n id: requestId,\n object: 'chat.completion.chunk',\n created,\n model: req.model,\n choices: [{ index: 0, delta: {}, finish_reason: 'stop' }],\n });\n\n writeDone();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n logger.error('AI Gateway stream error', error, { requestId });\n if (!reply.raw.writableEnded) {\n reply.raw.write(\n `data: ${JSON.stringify({ error: { message: error.message, type: 'server_error' } })}\\n\\n`,\n );\n reply.raw.end();\n }\n }\n\n return reply;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nfunction toILLMMessages(req: ChatCompletionRequest): LLMMessage[] {\n return req.messages.map((m) => {\n const msg: LLMMessage = { role: m.role, content: m.content };\n if (m.tool_call_id) {msg.toolCallId = m.tool_call_id;}\n if (m.tool_calls) {\n msg.toolCalls = m.tool_calls.map((tc) => ({\n id: tc.id,\n name: tc.function.name,\n input: safeJsonParse(tc.function.arguments),\n }));\n }\n return msg;\n });\n}\n\nfunction toILLMTools(tools: NonNullable<ChatCompletionRequest['tools']>): LLMTool[] {\n return tools.map((t) => ({\n name: t.function.name,\n description: t.function.description ?? '',\n inputSchema: t.function.parameters ?? {},\n }));\n}\n\nfunction normalizeStop(stop: string | string[] | undefined): string[] | undefined {\n if (!stop) {return undefined;}\n return Array.isArray(stop) ? stop : [stop];\n}\n\nfunction safeJsonParse(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n}\n","/**\n * @module Telemetry Ingestion — unified event collection endpoint.\n *\n * Exposes `POST /telemetry/v1/ingest` for external products to send events.\n * Events are written to platform analytics via IAnalytics.track().\n * Auth required — tenantId extracted from auth context.\n */\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport {\n TelemetryIngestRequestSchema,\n type TelemetryIngestResponse,\n} from '@kb-labs/gateway-contracts';\n\n/**\n * Register telemetry ingestion routes on the given Fastify scope.\n * The scope is expected to have the auth middleware already applied.\n */\nexport function registerTelemetryRoutes(app: FastifyInstance, logger: ILogger): void {\n app.post('/telemetry/v1/ingest', { schema: { tags: ['Telemetry'], summary: 'Ingest telemetry events' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const parsed = TelemetryIngestRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({\n error: 'Bad Request',\n issues: parsed.error.issues,\n });\n }\n\n const analytics = platform.analytics;\n if (!analytics) {\n return reply.code(503).send({\n error: 'Analytics adapter not configured',\n });\n }\n\n const { events } = parsed.data;\n let accepted = 0;\n let rejected = 0;\n const errors: Array<{ index: number; message: string }> = [];\n\n for (let i = 0; i < events.length; i++) {\n const event = events[i]!;\n try {\n await analytics.track(event.type, {\n // Source attribution — who sent this event\n _source: event.source,\n _tenantId: auth.namespaceId,\n _ts: event.timestamp ?? new Date().toISOString(),\n // Tags as flat properties for indexing\n ...event.tags,\n // Free-form payload\n ...event.payload,\n });\n accepted++;\n } catch (err) {\n rejected++;\n const message = err instanceof Error ? err.message : String(err);\n errors.push({ index: i, message });\n logger.warn('Telemetry event rejected', {\n index: i,\n type: event.type,\n source: event.source,\n error: message,\n });\n }\n }\n\n logger.info('Telemetry ingest', {\n tenantId: auth.namespaceId,\n accepted,\n rejected,\n totalEvents: events.length,\n });\n\n const response: TelemetryIngestResponse = {\n accepted,\n rejected,\n ...(errors.length > 0 ? { errors } : {}),\n };\n\n return reply.code(accepted > 0 ? 200 : 422).send(response);\n });\n}\n","/**\n * @module Unified Platform API — single dispatch for any adapter.\n *\n * Route: POST /platform/v1/{adapter}/{method}\n *\n * Provides a single entry point for all platform adapters (LLM, Cache,\n * VectorStore, Analytics, Storage, Embeddings, etc.). Adapter and method\n * come from URL params; arguments come from the request body.\n *\n * Security: only methods explicitly listed in ALLOWED_METHODS are callable.\n */\nimport type { FastifyInstance } from 'fastify';\nimport { platform } from '@kb-labs/core-runtime';\nimport type { ILogger } from '@kb-labs/core-platform';\nimport {\n PlatformCallRequestSchema,\n type PlatformCallResponse,\n} from '@kb-labs/gateway-contracts';\n\n// ── Method allowlist ──────────────────────────────────────────────────────\n// Only methods listed here are callable via the Platform API.\n// Internal/lifecycle methods (setSource, shutdown, etc.) are NOT exposed.\n\nconst ALLOWED_METHODS: Record<string, Set<string>> = {\n llm: new Set(['complete', 'stream', 'chatWithTools']),\n cache: new Set(['get', 'set', 'delete', 'clear']),\n vectorStore: new Set(['search', 'upsert', 'delete', 'count']),\n analytics: new Set(['track', 'identify', 'flush', 'getEvents', 'getStats', 'getDailyStats']),\n embeddings: new Set(['embed']),\n storage: new Set(['read', 'write', 'delete', 'list', 'exists']),\n eventBus: new Set(['publish', 'subscribe']),\n sqlDatabase: new Set(['query', 'execute']),\n documentDatabase: new Set(['find', 'findOne', 'insert', 'update', 'delete']),\n};\n\n// ── Adapter resolution ────────────────────────────────────────────────────\n\nfunction resolveAdapter(name: string): unknown | undefined {\n // Map URL param to platform property\n const adapterMap: Record<string, () => unknown> = {\n llm: () => platform.llm,\n cache: () => platform.cache,\n analytics: () => platform.analytics,\n vectorStore: () => platform.vectorStore,\n embeddings: () => platform.embeddings,\n storage: () => platform.storage,\n eventBus: () => platform.eventBus,\n sqlDatabase: () => platform.sqlDatabase,\n documentDatabase: () => platform.documentDatabase,\n };\n\n const getter = adapterMap[name];\n return getter ? getter() : undefined;\n}\n\n// ── Streaming detection ───────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return (\n value !== null &&\n typeof value === 'object' &&\n Symbol.asyncIterator in (value as object)\n );\n}\n\n// ── Route registration ────────────────────────────────────────────────────\n\nexport function registerPlatformRoutes(app: FastifyInstance, logger: ILogger): void {\n // hide: true — can return SSE (text/event-stream) for streaming adapter calls, incompatible with OpenAPI response schema\n app.post<{ Params: { adapter: string; method: string } }>(\n '/platform/v1/:adapter/:method',\n { schema: { tags: ['Platform'], summary: 'Invoke a platform adapter method', hide: true } },\n async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n\n const { adapter: adapterName, method: methodName } = request.params;\n\n // 1. Check adapter is in allowlist\n const allowedMethods = ALLOWED_METHODS[adapterName];\n if (!allowedMethods) {\n return reply.code(404).send({\n ok: false,\n error: { message: `Unknown adapter: \"${adapterName}\"`, code: 'ADAPTER_NOT_FOUND' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 2. Check method is allowed\n if (!allowedMethods.has(methodName)) {\n return reply.code(403).send({\n ok: false,\n error: { message: `Method \"${methodName}\" not allowed on adapter \"${adapterName}\"`, code: 'METHOD_NOT_ALLOWED' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 3. Resolve adapter instance\n const adapter = resolveAdapter(adapterName);\n if (!adapter) {\n return reply.code(503).send({\n ok: false,\n error: { message: `Adapter \"${adapterName}\" not configured`, code: 'ADAPTER_UNAVAILABLE' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 4. Check method exists on adapter\n const method = (adapter as Record<string, unknown>)[methodName];\n if (typeof method !== 'function') {\n return reply.code(501).send({\n ok: false,\n error: { message: `Method \"${methodName}\" not implemented on adapter \"${adapterName}\"`, code: 'METHOD_NOT_IMPLEMENTED' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n // 5. Parse args\n const parsed = PlatformCallRequestSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({\n ok: false,\n error: { message: 'Invalid request body', code: 'VALIDATION_ERROR' },\n durationMs: 0,\n } satisfies PlatformCallResponse);\n }\n\n const { args } = parsed.data;\n\n logger.info('Platform API call', {\n adapter: adapterName,\n method: methodName,\n argCount: args.length,\n tenantId: auth.namespaceId,\n });\n\n // 6. Execute\n const startTime = Date.now();\n\n try {\n const result = method.apply(adapter, args);\n\n // Handle async results\n const resolved = result instanceof Promise ? await result : result;\n\n // 7. Detect streaming response (e.g., llm.stream)\n if (isAsyncIterable(resolved)) {\n reply.raw.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n });\n reply.raw.flushHeaders();\n\n for await (const chunk of resolved) {\n if (!reply.raw.writableEnded) {\n const data = typeof chunk === 'string' ? chunk : JSON.stringify(chunk);\n reply.raw.write(`data: ${data}\\n\\n`);\n }\n }\n\n if (!reply.raw.writableEnded) {\n reply.raw.write('data: [DONE]\\n\\n');\n reply.raw.end();\n }\n\n return reply;\n }\n\n // 8. Regular response\n const durationMs = Date.now() - startTime;\n return reply.code(200).send({\n ok: true,\n result: resolved,\n durationMs,\n } satisfies PlatformCallResponse);\n } catch (err) {\n const durationMs = Date.now() - startTime;\n const error = err instanceof Error ? err : new Error(String(err));\n logger.error('Platform API error', error, {\n adapter: adapterName,\n method: methodName,\n tenantId: auth.namespaceId,\n });\n return reply.code(502).send({\n ok: false,\n error: { message: error.message, code: 'ADAPTER_ERROR' },\n durationMs,\n } satisfies PlatformCallResponse);\n }\n },\n );\n}\n","/**\n * @module gateway-app/docs/routes\n * Aggregated OpenAPI documentation endpoints.\n *\n * GET /openapi-merged.json — merged spec from all upstream services\n * GET /docs-all — Swagger UI pointing at the merged spec\n */\n\nimport type { FastifyInstance } from 'fastify';\nimport { mergeOpenAPISpecs } from '@kb-labs/core-registry';\nimport type { ICache } from '@kb-labs/core-platform';\n\nconst MERGED_CACHE_KEY = '__gateway_merged_openapi';\nconst MERGED_CACHE_TTL = 30_000; // 30 second cache\n\nconst UPSTREAM_SPEC_URLS = [\n 'http://localhost:5050/openapi.json',\n 'http://localhost:7778/openapi.json',\n];\n\nexport function registerAggregatedDocsRoutes(app: FastifyInstance, cache?: ICache): void {\n // Merged OpenAPI spec from all upstreams\n app.get('/openapi-merged.json', async (_req, reply) => {\n // Try cache first\n if (cache) {\n try {\n const hit = await cache.get<Record<string, unknown>>(MERGED_CACHE_KEY);\n if (hit) {\n return reply.send(hit);\n }\n } catch { /* cache miss */ }\n }\n\n // Fetch all upstream specs in parallel\n const results = await Promise.allSettled(\n UPSTREAM_SPEC_URLS.map((url) =>\n fetch(url, { signal: AbortSignal.timeout(3000) }).then((r) => r.json()),\n ),\n );\n\n const specs = results\n .filter((r): r is PromiseFulfilledResult<unknown> => r.status === 'fulfilled')\n .map((r) => r.value);\n\n const merged = mergeOpenAPISpecs(specs as Parameters<typeof mergeOpenAPISpecs>[0]);\n\n // Cache result\n if (cache) {\n try {\n await cache.set(MERGED_CACHE_KEY, merged as unknown as Record<string, unknown>, MERGED_CACHE_TTL);\n } catch { /* cache write failure is non-critical */ }\n }\n\n return reply.send(merged);\n });\n\n // Second Swagger UI pointing at merged spec\n // Registered last so /docs (gateway-native) is already bound at this point\n app.register(async function docsAll(scope) {\n const swaggerUi = await import('@fastify/swagger-ui');\n await scope.register(swaggerUi.default ?? swaggerUi, {\n routePrefix: '/docs-all',\n uiConfig: {\n url: '/openapi-merged.json',\n docExpansion: 'list',\n deepLinking: true,\n },\n });\n });\n}\n","import { randomUUID } from 'node:crypto';\nimport type { ICache } from '@kb-labs/core-platform';\nimport type { HostDescriptor, HostRegistration, IHostStore } from '@kb-labs/gateway-contracts';\n\nexport interface HostRegisterResult {\n descriptor: HostDescriptor;\n machineToken: string;\n}\n\n/**\n * Host Registry — coordinates cache (hot) and store (cold) layers.\n *\n * - Cache: online/offline status, connections, heartbeat (transient)\n * - Store: host descriptors, tokens (durable, survives restarts)\n *\n * Write path: store.save() + cache.set()\n * Read path: cache.get() ?? store.get() → cache warm\n */\nconst DEFAULT_RECONNECT_GRACE_MS = 10_000;\n\nexport class HostRegistry {\n private readonly graceTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly reconnectGraceMs: number;\n\n constructor(\n private readonly cache: ICache,\n private readonly store?: IHostStore,\n options?: { reconnectGraceMs?: number },\n ) {\n this.reconnectGraceMs = options?.reconnectGraceMs ?? DEFAULT_RECONNECT_GRACE_MS;\n }\n\n /**\n * Restore hosts from persistent store into cache on startup.\n * All restored hosts start as offline — live status comes from WS connections.\n *\n * Also resets any stale online/reconnecting hosts in cache to offline,\n * since no WebSocket connections survive a Gateway restart.\n */\n async restore(): Promise<number> {\n // 1. Reset stale hosts in cache (covers Redis cache surviving restarts)\n await this.resetStaleHosts();\n\n // 2. Restore from store if available\n if (!this.store) {return 0;}\n const hosts = await this.store.listAll();\n for (const host of hosts) {\n const offline = { ...host, status: 'offline' as const, connections: [] as string[] };\n const cacheKey = this.hostKey(host.namespaceId, host.hostId);\n await this.cache.set(cacheKey, offline);\n await this.store.save(offline);\n await this.addToIndex(host.namespaceId, host.hostId);\n }\n return hosts.length;\n }\n\n /**\n * Reset all hosts in cache to offline.\n * Called on startup — no WS connections exist yet, so nothing should be online.\n * Uses namespace index maintained in cache to discover all namespaces.\n */\n private async resetStaleHosts(): Promise<void> {\n const namespaces = await this.cache.get<string[]>('host:namespaces') ?? ['default'];\n for (const ns of namespaces) {\n const hostIds = await this.cache.get<string[]>(`host:index:${ns}`) ?? [];\n for (const hostId of hostIds) {\n const host = await this.cache.get<HostDescriptor>(this.hostKey(ns, hostId));\n if (host && (host.status === 'online' || host.status === 'reconnecting')) {\n await this.cache.set(this.hostKey(ns, hostId), {\n ...host, status: 'offline', connections: [],\n });\n }\n }\n }\n }\n\n async register(reg: HostRegistration): Promise<HostRegisterResult> {\n const hostId = `host_${randomUUID().replace(/-/g, '').slice(0, 24)}`;\n const machineToken = randomUUID();\n const now = Date.now();\n\n const descriptor: HostDescriptor = {\n hostId,\n name: reg.name,\n namespaceId: reg.namespaceId,\n capabilities: reg.capabilities,\n status: 'offline',\n lastSeen: now,\n connections: [],\n hostType: reg.hostType,\n createdAt: now,\n updatedAt: now,\n };\n\n // Persist to store (durable)\n if (this.store) {\n await this.store.save(descriptor);\n await this.store.saveToken(machineToken, hostId, reg.namespaceId);\n }\n\n // Write to cache (hot)\n await this.cache.set(this.hostKey(reg.namespaceId, hostId), descriptor);\n await this.cache.set(this.tokenKey(machineToken), { hostId, namespaceId: reg.namespaceId });\n await this.addToIndex(reg.namespaceId, hostId);\n\n return { descriptor, machineToken };\n }\n\n async setOnline(hostId: string, namespaceId: string, connectionId: string): Promise<void> {\n const host = await this.getFromCache(hostId, namespaceId);\n if (!host) {return;}\n\n // Cancel grace timer if reconnecting\n const graceKey = `${namespaceId}:${hostId}`;\n const graceTimer = this.graceTimers.get(graceKey);\n if (graceTimer) {\n clearTimeout(graceTimer);\n this.graceTimers.delete(graceKey);\n }\n\n const updated = {\n ...host,\n status: 'online' as const,\n lastSeen: Date.now(),\n connections: [connectionId],\n };\n await this.cache.set(this.hostKey(namespaceId, hostId), updated);\n if (this.store) {await this.store.save(updated);}\n }\n\n async setOffline(hostId: string, namespaceId: string, connectionId: string): Promise<void> {\n const host = await this.getFromCache(hostId, namespaceId);\n if (!host) {return;}\n const connections = host.connections.filter((c) => c !== connectionId);\n\n if (connections.length > 0) {\n // Other connections still active — stay online\n await this.cache.set(this.hostKey(namespaceId, hostId), {\n ...host, status: 'online', lastSeen: Date.now(), connections,\n });\n return;\n }\n\n // Last connection gone — enter grace period (reconnecting)\n const reconnecting = {\n ...host, status: 'reconnecting' as const, lastSeen: Date.now(), connections: [] as string[],\n };\n await this.cache.set(this.hostKey(namespaceId, hostId), reconnecting);\n if (this.store) {await this.store.save(reconnecting);}\n\n // Cancel any existing grace timer for this host\n const graceKey = `${namespaceId}:${hostId}`;\n const existing = this.graceTimers.get(graceKey);\n if (existing) {clearTimeout(existing);}\n\n // After grace period, mark truly offline\n this.graceTimers.set(graceKey, setTimeout(async () => {\n this.graceTimers.delete(graceKey);\n const current = await this.getFromCache(hostId, namespaceId);\n if (current?.status === 'reconnecting') {\n const offline = { ...current, status: 'offline' as const, lastSeen: Date.now() };\n await this.cache.set(this.hostKey(namespaceId, hostId), offline);\n if (this.store) {await this.store.save(offline);}\n }\n }, this.reconnectGraceMs));\n }\n\n async heartbeat(hostId: string, namespaceId: string): Promise<void> {\n const host = await this.getFromCache(hostId, namespaceId);\n if (!host) {return;}\n await this.cache.set(this.hostKey(namespaceId, hostId), { ...host, lastSeen: Date.now() });\n }\n\n async get(hostId: string, namespaceId: string): Promise<HostDescriptor | null> {\n // Try cache first (hot)\n const cached = await this.cache.get<HostDescriptor>(this.hostKey(namespaceId, hostId));\n if (cached) {return cached;}\n\n // Fall through to store (cold)\n if (!this.store) {return null;}\n const stored = await this.store.get(hostId, namespaceId);\n if (!stored) {return null;}\n\n // Warm cache\n await this.cache.set(this.hostKey(namespaceId, hostId), { ...stored, status: 'offline', connections: [] });\n await this.addToIndex(namespaceId, hostId);\n return { ...stored, status: 'offline', connections: [] };\n }\n\n async resolveToken(token: string): Promise<{ hostId: string; namespaceId: string } | null> {\n // Try cache first\n const cached = await this.cache.get<{ hostId: string; namespaceId: string }>(this.tokenKey(token));\n if (cached) {return cached;}\n\n // Fall through to store\n if (!this.store) {return null;}\n const stored = await this.store.resolveToken(token);\n if (!stored) {return null;}\n\n // Warm cache\n await this.cache.set(this.tokenKey(token), stored);\n return stored;\n }\n\n async list(namespaceId: string): Promise<HostDescriptor[]> {\n // Use store as authoritative source if available\n if (this.store) {\n const persisted = await this.store.list(namespaceId);\n // Enrich with live status from cache\n return Promise.all(\n persisted.map(async (host) => {\n const cached = await this.cache.get<HostDescriptor>(this.hostKey(namespaceId, host.hostId));\n return cached ?? { ...host, status: 'offline' as const, connections: [] };\n }),\n );\n }\n\n // Fallback: cache-only (no store)\n const indexKey = `host:index:${namespaceId}`;\n const hostIds = (await this.cache.get<string[]>(indexKey)) ?? [];\n const results = await Promise.all(\n hostIds.map((id) => this.cache.get<HostDescriptor>(this.hostKey(namespaceId, id))),\n );\n return results.filter((h): h is HostDescriptor => h !== null);\n }\n\n async deregister(hostId: string, namespaceId: string): Promise<boolean> {\n // Remove from store\n const deleted = this.store ? await this.store.delete(hostId, namespaceId) : false;\n\n // Remove from cache\n await this.cache.delete(this.hostKey(namespaceId, hostId));\n await this.removeFromIndex(namespaceId, hostId);\n\n return deleted;\n }\n\n async ensureRegistered(\n hostId: string,\n namespaceId: string,\n name: string,\n capabilities: HostDescriptor['capabilities'] = [],\n ): Promise<void> {\n const existing = await this.get(hostId, namespaceId);\n if (existing) {\n if (capabilities.length > 0 && JSON.stringify(existing.capabilities) !== JSON.stringify(capabilities)) {\n const updated = { ...existing, capabilities, updatedAt: Date.now() };\n if (this.store) {await this.store.save(updated);}\n await this.cache.set(this.hostKey(namespaceId, hostId), updated);\n }\n return;\n }\n\n const now = Date.now();\n const descriptor: HostDescriptor = {\n hostId,\n name,\n namespaceId,\n capabilities,\n status: 'offline',\n lastSeen: now,\n connections: [],\n createdAt: now,\n updatedAt: now,\n };\n\n if (this.store) {await this.store.save(descriptor);}\n await this.cache.set(this.hostKey(namespaceId, hostId), descriptor);\n await this.addToIndex(namespaceId, hostId);\n }\n\n // ── Private helpers ──────────────────────────────────────────────\n\n private hostKey(namespaceId: string, hostId: string): string {\n return `host:registry:${namespaceId}:${hostId}`;\n }\n\n private tokenKey(token: string): string {\n return `host:token:${token}`;\n }\n\n private async getFromCache(hostId: string, namespaceId: string): Promise<HostDescriptor | null> {\n return this.cache.get<HostDescriptor>(this.hostKey(namespaceId, hostId));\n }\n\n private async addToIndex(namespaceId: string, hostId: string): Promise<void> {\n const indexKey = `host:index:${namespaceId}`;\n const hostIds = (await this.cache.get<string[]>(indexKey)) ?? [];\n if (!hostIds.includes(hostId)) {\n await this.cache.set(indexKey, [...hostIds, hostId]);\n }\n // Track namespace for resetStaleHosts()\n const nsKey = 'host:namespaces';\n const namespaces = (await this.cache.get<string[]>(nsKey)) ?? [];\n if (!namespaces.includes(namespaceId)) {\n await this.cache.set(nsKey, [...namespaces, namespaceId]);\n }\n }\n\n private async removeFromIndex(namespaceId: string, hostId: string): Promise<void> {\n const indexKey = `host:index:${namespaceId}`;\n const hostIds = (await this.cache.get<string[]>(indexKey)) ?? [];\n await this.cache.set(indexKey, hostIds.filter((id) => id !== hostId));\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { WebSocket } from 'ws';\n\ninterface WsRequest {\n headers: { authorization?: string };\n url?: string;\n}\nimport { logDiagnosticEvent, type ICache, type ILogger } from '@kb-labs/core-platform';\nimport {\n HelloMessageSchema,\n AdapterCallMessageSchema,\n AdapterNameSchema,\n HostCapabilitySchema,\n SUPPORTED_PROTOCOL_VERSIONS,\n type OutboundMessage,\n} from '@kb-labs/gateway-contracts';\nimport { AdaptiveBuffer } from '@kb-labs/gateway-core';\nimport { getClientByHostId, type JwtConfig } from '@kb-labs/gateway-auth';\nimport { HostRegistry } from './registry.js';\nimport { extractBearerToken, resolveToken } from '../auth/tokens.js';\nimport { globalDispatcher } from './dispatcher.js';\nimport { executionRegistry } from '../execute/execution-registry.js';\n\nconst HELLO_TIMEOUT_MS = 5_000;\nconst HEARTBEAT_INTERVAL_MS = 30_000;\nconst HEARTBEAT_GRACE_MS = 10_000;\n\nfunction send(ws: WebSocket, msg: OutboundMessage): void {\n ws.send(JSON.stringify(msg));\n}\n\nexport function createWsHandler(\n cache: ICache,\n jwtConfig: JwtConfig,\n logger: ILogger,\n hostRegistry?: HostRegistry,\n) {\n const registry = hostRegistry ?? new HostRegistry(cache);\n const buffer = new AdaptiveBuffer(cache);\n\n return async function wsHandler(\n socket: WebSocket,\n request: WsRequest,\n ): Promise<void> {\n // 1. Auth — machine token required\n const token = extractBearerToken(request.headers.authorization);\n if (!token) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.auth',\n level: 'warn',\n reasonCode: 'websocket_auth_failed',\n message: 'Host WebSocket connection missing authorization token',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n });\n socket.close(1008, 'Missing Authorization header');\n return;\n }\n\n const tokenEntry = await resolveToken(token, cache, jwtConfig);\n if (!tokenEntry || tokenEntry.type !== 'machine') {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.auth',\n level: 'warn',\n reasonCode: 'websocket_auth_failed',\n message: 'Host WebSocket machine token rejected',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n });\n socket.close(1008, 'Invalid machine token');\n return;\n }\n\n const { userId: hostId, namespaceId } = tokenEntry;\n const connectionId = randomUUID();\n const sessionId = randomUUID();\n\n // 2. Wait for hello (with timeout)\n let protocolVersion: string | null = null;\n let helloCaps: string[] = [];\n let helloDone = false;\n\n const protocolVersions: readonly string[] = SUPPORTED_PROTOCOL_VERSIONS;\n\n await new Promise<void>((resolve, reject) => {\n const helloTimeout = setTimeout(() => {\n if (!helloDone) {\n helloDone = true;\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'websocket_hello_timeout',\n message: 'Host WebSocket hello timed out',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n },\n });\n socket.close(1008, 'Hello timeout');\n reject(new Error('Hello timeout'));\n }\n }, HELLO_TIMEOUT_MS);\n\n socket.once('message', (raw) => {\n if (helloDone) {return;}\n helloDone = true;\n clearTimeout(helloTimeout);\n\n try {\n const msg = HelloMessageSchema.parse(JSON.parse(raw.toString()));\n\n // Version negotiation\n if (!protocolVersions.includes(msg.protocolVersion)) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'websocket_protocol_unsupported',\n message: 'Host WebSocket protocol version is unsupported',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n protocolVersion: msg.protocolVersion,\n supportedVersions: [...SUPPORTED_PROTOCOL_VERSIONS],\n },\n });\n send(socket, {\n type: 'negotiate',\n supportedVersions: [...SUPPORTED_PROTOCOL_VERSIONS],\n });\n socket.close(1008, 'Unsupported protocol version');\n reject(new Error('Unsupported protocol version'));\n return;\n }\n\n protocolVersion = msg.protocolVersion;\n helloCaps = msg.capabilities ?? [];\n resolve();\n } catch (error) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'websocket_handshake_invalid',\n message: 'Host WebSocket hello message is invalid',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n },\n });\n socket.close(1008, 'Invalid hello message');\n reject(new Error('Invalid hello'));\n }\n });\n }).catch(() => {\n // socket already closed — errors logged above\n });\n\n if (!protocolVersion) {return;}\n\n // 3. Resolve capabilities for dispatcher routing.\n //\n // Priority order:\n // 1. AuthStore clientRecord (JWT-registered via /auth/register) — authoritative\n // 2. HostRegistry descriptor (registered via /hosts/register) — authoritative\n // 3. Hello-message capabilities (static/dev tokens with no registry entry) — validated\n const clientRecord = await getClientByHostId(cache, hostId);\n const registryCaps = (clientRecord?.capabilities ?? [])\n .map((c) => HostCapabilitySchema.safeParse(c))\n .filter((r) => r.success)\n .map((r) => r.data);\n\n let capabilities: ReturnType<typeof HostCapabilitySchema.safeParse>['data'][];\n if (clientRecord) {\n // JWT-registered host: use AuthStore capabilities only\n capabilities = registryCaps;\n } else {\n // Check HostRegistry for machine-token-registered hosts (/hosts/register)\n let existingDescriptor = null;\n try {\n existingDescriptor = await registry.get(hostId, namespaceId);\n } catch (err) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.handshake',\n level: 'warn',\n reasonCode: 'registry_lookup_failed',\n message: 'Failed to look up host descriptor from registry, falling back to hello capabilities',\n outcome: 'partial',\n error: err instanceof Error ? err : new Error(String(err)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: { hostId, namespaceId },\n });\n }\n if (existingDescriptor && existingDescriptor.capabilities.length > 0) {\n capabilities = existingDescriptor.capabilities\n .map((c) => HostCapabilitySchema.safeParse(c))\n .filter((r) => r.success)\n .map((r) => r.data);\n } else {\n // Static/dev token with no registry entry: accept validated hello capabilities\n capabilities = helloCaps\n .map((c) => HostCapabilitySchema.safeParse(c))\n .filter((r) => r.success)\n .map((r) => r.data);\n }\n }\n\n await registry.ensureRegistered(hostId, namespaceId, clientRecord?.name ?? hostId, capabilities);\n\n // 4. Set online + register in dispatcher (with capabilities for routing) + send connected\n await registry.setOnline(hostId, namespaceId, connectionId);\n globalDispatcher.registerConnection(hostId, namespaceId, socket, capabilities);\n\n send(socket, {\n type: 'connected',\n protocolVersion,\n hostId,\n sessionId,\n });\n\n // 4. Flush buffered calls\n const buffered = await buffer.flush(hostId);\n for (const call of buffered) {\n send(socket, {\n type: 'call',\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n args: call.args,\n trace: { traceId: call.requestId, spanId: randomUUID() },\n });\n }\n\n // 5. Heartbeat watchdog\n let lastHeartbeat = Date.now();\n const heartbeatWatchdog = setInterval(async () => {\n const elapsed = Date.now() - lastHeartbeat;\n if (elapsed > HEARTBEAT_INTERVAL_MS + HEARTBEAT_GRACE_MS) {\n // Mark as degraded (don't close — allow recovery)\n const host = await registry.get(hostId, namespaceId);\n if (host && host.status !== 'degraded') {\n await cache.set(`host:registry:${namespaceId}:${hostId}`, {\n ...host,\n status: 'degraded',\n });\n }\n }\n }, HEARTBEAT_INTERVAL_MS);\n\n // 6. Message handler\n socket.on('message', async (raw) => {\n try {\n const msg = JSON.parse(raw.toString()) as { type: string; requestId?: string };\n\n switch (msg.type) {\n case 'heartbeat':\n lastHeartbeat = Date.now();\n await registry.heartbeat(hostId, namespaceId);\n send(socket, { type: 'ack' });\n break;\n\n case 'chunk':\n case 'result':\n case 'error':\n globalDispatcher.handleInbound(msg as { type: string; requestId?: string; data?: unknown; error?: unknown });\n break;\n\n case 'adapter:call':\n void handleAdapterCall(msg, socket, hostId, namespaceId);\n break;\n }\n } catch (error) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.message',\n level: 'warn',\n reasonCode: 'websocket_message_invalid',\n message: 'Host WebSocket message is malformed',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n },\n });\n }\n });\n\n // 7. Disconnect cleanup\n socket.on('close', async () => {\n clearInterval(heartbeatWatchdog);\n globalDispatcher.removeConnection(hostId, namespaceId);\n\n // Cancel all executions dispatched to this host (CC2)\n const cancelled = executionRegistry.cancelByHost(hostId, 'disconnect');\n if (cancelled.length > 0) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.ws.disconnect',\n level: 'warn',\n reasonCode: 'execution_dispatch_failed',\n message: 'Host disconnected and active executions were cancelled',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n cancelledExecutions: cancelled.length,\n },\n });\n }\n\n await registry.setOffline(hostId, namespaceId, connectionId);\n });\n };\n\n /**\n * Handle adapter:call from Host — forward to REST API for platform service execution.\n * Flow: Host → WS adapter:call → Gateway → HTTP POST /api/v1/internal/adapter-call → REST API\n *\n * @see ADR-0051: Bidirectional Gateway Protocol\n */\n async function handleAdapterCall(\n msg: Record<string, unknown>,\n socket: WebSocket,\n hostId: string,\n namespaceId: string,\n ): Promise<void> {\n const requestId = msg['requestId'] as string;\n\n // 1. Validate message schema\n const parsed = AdapterCallMessageSchema.safeParse(msg);\n if (!parsed.success) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.adapter-call',\n level: 'warn',\n reasonCode: 'websocket_message_invalid',\n message: 'Host adapter call message is invalid',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n requestId,\n },\n });\n send(socket, {\n type: 'adapter:error',\n requestId: requestId ?? 'unknown',\n error: { code: 'INVALID_MESSAGE', message: parsed.error.message, retryable: false },\n });\n return;\n }\n\n const call = parsed.data;\n\n // 2. Validate adapter is in allowlist\n const adapterCheck = AdapterNameSchema.safeParse(call.adapter);\n if (!adapterCheck.success) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.adapter-call',\n level: 'warn',\n reasonCode: 'adapter_call_rejected',\n message: 'Host adapter call rejected by gateway allowlist',\n outcome: 'failed',\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n },\n });\n send(socket, {\n type: 'adapter:error',\n requestId: call.requestId,\n error: { code: 'ADAPTER_CALL_REJECTED', message: `Adapter not allowed: ${call.adapter}`, retryable: false },\n });\n return;\n }\n\n // 3. Forward to REST API\n const restApiUrl = process.env.REST_API_URL ?? 'http://localhost:5050';\n const internalSecret = process.env.GATEWAY_INTERNAL_SECRET ?? '';\n\n try {\n const response = await fetch(`${restApiUrl}/api/v1/internal/adapter-call`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-internal-secret': internalSecret,\n },\n body: JSON.stringify({\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n args: call.args,\n context: {\n ...call.context,\n namespaceId,\n hostId,\n },\n }),\n });\n\n const body = await response.json() as {\n ok: boolean;\n result?: unknown;\n error?: { code: string; message: string; retryable: boolean; details?: unknown };\n };\n\n if (body.ok) {\n send(socket, {\n type: 'adapter:response',\n requestId: call.requestId,\n result: body.result,\n });\n } else {\n send(socket, {\n type: 'adapter:error',\n requestId: call.requestId,\n error: body.error ?? { code: 'ADAPTER_ERROR', message: 'Unknown error', retryable: false },\n });\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.hosts.adapter-call',\n level: 'error',\n reasonCode: 'adapter_bridge_unavailable',\n message: 'Gateway could not reach REST adapter bridge',\n outcome: 'failed',\n error: err instanceof Error ? err : new Error(String(err)),\n serviceId: 'gateway',\n route: '/hosts/connect',\n evidence: {\n hostId,\n namespaceId,\n requestId: call.requestId,\n adapter: call.adapter,\n method: call.method,\n restApiUrl,\n },\n });\n send(socket, {\n type: 'adapter:error',\n requestId: call.requestId,\n error: { code: 'ADAPTER_CALL_TIMEOUT', message: `REST API unreachable: ${message}`, retryable: true },\n });\n }\n }\n}\n","/**\n * @module gateway-app/clients/ws-handler\n *\n * WebSocket handler for observer clients (CLI, Studio, IDE).\n * Endpoint: GET /clients/connect (requires Bearer JWT)\n *\n * Supports:\n * - client:subscribe — start receiving events for an executionId\n * - client:unsubscribe — stop receiving events\n * - client:cancel — cancel an execution (proxied to ExecutionRegistry)\n *\n * Auth: same Bearer JWT as HTTP endpoints (user or machine token, NOT host machine token).\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { WebSocket } from 'ws';\n\ninterface WsRequest {\n headers: { authorization?: string };\n url?: string;\n}\nimport type { ICache, ILogger } from '@kb-labs/core-platform';\nimport type { CancellationReason } from '@kb-labs/core-contracts';\nimport {\n ClientHelloSchema,\n ClientSubscribeSchema,\n ClientUnsubscribeSchema,\n ClientCancelSchema,\n CLIENT_PROTOCOL_VERSION,\n type ClientOutboundMessage,\n} from '@kb-labs/gateway-contracts';\nimport { type JwtConfig } from '@kb-labs/gateway-auth';\nimport { extractBearerToken, resolveToken } from '../auth/tokens.js';\nimport { executionRegistry } from '../execute/execution-registry.js';\nimport { subscriptionRegistry } from './subscription-registry.js';\n\nconst HELLO_TIMEOUT_MS = 5_000;\n\nfunction send(ws: WebSocket, msg: ClientOutboundMessage): void {\n if (ws.readyState === ws.OPEN) {\n ws.send(JSON.stringify(msg));\n }\n}\n\nexport function createClientWsHandler(cache: ICache, jwtConfig: JwtConfig, logger: ILogger) {\n return async function clientWsHandler(\n socket: WebSocket,\n request: WsRequest,\n ): Promise<void> {\n // 1. Auth — Bearer JWT required (user or machine token)\n const queryToken = new URL(request.url ?? '/', 'http://localhost').searchParams.get('access_token');\n const token = extractBearerToken(request.headers.authorization)\n ?? queryToken\n ?? null;\n\n if (!token) {\n socket.close(1008, 'Missing Authorization');\n return;\n }\n\n const authContext = await resolveToken(token, cache, jwtConfig);\n if (!authContext) {\n socket.close(1008, 'Invalid token');\n return;\n }\n\n const connectionId = randomUUID();\n\n // 2. Wait for client:hello (with timeout)\n let helloDone = false;\n\n await new Promise<void>((resolve, reject) => {\n const helloTimeout = setTimeout(() => {\n if (!helloDone) {\n helloDone = true;\n socket.close(1008, 'Hello timeout');\n reject(new Error('Hello timeout'));\n }\n }, HELLO_TIMEOUT_MS);\n\n socket.once('message', (raw) => {\n if (helloDone) { return; }\n helloDone = true;\n clearTimeout(helloTimeout);\n\n try {\n const msg = ClientHelloSchema.parse(JSON.parse(raw.toString()));\n void msg; // clientVersion logged below if needed\n resolve();\n } catch {\n socket.close(1008, 'Invalid hello message');\n reject(new Error('Invalid client:hello'));\n }\n });\n }).catch(() => {\n // socket already closed\n });\n\n if (!helloDone || socket.readyState !== socket.OPEN) { return; }\n\n // 3. Register connection\n subscriptionRegistry.registerSocket(connectionId, socket);\n\n send(socket, {\n type: 'client:connected',\n protocolVersion: CLIENT_PROTOCOL_VERSION,\n connectionId,\n });\n\n logger.debug('Client connected', { connectionId, namespaceId: authContext.namespaceId });\n\n // 4. Message handler\n socket.on('message', (raw) => {\n let parsed: { type: string };\n try {\n parsed = JSON.parse(raw.toString()) as { type: string };\n } catch {\n send(socket, {\n type: 'client:error',\n code: 'INVALID_MESSAGE',\n message: 'Malformed JSON',\n });\n return;\n }\n\n switch (parsed.type) {\n case 'client:subscribe': {\n const result = ClientSubscribeSchema.safeParse(parsed);\n if (!result.success) {\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: 'Invalid subscribe message' });\n return;\n }\n const { executionId } = result.data;\n\n // Verify execution exists and belongs to this namespace\n const execution = executionRegistry.get(executionId);\n if (!execution) {\n send(socket, { type: 'client:error', code: 'EXECUTION_NOT_FOUND', message: `Execution ${executionId} not found`, executionId });\n return;\n }\n if (execution.namespaceId !== authContext.namespaceId) {\n send(socket, { type: 'client:error', code: 'FORBIDDEN', message: 'Execution belongs to another namespace', executionId });\n return;\n }\n\n subscriptionRegistry.subscribe(connectionId, executionId);\n break;\n }\n\n case 'client:unsubscribe': {\n const result = ClientUnsubscribeSchema.safeParse(parsed);\n if (!result.success) {\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: 'Invalid unsubscribe message' });\n return;\n }\n subscriptionRegistry.unsubscribe(connectionId, result.data.executionId);\n break;\n }\n\n case 'client:cancel': {\n const result = ClientCancelSchema.safeParse(parsed);\n if (!result.success) {\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: 'Invalid cancel message' });\n return;\n }\n const { executionId, reason } = result.data;\n\n const execution = executionRegistry.get(executionId);\n if (!execution) {\n send(socket, { type: 'client:error', code: 'EXECUTION_NOT_FOUND', message: `Execution ${executionId} not found`, executionId });\n return;\n }\n if (execution.namespaceId !== authContext.namespaceId) {\n send(socket, { type: 'client:error', code: 'FORBIDDEN', message: 'Execution belongs to another namespace', executionId });\n return;\n }\n\n const cancelled = executionRegistry.cancel(executionId, (reason ?? 'user') as CancellationReason);\n if (!cancelled) {\n send(socket, { type: 'client:error', code: 'CANCEL_FAILED', message: 'Execution already completed or cancelled', executionId });\n }\n break;\n }\n\n default:\n send(socket, { type: 'client:error', code: 'INVALID_MESSAGE', message: `Unknown message type: ${String(parsed.type)}` });\n }\n });\n\n // 5. Disconnect cleanup\n socket.on('close', () => {\n subscriptionRegistry.removeConnection(connectionId);\n logger.debug('Client disconnected', { connectionId });\n });\n };\n}\n","/**\n * @module gateway-app/ws/gateway-ws\n *\n * Unified WebSocket upgrade handler for the gateway.\n *\n * Intercepts upgrade requests BEFORE @fastify/http-proxy:\n * - Gateway-own WS paths (/hosts/connect, /clients/connect) → raw ws handlers\n * - Everything else → delegated to @fastify/http-proxy for upstream WS proxy\n *\n * This eliminates the conflict between @fastify/websocket and @fastify/http-proxy\n * which both try to attach 'upgrade' listeners and call assignSocket().\n */\n\nimport type { Server, IncomingMessage } from 'node:http';\nimport type { Duplex } from 'node:stream';\nimport { WebSocketServer } from 'ws';\nimport type { ICache, ILogger } from '@kb-labs/core-platform';\nimport type { JwtConfig } from '@kb-labs/gateway-auth';\nimport { createWsHandler } from '../hosts/ws-handler.js';\nimport { createClientWsHandler } from '../clients/ws-handler.js';\n\nconst GATEWAY_WS_PATHS = new Set(['/hosts/connect', '/clients/connect']);\n\n/**\n * Attach gateway-own WebSocket endpoints using raw `ws` package.\n *\n * Must be called AFTER `app.ready()` (so http-proxy has registered its\n * upgrade listener) but BEFORE `app.listen()`.\n *\n * Captures all existing 'upgrade' listeners, removes them, then installs\n * a single unified handler that dispatches:\n * - Gateway WS paths → raw ws handlers\n * - All other paths → delegated to captured listeners (http-proxy)\n */\nexport function attachGatewayWs(\n server: Server,\n cache: ICache,\n jwtConfig: JwtConfig,\n logger: ILogger,\n hostRegistry?: import('../hosts/registry.js').HostRegistry,\n): void {\n const wss = new WebSocketServer({ noServer: true });\n const hostsHandler = createWsHandler(cache, jwtConfig, logger, hostRegistry);\n const clientsHandler = createClientWsHandler(cache, jwtConfig, logger);\n\n // Capture @fastify/http-proxy's upgrade listener(s)\n const existingListeners = server.listeners('upgrade').slice() as Array<\n (req: IncomingMessage, socket: Duplex, head: Buffer) => void\n >;\n server.removeAllListeners('upgrade');\n\n server.on('upgrade', (req: IncomingMessage, socket: Duplex, head: Buffer) => {\n const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;\n\n if (GATEWAY_WS_PATHS.has(pathname)) {\n // Gateway-own WS — handle directly with raw ws\n wss.handleUpgrade(req, socket, head, (ws) => {\n if (pathname === '/hosts/connect') {\n hostsHandler(ws, req);\n } else {\n clientsHandler(ws, req);\n }\n });\n } else {\n // Delegate to @fastify/http-proxy for upstream WS proxy\n for (const listener of existingListeners) {\n listener.call(server, req, socket, head);\n }\n }\n });\n\n logger.info('Gateway WS endpoints attached', { paths: [...GATEWAY_WS_PATHS] });\n}\n","import type { FastifyInstance, FastifyReply, FastifyRequest, HookHandlerDoneFunction } from 'fastify';\nimport type { GatewayConfig } from '@kb-labs/gateway-contracts';\nimport {\n OBSERVABILITY_CONTRACT_VERSION,\n OBSERVABILITY_SCHEMA,\n CANONICAL_OBSERVABILITY_METRICS,\n type ServiceHealthStatus,\n type ObservabilityCheck,\n} from '@kb-labs/core-contracts';\nimport type { ServiceObservabilityDescribe, ServiceObservabilityHealth } from '@kb-labs/core-contracts';\nimport {\n createServiceObservabilityDescribe,\n createServiceObservabilityHealth,\n OperationMetricsTracker,\n} from '@kb-labs/shared-http';\nimport { hostname } from 'node:os';\nimport { monitorEventLoopDelay, performance } from 'node:perf_hooks';\n\ndeclare module 'fastify' {\n interface FastifyRequest {\n kbMetricsStart?: number;\n }\n}\n\ntype RouteStats = {\n count: number;\n totalDurationMs: number;\n maxDurationMs: number;\n errorCount: number;\n};\n\nfunction normalizeRoute(route: string | undefined): string {\n if (!route) {\n return 'unknown';\n }\n return route\n .split('?')[0]!\n .replace(/\\/[0-9a-fA-F-]{6,}/g, '/:id');\n}\n\nfunction metricLine(name: string, value: number, labels?: Record<string, string>): string {\n if (!labels || Object.keys(labels).length === 0) {\n return `${name} ${value}`;\n }\n const pairs = Object.entries(labels).map(([key, labelValue]) => `${key}=\"${labelValue.replace(/\"/g, '\\\\\"')}\"`);\n return `${name}{${pairs.join(',')}} ${value}`;\n}\n\nexport class GatewayObservabilityCollector {\n private readonly instanceId = `${hostname()}:${process.pid}`;\n private readonly eventLoop = monitorEventLoopDelay({ resolution: 20 });\n private readonly routeStats = new Map<string, RouteStats>();\n private readonly operationMetrics = new OperationMetricsTracker();\n private readonly startedAt = Date.now();\n private readonly dependencies;\n private lastCpuUsage = process.cpuUsage();\n private lastCpuTime = Date.now();\n private intervalId: NodeJS.Timeout | null = null;\n private activeOperations = 0;\n private requestsTotal = 0;\n private errorsTotal = 0;\n private lastSnapshot = {\n cpuPercent: 0,\n rssBytes: process.memoryUsage().rss,\n heapUsedBytes: process.memoryUsage().heapUsed,\n eventLoopLagMs: 0,\n };\n\n constructor(private readonly config: GatewayConfig) {\n this.dependencies = Object.keys(this.config.upstreams).map((serviceId) => ({\n serviceId,\n required: false,\n description: 'Gateway upstream',\n }));\n }\n\n register(server: unknown): void {\n const hookServer = server as FastifyInstance;\n this.eventLoop.enable();\n this.intervalId = setInterval(() => this.captureRuntimeSnapshot(), 10_000);\n this.captureRuntimeSnapshot();\n\n hookServer.addHook('onRequest', (request: FastifyRequest, _reply: FastifyReply, done: HookHandlerDoneFunction) => {\n request.kbMetricsStart = performance.now();\n this.activeOperations += 1;\n done();\n });\n\n hookServer.addHook('onResponse', (request: FastifyRequest, reply: FastifyReply, done: HookHandlerDoneFunction) => {\n const started = request.kbMetricsStart ?? performance.now();\n const durationMs = Math.max(performance.now() - started, 0);\n const route = `${request.method.toUpperCase()} ${normalizeRoute(request.routeOptions?.url ?? request.url)}`;\n const stats = this.routeStats.get(route) ?? {\n count: 0,\n totalDurationMs: 0,\n maxDurationMs: 0,\n errorCount: 0,\n };\n\n stats.count += 1;\n stats.totalDurationMs += durationMs;\n stats.maxDurationMs = Math.max(stats.maxDurationMs, durationMs);\n if (reply.statusCode >= 400) {\n stats.errorCount += 1;\n this.errorsTotal += 1;\n }\n this.routeStats.set(route, stats);\n this.requestsTotal += 1;\n this.activeOperations = Math.max(0, this.activeOperations - 1);\n done();\n });\n\n hookServer.addHook('onClose', (_instance: unknown, done: HookHandlerDoneFunction) => {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n this.eventLoop.disable();\n done();\n });\n }\n\n buildDescribe(): ServiceObservabilityDescribe {\n return createServiceObservabilityDescribe({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'gateway',\n instanceId: this.instanceId,\n serviceType: 'gateway',\n version: '1.0.0',\n environment: process.env.NODE_ENV ?? 'development',\n startedAt: new Date(this.startedAt).toISOString(),\n dependencies: this.dependencies,\n metricsEndpoint: '/metrics',\n healthEndpoint: '/observability/health',\n logsSource: 'gateway',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n metricFamilies: [...CANONICAL_OBSERVABILITY_METRICS],\n });\n }\n\n buildHealth(input: {\n status: ServiceHealthStatus;\n adapterChecks: Array<{ id: string; available: boolean; latencyMs?: number }>;\n upstreamChecks: Array<{ id: string; status: string; latencyMs?: number }>;\n }): ServiceObservabilityHealth {\n const checks: ObservabilityCheck[] = [\n ...input.adapterChecks.map((entry): ObservabilityCheck => ({\n id: `adapter:${entry.id}`,\n status: entry.available ? 'ok' : 'warn',\n latencyMs: entry.latencyMs,\n message: entry.available ? 'Adapter available' : 'Adapter unavailable',\n })),\n ...input.upstreamChecks.map((entry): ObservabilityCheck => ({\n id: `upstream:${entry.id}`,\n status: entry.status === 'up' ? 'ok' : 'warn',\n latencyMs: entry.latencyMs,\n message: entry.status === 'up' ? 'Upstream healthy' : 'Upstream unavailable',\n })),\n ];\n\n const topOperations = mergeTopOperations(\n Array.from(this.routeStats.entries())\n .sort((a, b) => b[1].count - a[1].count || b[1].maxDurationMs - a[1].maxDurationMs)\n .slice(0, 5)\n .map(([operation, stats]) => ({\n operation: `http.${operation}`,\n count: stats.count,\n avgDurationMs: stats.count > 0 ? stats.totalDurationMs / stats.count : 0,\n maxDurationMs: stats.maxDurationMs,\n errorCount: stats.errorCount,\n })),\n this.operationMetrics.getTopOperations(),\n );\n\n return createServiceObservabilityHealth({\n schema: OBSERVABILITY_SCHEMA,\n contractVersion: OBSERVABILITY_CONTRACT_VERSION,\n serviceId: 'gateway',\n instanceId: this.instanceId,\n observedAt: new Date().toISOString(),\n status: input.status,\n uptimeSec: Math.floor((Date.now() - this.startedAt) / 1000),\n metricsEndpoint: '/metrics',\n logsSource: 'gateway',\n capabilities: ['httpMetrics', 'eventLoopMetrics', 'operationMetrics', 'logCorrelation'],\n checks,\n snapshot: {\n cpuPercent: this.lastSnapshot.cpuPercent,\n rssBytes: this.lastSnapshot.rssBytes,\n heapUsedBytes: this.lastSnapshot.heapUsedBytes,\n eventLoopLagMs: this.lastSnapshot.eventLoopLagMs,\n activeOperations: this.activeOperations,\n },\n topOperations,\n state: input.status === 'healthy' ? 'active' : input.status === 'degraded' ? 'partial_observability' : 'insufficient_data',\n meta: {\n requestsTotal: this.requestsTotal,\n errorsTotal: this.errorsTotal,\n },\n });\n }\n\n async renderPrometheusMetrics(healthStatus: ServiceHealthStatus): Promise<string> {\n this.captureRuntimeSnapshot();\n\n const lines = [\n '# HELP process_cpu_percent Current process CPU usage percentage',\n '# TYPE process_cpu_percent gauge',\n metricLine('process_cpu_percent', this.lastSnapshot.cpuPercent),\n '# HELP process_rss_bytes Current process resident set size in bytes',\n '# TYPE process_rss_bytes gauge',\n metricLine('process_rss_bytes', this.lastSnapshot.rssBytes),\n '# HELP process_heap_used_bytes Current process heap used in bytes',\n '# TYPE process_heap_used_bytes gauge',\n metricLine('process_heap_used_bytes', this.lastSnapshot.heapUsedBytes),\n '# HELP process_event_loop_lag_ms Current event loop lag in milliseconds',\n '# TYPE process_event_loop_lag_ms gauge',\n metricLine('process_event_loop_lag_ms', this.lastSnapshot.eventLoopLagMs),\n '# HELP service_health_status Service health status (2=healthy, 1=degraded, 0=unhealthy)',\n '# TYPE service_health_status gauge',\n metricLine('service_health_status', healthStatus === 'healthy' ? 2 : healthStatus === 'degraded' ? 1 : 0),\n '# HELP service_restarts_total Service restart counter within current process lifetime',\n '# TYPE service_restarts_total gauge',\n metricLine('service_restarts_total', 0),\n '# HELP service_active_operations Current number of active operations',\n '# TYPE service_active_operations gauge',\n metricLine('service_active_operations', this.activeOperations),\n '# HELP http_requests_total Total number of HTTP requests',\n '# TYPE http_requests_total counter',\n '# HELP http_errors_total Total number of HTTP errors (4xx, 5xx)',\n '# TYPE http_errors_total counter',\n '# HELP http_request_duration_ms Total duration of HTTP requests grouped by route',\n '# TYPE http_request_duration_ms summary',\n '# HELP service_operation_total Total number of service operations',\n '# TYPE service_operation_total counter',\n '# HELP service_operation_duration_ms Total duration of service operations grouped by route',\n '# TYPE service_operation_duration_ms summary',\n ];\n\n for (const [route, stats] of this.routeStats.entries()) {\n const status = stats.errorCount > 0 ? 'error' : 'ok';\n lines.push(metricLine('http_requests_total', stats.count, { route }));\n lines.push(metricLine('http_errors_total', stats.errorCount, { route }));\n lines.push(metricLine('http_request_duration_ms', Number(stats.totalDurationMs.toFixed(2)), { route }));\n lines.push(metricLine('service_operation_total', stats.count, { operation: `http.${route}`, status }));\n lines.push(metricLine('service_operation_duration_ms', Number(stats.totalDurationMs.toFixed(2)), { operation: `http.${route}`, status }));\n }\n\n lines.push(...this.operationMetrics.getMetricLines());\n\n return `${lines.join('\\n')}\\n`;\n }\n\n recordOperation(operation: string, durationMs = 0, status: 'ok' | 'error' = 'ok'): void {\n this.operationMetrics.recordOperation(operation, durationMs, status);\n }\n\n observeOperation<T>(operation: string, work: () => T | Promise<T>): Promise<T> {\n return this.operationMetrics.observeOperation(operation, work);\n }\n\n private captureRuntimeSnapshot(): void {\n const currentUsage = process.cpuUsage(this.lastCpuUsage);\n const currentTime = Date.now();\n const deltaTime = Math.max(currentTime - this.lastCpuTime, 1);\n\n this.lastCpuUsage = process.cpuUsage();\n this.lastCpuTime = currentTime;\n\n const cpuTimeMs = (currentUsage.user + currentUsage.system) / 1000;\n const memory = process.memoryUsage();\n const eventLoopLagMs = Number((this.eventLoop.mean / 1_000_000).toFixed(2));\n\n this.lastSnapshot = {\n cpuPercent: Number(Math.min((cpuTimeMs / deltaTime) * 100, 100).toFixed(2)),\n rssBytes: memory.rss,\n heapUsedBytes: memory.heapUsed,\n eventLoopLagMs: Number.isFinite(eventLoopLagMs) ? eventLoopLagMs : 0,\n };\n\n this.eventLoop.reset();\n }\n}\n\nfunction mergeTopOperations(\n httpOperations: Array<{\n operation: string;\n count: number;\n avgDurationMs: number;\n maxDurationMs: number;\n errorCount: number;\n }>,\n domainOperations: Array<{\n operation: string;\n count?: number;\n avgDurationMs?: number;\n maxDurationMs?: number;\n errorCount?: number;\n }>,\n limit = 5,\n) {\n const merged = new Map<string, {\n operation: string;\n count?: number;\n avgDurationMs?: number;\n maxDurationMs?: number;\n errorCount?: number;\n }>();\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","import Fastify from 'fastify';\nimport fastifyCors from '@fastify/cors';\nimport fastifyHttpProxy from '@fastify/http-proxy';\nimport { platform } from '@kb-labs/core-runtime';\nimport {\n createCorrelatedLogger,\n createServiceReadyResponse,\n registerOpenAPI,\n} from '@kb-labs/shared-http';\nimport { logDiagnosticEvent, type ICache, type ILogger } from '@kb-labs/core-platform';\nimport type { GatewayConfig } from '@kb-labs/gateway-contracts';\nimport { HostRegistrationSchema } from '@kb-labs/gateway-contracts';\nimport { AuthService, type JwtConfig } from '@kb-labs/gateway-auth';\nimport { createAuthMiddleware } from './auth/middleware.js';\nimport { registerAuthRoutes } from './auth/routes.js';\nimport { registerExecuteRoutes } from './execute/routes.js';\nimport { registerLLMGatewayRoutes } from './llm/routes.js';\nimport { registerTelemetryRoutes } from './telemetry/routes.js';\nimport { registerPlatformRoutes } from './platform/routes.js';\nimport { registerAggregatedDocsRoutes } from './docs/routes.js';\nimport { HostRegistry } from './hosts/registry.js';\nimport { globalDispatcher } from './hosts/dispatcher.js';\nimport { attachGatewayWs } from './ws/gateway-ws.js';\nimport { GatewayObservabilityCollector } from './observability/collector.js';\nimport { randomUUID } from 'node:crypto';\n\nexport async function createServer(\n config: GatewayConfig,\n cache: ICache,\n logger: ILogger,\n jwtConfig: JwtConfig,\n registry?: HostRegistry,\n) {\n const gatewayLogger = createCorrelatedLogger(logger, {\n serviceId: 'gateway',\n logsSource: 'gateway',\n layer: 'gateway',\n service: 'server',\n operation: 'gateway.http',\n });\n const app = Fastify({\n logger: false,\n });\n\n const isProduction = process.env.NODE_ENV === 'production';\n\n // OpenAPI / Swagger UI — must be registered before routes\n await registerOpenAPI(app, {\n title: 'KB Labs Gateway',\n description: 'Central API gateway — auth, LLM, telemetry, platform dispatch',\n version: '1.0.0',\n servers: [{ url: 'http://localhost:4000', description: 'Local dev' }],\n ui: !isProduction,\n });\n\n await app.register(fastifyCors, { origin: true });\n const observability = new GatewayObservabilityCollector(config);\n observability.register(app);\n app.addHook('onRequest', async (request, reply) => {\n const requestId = (request.headers['x-request-id'] as string | undefined) || request.id || randomUUID();\n const traceId = (request.headers['x-trace-id'] as string | undefined) || randomUUID();\n\n request.id = requestId;\n reply.header('X-Request-Id', requestId);\n reply.header('X-Trace-Id', traceId);\n\n (request as any).kbLogger = createCorrelatedLogger(logger, {\n serviceId: 'gateway',\n logsSource: 'gateway',\n layer: 'gateway',\n service: 'request',\n requestId,\n traceId,\n method: request.method,\n url: request.url,\n operation: 'http.request',\n });\n (request as any).kbLogger.info(`→ ${request.method.toUpperCase()} ${request.url}`);\n });\n\n app.addHook('onResponse', async (request, reply) => {\n const requestLogger = (request as any).kbLogger as { info: (message: string, meta?: Record<string, unknown>) => void } | undefined;\n if (!requestLogger) {\n return;\n }\n\n requestLogger.info(`✓ ${request.method.toUpperCase()} ${request.url} ${reply.statusCode}`, {\n statusCode: reply.statusCode,\n });\n });\n\n // ── Proxy upstreams ────────────────────────────────────────────────\n // Registered FIRST, before any hooks. Auth is handled by upstreams themselves.\n // @fastify/http-proxy with websocket:true intercepts upgrades at the HTTP\n // server level — no Fastify hooks must touch these requests.\n // Gateway is a dumb proxy — real per-route timeout enforcement lives in REST API.\n // 1 hour hard ceiling; anything longer should be a background job.\n const PROXY_TIMEOUT_MS = 3_600_000;\n\n for (const [name, upstream] of Object.entries(config.upstreams)) {\n await app.register(fastifyHttpProxy, {\n upstream: upstream.url,\n prefix: upstream.prefix,\n rewritePrefix: upstream.rewritePrefix ?? upstream.prefix,\n disableCache: true,\n websocket: upstream.websocket ?? false,\n http: {\n requestOptions: {\n timeout: PROXY_TIMEOUT_MS,\n },\n },\n });\n gatewayLogger.info(`Upstream registered: ${name} → ${upstream.url} (${upstream.prefix}${upstream.websocket ? ', ws' : ''})`);\n }\n\n // ── Gateway's own routes (with auth) ───────────────────────────────\n // Encapsulated scope: auth hook only applies to gateway-owned routes,\n // not to proxy upstreams registered above.\n await app.register(async function gatewayRoutes(scope) {\n scope.addHook('onRequest', createAuthMiddleware(cache, jwtConfig));\n\n // Auth service + public routes (/auth/register, /auth/token, /auth/refresh)\n const authService = new AuthService(cache, jwtConfig);\n registerAuthRoutes(scope as unknown as Parameters<typeof registerAuthRoutes>[0], authService);\n\n // Health (public) — comprehensive adapter + upstream health\n const HEALTH_CACHE_KEY = '__gateway_health';\n const HEALTH_CACHE_TTL = 15_000; // 15s cache to prevent health DDoS\n const startupTime = Date.now();\n\n const collectHealthSnapshot = async () => {\n const cached = await cache.get<Record<string, unknown>>(HEALTH_CACHE_KEY).catch(() => null);\n if (cached) {\n return cached;\n }\n\n const adapterNames = ['llm', 'cache', 'analytics', 'vectorStore', 'embeddings'] as const;\n const adapters: Record<string, { available: boolean; latencyMs?: number }> = {};\n\n for (const name of adapterNames) {\n await observability.observeOperation(`gateway.adapter.${name}`, async () => {\n const probeStart = Date.now();\n try {\n const adapter = (platform as any)[name];\n adapters[name] = { available: !!adapter, latencyMs: Date.now() - probeStart };\n } catch {\n adapters[name] = { available: false, latencyMs: Date.now() - probeStart };\n }\n });\n }\n\n const upstreams: Record<string, { status: string; latencyMs?: number }> = {};\n for (const [name, upstream] of Object.entries(config.upstreams)) {\n await observability.observeOperation(`gateway.upstream.${name}.health`, async () => {\n const probeStart = Date.now();\n try {\n const res = await fetch(`${upstream.url}/health`, {\n signal: AbortSignal.timeout(2000),\n });\n const latencyMs = Date.now() - probeStart;\n upstreams[name] = { status: res.ok ? 'up' : 'down', latencyMs };\n if (!res.ok) {\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.upstream.health',\n level: 'warn',\n reasonCode: 'upstream_unavailable',\n message: 'Gateway upstream health probe failed',\n outcome: 'failed',\n serviceId: 'gateway',\n route: `${upstream.prefix}/health`,\n evidence: {\n upstreamId: name,\n upstreamUrl: upstream.url,\n statusCode: res.status,\n latencyMs,\n },\n });\n }\n } catch (error) {\n const latencyMs = Date.now() - probeStart;\n upstreams[name] = { status: 'down', latencyMs };\n logDiagnosticEvent(logger, {\n domain: 'service',\n event: 'gateway.upstream.health',\n level: 'warn',\n reasonCode: 'upstream_unavailable',\n message: 'Gateway upstream health probe failed',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n route: `${upstream.prefix}/health`,\n evidence: {\n upstreamId: name,\n upstreamUrl: upstream.url,\n latencyMs,\n },\n });\n }\n });\n }\n\n const llmOk = adapters.llm?.available ?? false;\n const allOk = Object.values(adapters).every((a) => a.available);\n const snapshot = {\n status: llmOk ? (allOk ? 'healthy' : 'degraded') : 'unhealthy',\n version: '1.0',\n uptime: Math.floor((Date.now() - startupTime) / 1000),\n timestamp: new Date().toISOString(),\n adapters,\n upstreams,\n };\n\n await cache.set(HEALTH_CACHE_KEY, snapshot, HEALTH_CACHE_TTL).catch(() => {});\n return snapshot;\n };\n\n scope.get('/health', { schema: { tags: ['System'], summary: 'Gateway health check' } }, async () => {\n return collectHealthSnapshot();\n });\n\n scope.get('/ready', { schema: { tags: ['System'], summary: 'Gateway readiness check' } }, async (_request, reply) => {\n const health = await collectHealthSnapshot();\n const upstreams = (health.upstreams as Record<string, { status?: string }> | undefined) ?? {};\n const missingRequiredUpstreams = ['rest']\n .filter((id) => (upstreams[id]?.status ?? 'down') !== 'up');\n const ready = missingRequiredUpstreams.length === 0;\n\n return reply.code(ready ? 200 : 503).send(createServiceReadyResponse({\n ready,\n status: ready ? 'ready' : 'degraded',\n reason: ready ? 'ready' : `upstream_unavailable:${missingRequiredUpstreams.join(',')}`,\n components: {\n gatewayAdapters: {\n ready: true,\n },\n restUpstream: {\n ready: (upstreams.rest?.status ?? 'down') === 'up',\n status: upstreams.rest?.status ?? 'down',\n },\n workflowUpstream: {\n ready: (upstreams.workflow?.status ?? 'down') === 'up',\n status: upstreams.workflow?.status ?? 'down',\n },\n marketplaceUpstream: {\n ready: (upstreams.marketplace?.status ?? 'down') === 'up',\n status: upstreams.marketplace?.status ?? 'down',\n },\n },\n }));\n });\n\n scope.get('/metrics', { schema: { tags: ['Observability'], summary: 'Gateway metrics in Prometheus format' } }, async (_request, reply) => {\n const health = await collectHealthSnapshot();\n const status = (health.status as 'healthy' | 'degraded' | 'unhealthy' | undefined) ?? 'healthy';\n reply.header('Content-Type', 'text/plain; version=0.0.4; charset=utf-8');\n return observability.renderPrometheusMetrics(status);\n });\n\n scope.get('/observability/describe', {\n schema: { tags: ['Observability'], summary: 'Gateway observability contract descriptor' },\n }, async () => observability.buildDescribe());\n\n scope.get('/observability/health', {\n schema: { tags: ['Observability'], summary: 'Gateway observability health snapshot' },\n }, async () => {\n const health = await collectHealthSnapshot();\n const adapterChecks = Object.entries((health.adapters as Record<string, { available?: boolean; latencyMs?: number }> | undefined) ?? {})\n .map(([id, value]) => ({ id, available: !!value?.available, latencyMs: value?.latencyMs }));\n const upstreamChecks = Object.entries((health.upstreams as Record<string, { status?: string; latencyMs?: number }> | undefined) ?? {})\n .map(([id, value]) => ({ id, status: value?.status ?? 'unknown', latencyMs: value?.latencyMs }));\n const status = (health.status as 'healthy' | 'degraded' | 'unhealthy' | undefined) ?? 'healthy';\n return observability.buildHealth({ status, adapterChecks, upstreamChecks });\n });\n\n // Host registration (public)\n // Use injected registry (with persistence) or fallback to cache-only\n if (!registry) {\n gatewayLogger.warn('No persistent HostRegistry injected — hosts will be lost on restart');\n }\n const hostRegistry = registry ?? new HostRegistry(cache);\n scope.post('/hosts/register', { schema: { tags: ['Hosts'], summary: 'Register a host' } }, async (request, reply) => {\n const parsed = HostRegistrationSchema.safeParse(request.body);\n if (!parsed.success) {\n return reply.code(400).send({ error: 'Bad Request', issues: parsed.error.issues });\n }\n const result = await hostRegistry.register(parsed.data);\n return reply.code(201).send({\n hostId: result.descriptor.hostId,\n machineToken: result.machineToken,\n status: result.descriptor.status,\n });\n });\n\n // List hosts (auth required)\n scope.get('/hosts', { schema: { tags: ['Hosts'], summary: 'List registered hosts' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n const hosts = await hostRegistry.list(auth.namespaceId);\n return { hosts };\n });\n\n // Get host by ID (auth required)\n scope.get<{ Params: { hostId: string } }>('/hosts/:hostId', { schema: { tags: ['Hosts'], summary: 'Get host by ID' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n const { hostId } = request.params;\n const host = await hostRegistry.get(hostId, auth.namespaceId);\n if (!host) {\n return reply.code(404).send({ error: 'Host not found' });\n }\n return host;\n });\n\n // Deregister host (auth required)\n scope.delete<{ Params: { hostId: string } }>('/hosts/:hostId', { schema: { tags: ['Hosts'], summary: 'Deregister a host' } }, async (request, reply) => {\n const auth = request.authContext;\n if (!auth) {\n return reply.code(401).send({ error: 'Unauthorized' });\n }\n const { hostId } = request.params;\n const deleted = await hostRegistry.deregister(hostId, auth.namespaceId);\n if (!deleted) {\n return reply.code(404).send({ error: 'Host not found' });\n }\n return reply.code(204).send();\n });\n\n // Execute endpoint — public API for CLI/Studio clients (auth required)\n registerExecuteRoutes(scope as unknown as Parameters<typeof registerExecuteRoutes>[0], logger);\n\n // AI Gateway — OpenAI-compatible LLM endpoint (auth required)\n registerLLMGatewayRoutes(scope as unknown as Parameters<typeof registerLLMGatewayRoutes>[0], logger);\n\n // Telemetry ingestion — unified event collection (auth required)\n registerTelemetryRoutes(scope as unknown as Parameters<typeof registerTelemetryRoutes>[0], logger);\n\n // Unified Platform API — single dispatch for any adapter (auth required)\n registerPlatformRoutes(scope as unknown as Parameters<typeof registerPlatformRoutes>[0], logger);\n\n // Aggregated docs — /openapi-merged.json + /docs-all\n registerAggregatedDocsRoutes(scope as unknown as Parameters<typeof registerAggregatedDocsRoutes>[0], cache);\n\n\n // Internal dispatch endpoint\n const internalSecret = process.env.GATEWAY_INTERNAL_SECRET;\n scope.post('/internal/dispatch', async (request, reply) => {\n const provided = request.headers['x-internal-secret'];\n if (!internalSecret || provided !== internalSecret) {\n return reply.code(403).send({ error: 'Forbidden' });\n }\n\n const body = request.body as {\n namespaceId?: string;\n hostId?: string;\n adapter?: string;\n method?: string;\n args?: unknown[];\n };\n\n if (!body.namespaceId || !body.adapter || !body.method) {\n return reply.code(400).send({ error: 'Missing required fields: namespaceId, adapter, method' });\n }\n\n const hostId = body.hostId\n ?? globalDispatcher.firstHostWithCapability(body.namespaceId, body.adapter)\n ?? globalDispatcher.firstHost(body.namespaceId);\n if (!hostId) {\n return reply.code(503).send({\n error: 'No host connected',\n namespaceId: body.namespaceId,\n });\n }\n\n try {\n const result = await globalDispatcher.call(\n body.namespaceId,\n hostId,\n body.adapter,\n body.method,\n body.args ?? [],\n );\n return { result };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes('Host not connected')) {\n return reply.code(503).send({ error: message });\n }\n return reply.code(502).send({ error: message });\n }\n });\n\n // Internal host resolution endpoint\n scope.post('/internal/resolve-host', async (request, reply) => {\n const provided = request.headers['x-internal-secret'];\n if (!internalSecret || provided !== internalSecret) {\n return reply.code(403).send({ error: 'Forbidden' });\n }\n\n const body = request.body as {\n namespaceId?: string;\n target?: {\n hostId?: string;\n hostSelection?: string;\n repoFingerprint?: string;\n };\n };\n\n const namespaceId = body.namespaceId ?? 'default';\n const target = body.target ?? {};\n const strategy = (target.hostSelection ?? 'any-matching') as string;\n\n let hostId: string | undefined;\n\n if (strategy === 'pinned' && target.hostId) {\n // Verify host exists and is reachable (online or reconnecting)\n const host = await hostRegistry.get(target.hostId, namespaceId);\n if (host?.status === 'online' || host?.status === 'reconnecting') {\n hostId = target.hostId;\n }\n } else {\n // any-matching / prefer-local / prefer-cloud: find first with execution capability\n hostId = globalDispatcher.firstHostWithCapability(namespaceId, 'execution');\n }\n\n if (!hostId) {\n return reply.code(404).send({ error: 'No matching host found' });\n }\n\n return { hostId, strategy, namespaceId };\n });\n });\n\n // ── Gateway WebSocket endpoints ────────────────────────────────────\n // Must be after ready() so http-proxy's upgrade listener is registered.\n // attachGatewayWs captures it, removes it, and installs a unified handler\n // that dispatches gateway WS paths to raw ws handlers and delegates\n // everything else (upstream WS proxy) to http-proxy.\n await app.ready();\n attachGatewayWs(app.server, cache, jwtConfig, logger, registry);\n\n return app;\n}\n","import { logDiagnosticEvent } from '@kb-labs/core-platform';\nimport { platform, createServiceBootstrap } from '@kb-labs/core-runtime';\nimport { createCorrelatedLogger } from '@kb-labs/shared-http';\nimport type { IHostStore } from '@kb-labs/gateway-contracts';\nimport { SqliteHostStore } from '@kb-labs/gateway-core';\nimport { loadGatewayConfig } from './config.js';\nimport { createServer } from './server.js';\nimport { HostRegistry } from './hosts/registry.js';\n\nexport async function bootstrap(repoRoot: string = process.cwd()): Promise<void> {\n // 1. Initialize platform (loads .env + adapters from kb.config.json)\n await createServiceBootstrap({ appId: 'gateway', repoRoot });\n\n const logger = createCorrelatedLogger(platform.logger, {\n serviceId: 'gateway',\n logsSource: 'gateway',\n layer: 'gateway',\n service: 'bootstrap',\n operation: 'gateway.bootstrap',\n });\n logger.info('Platform initialized', { repoRoot });\n\n // 2. Load gateway config — reads gateway.upstreams from kb.config.json\n const config = await loadGatewayConfig(repoRoot);\n logger.info('Gateway config loaded', {\n port: config.port,\n upstreams: Object.keys(config.upstreams),\n });\n\n // 3. Create persistent host store (SQLite if available, otherwise cache-only)\n let hostStore: IHostStore | undefined;\n const db = platform.getAdapter<import('@kb-labs/core-platform').ISQLDatabase>('sqlDatabase');\n if (db) {\n hostStore = new SqliteHostStore(db);\n logger.info('Host store: SQLite (persistent)');\n } else {\n logger.warn('Host store: none (cache-only, hosts will be lost on restart)');\n }\n\n // 4. Create host registry with cache + store\n const registry = new HostRegistry(platform.cache, hostStore);\n\n // 5. Restore persisted hosts into cache (best-effort — cache may be unavailable on cold start)\n let restoredCount = 0;\n try {\n restoredCount = await registry.restore();\n } catch (error) {\n logDiagnosticEvent(platform.logger, {\n domain: 'registry',\n event: 'gateway.hosts.restore',\n level: 'error',\n reasonCode: 'registry_restore_failed',\n message: 'Failed to restore gateway host registry',\n outcome: 'failed',\n error: error instanceof Error ? error : new Error(String(error)),\n serviceId: 'gateway',\n evidence: {\n persistentStore: !!hostStore,\n },\n });\n // Non-fatal: gateway can start without restored state; hosts will re-register on reconnect\n }\n if (restoredCount > 0) {\n logger.info('Restored hosts from store', { count: restoredCount });\n }\n\n // 6. Seed static tokens into cache so resolveToken() accepts them\n for (const [token, entry] of Object.entries(config.staticTokens)) {\n await platform.cache.set(`host:token:${token}`, entry);\n logger.info('Static token seeded', { hostId: entry.hostId, namespaceId: entry.namespaceId });\n }\n\n // 7. Build JWT config — secret from env, required in production\n const jwtSecret = process.env.GATEWAY_JWT_SECRET;\n if (!jwtSecret) {\n logger.warn('GATEWAY_JWT_SECRET not set — using insecure default (dev only!)');\n }\n const jwtConfig = { secret: jwtSecret ?? 'dev-insecure-secret-change-me' };\n\n // 8. Create server with injected registry\n const server = await createServer(config, platform.cache, platform.logger, jwtConfig, registry);\n\n // 9. Listen\n const address = await server.listen({ port: config.port, host: '0.0.0.0' });\n logger.info('Gateway listening', { address });\n\n // 10. Graceful shutdown\n const shutdown = async (signal: string) => {\n logger.warn('Received shutdown signal', { signal });\n await platform.shutdown();\n await server.close();\n logger.info('Gateway shutdown complete');\n process.exit(0);\n };\n\n process.on('SIGTERM', () => shutdown('SIGTERM'));\n process.on('SIGINT', () => shutdown('SIGINT'));\n}\n","import { bootstrap } from './bootstrap.js';\n\n// process.cwd() = workspace root when launched via `node ./infra/kb-labs-gateway/.../dist/index.js`\nbootstrap(process.cwd()).catch((error) => {\n console.error('Failed to start gateway:', error);\n process.exit(1);\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kb-labs/gateway-app",
3
- "version": "2.18.0",
3
+ "version": "2.20.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "files": [
@@ -15,17 +15,25 @@
15
15
  "fastify": "^5.2.0",
16
16
  "fastify-type-provider-zod": "^6.0.0",
17
17
  "ws": "^8.18.3",
18
- "@kb-labs/shared-http": "2.18.0",
19
- "@kb-labs/core-config": "2.18.0",
20
- "@kb-labs/core-contracts": "2.18.0",
21
- "@kb-labs/core-platform": "2.18.0",
22
- "@kb-labs/core-registry": "2.18.0",
23
- "@kb-labs/core-runtime": "2.18.0",
24
- "@kb-labs/core-sys": "2.18.0",
25
- "@kb-labs/plugin-contracts": "2.18.0",
26
- "@kb-labs/gateway-auth": "2.18.0",
27
- "@kb-labs/gateway-contracts": "2.18.0",
28
- "@kb-labs/gateway-core": "2.18.0"
18
+ "@kb-labs/shared-http": "2.20.0",
19
+ "@kb-labs/core-contracts": "2.20.0",
20
+ "@kb-labs/core-platform": "2.20.0",
21
+ "@kb-labs/core-registry": "2.20.0",
22
+ "@kb-labs/core-config": "2.20.0",
23
+ "@kb-labs/core-runtime": "2.20.0",
24
+ "@kb-labs/core-sys": "2.20.0",
25
+ "@kb-labs/plugin-contracts": "2.20.0",
26
+ "@kb-labs/gateway-auth": "2.20.0",
27
+ "@kb-labs/gateway-core": "2.20.0",
28
+ "@kb-labs/adapters-sqlite": "2.20.0",
29
+ "@kb-labs/adapters-log-sqlite": "2.20.0",
30
+ "@kb-labs/adapters-pino": "2.20.0",
31
+ "@kb-labs/gateway-contracts": "2.20.0",
32
+ "@kb-labs/adapters-fs": "2.20.0",
33
+ "@kb-labs/adapters-eventbus-cache": "2.20.0",
34
+ "@kb-labs/adapters-log-ringbuffer": "2.20.0",
35
+ "@kb-labs/adapters-openai": "2.20.0",
36
+ "@kb-labs/adapters-redis": "2.20.0"
29
37
  },
30
38
  "devDependencies": {
31
39
  "@types/ws": "^8.5.14",
@@ -34,8 +42,8 @@
34
42
  "tsx": "^4.20.5",
35
43
  "tsup": "^8.5.0",
36
44
  "vitest": "^3.2.4",
37
- "@kb-labs/devkit": "2.18.0",
38
- "@kb-labs/shared-testing-e2e": "2.18.0"
45
+ "@kb-labs/shared-testing-e2e": "2.20.0",
46
+ "@kb-labs/devkit": "2.20.0"
39
47
  },
40
48
  "kb": {
41
49
  "manifest": "./dist/manifest.js"