@angelitosystems/nest-devtools 1.0.9 → 1.0.10

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.cjs CHANGED
@@ -1410,7 +1410,7 @@ function detectNestJsVersion() {
1410
1410
  }
1411
1411
 
1412
1412
  // src/version.ts
1413
- var SDK_VERSION = "1.0.9";
1413
+ var SDK_VERSION = "1.0.10";
1414
1414
 
1415
1415
  // src/banner.ts
1416
1416
  var RESET = "\x1B[0m";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/sdk.ts","../src/instrumentation/http.ts","../src/emitter.ts","../src/instrumentation/timeline.ts","../src/instrumentation/console.ts","../src/instrumentation/nest-logger.ts","../src/instrumentation/exceptions.ts","../src/instrumentation/performance.ts","../src/instrumentation/app-explorer.ts","../src/instrumentation/websockets.ts","../src/instrumentation/database.ts","../src/instrumentation/queue.ts","../src/detect.ts","../src/version.ts","../src/banner.ts","../src/plugins.ts"],"sourcesContent":["/**\n * @angelitosystems/nest-devtools\n *\n * Drop-in real-time debugging and observability for NestJS.\n *\n * Usage:\n * import { NestDevTools } from '@angelitosystems/nest-devtools';\n * const app = await NestFactory.create(AppModule);\n * NestDevTools.init(app);\n */\nexport { NestDevTools, devtools } from './sdk';\nexport type { InitResult, NestDevToolsOptions } from './sdk';\nexport { PluginManager } from './plugins';\nexport type { DevToolsPlugin, PluginContext } from './plugins';\nexport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\nexport { captureError } from './instrumentation/exceptions';\nexport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nexport { requestContext } from '@angelitosystems/devtools-core';\nexport type { RequestContext } from '@angelitosystems/devtools-core';\n","import { hostname } from 'os';\nimport { devtools as coreDevtools, resolveConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { HttpInstrumentation } from './instrumentation/http';\nimport { ConsoleInstrumentation } from './instrumentation/console';\nimport { LoggerInstrumentation } from './instrumentation/nest-logger';\nimport { ExceptionsInstrumentation, captureError } from './instrumentation/exceptions';\nimport { PerformanceInstrumentation } from './instrumentation/performance';\nimport { AppExplorer } from './instrumentation/app-explorer';\nimport { WebsocketInstrumentation } from './instrumentation/websockets';\nimport { DatabaseInstrumentation } from './instrumentation/database';\nimport { QueueEventInstrumentation } from './instrumentation/queue';\nimport { detectNestJsVersion } from './detect';\nimport { SDK_VERSION } from './version';\nimport { printStartupBanner, printConnectionStatus } from './banner';\nimport { PluginManager } from './plugins';\nimport type { DevToolsPlugin } from './plugins';\nimport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\n\n/** Result of calling NestDevTools.init(). */\nexport interface InitResult {\n /** True when instrumentation is live. */\n enabled: boolean;\n /** Reason when partially or fully disabled. */\n reason?: 'disabled-by-config' | 'already-initialized' | 'no-http-adapter';\n projectId: string;\n projectName: string;\n server: string;\n}\n\nexport type NestDevToolsOptions = DevToolsUserConfig & { plugins?: DevToolsPlugin[] };\n\n/**\n * Main entry point: `NestDevTools.init(app, config?)`.\n *\n * Never throws, never blocks startup, and disables itself in production\n * unless explicitly enabled.\n */\nexport class NestDevTools {\n private static readonly cleanups: Array<() => void> = [];\n private static initialized = false;\n\n /** Initialize DevTools for a NestJS application. One active instance per process. */\n static init(app: INestApplication, userConfig?: NestDevToolsOptions): InitResult {\n const config = resolveConfig(userConfig);\n const disabled: InitResult = {\n enabled: false,\n reason: 'disabled-by-config',\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n server: config.server,\n };\n\n if (this.initialized) return { ...disabled, reason: 'already-initialized' };\n if (!config.enabled) return disabled; // zero side effects: no patching, no sockets, no timers\n\n this.initialized = true;\n const registerCleanup = (fn: () => void) => this.cleanups.push(fn);\n\n const projectInfo: ProjectInfo = {\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n environment: config.environment,\n hostname: safeHostname(),\n port: null,\n pid: process.pid,\n runtime: detectRuntime(),\n runtimeVersion: detectRuntimeVersion(),\n nodeVersion: process.version,\n nestjsVersion: detectNestJsVersion(),\n sdkVersion: SDK_VERSION,\n };\n\n // transport is fully async: a missing server never affects startup\n let hasWarnedOffline = false;\n coreDevtools.initialize({\n config,\n projectInfo,\n registerCleanup,\n onStateChange: (state: any) => {\n if (state === 'open') {\n printConnectionStatus('open', dashboardUrl(config.server));\n } else if (state === 'retrying' && !hasWarnedOffline) {\n hasWarnedOffline = true;\n printConnectionStatus('offline', dashboardUrl(config.server));\n }\n },\n } as any);\n\n if (userConfig?.plugins && userConfig.plugins.length > 0) {\n registerCleanup(new PluginManager(userConfig.plugins).attach(app, config, projectInfo));\n }\n\n const adapter = app.getHttpAdapter();\n const httpReady = Boolean(adapter && ['http', 'express'].includes(adapter.getType()));\n\n // ---- HTTP instrumentation -------------------------------------------\n const http = new HttpInstrumentation({ config, projectInfo });\n registerCleanup(http.attach(app));\n\n // ---- console + NestJS Logger + global errors ------------------------\n registerCleanup(new ConsoleInstrumentation({ config, projectInfo }).attach());\n registerCleanup(new LoggerInstrumentation({ config, projectInfo }).attach());\n registerCleanup(ExceptionsInstrumentation.attach({ config, projectInfo }));\n\n // ---- performance sampling -------------------------------------------\n registerCleanup(new PerformanceInstrumentation({ config, projectInfo }).attach());\n\n // ---- application graph ----------------------------------------------\n registerCleanup(new AppExplorer({ config, projectInfo }).attach(app));\n\n // ---- websockets + database + queues (best effort) ------------------\n if (config.capture.websockets) {\n registerCleanup(new WebsocketInstrumentation({ config, projectInfo }).attach());\n }\n if (config.capture.database) {\n registerCleanup(new DatabaseInstrumentation({ config, projectInfo }).attach());\n }\n registerCleanup(new QueueEventInstrumentation({ config, projectInfo }).attach());\n\n printStartupBanner({\n endpoint: config.server,\n dashboard: dashboardUrl(config.server),\n project: projectInfo.projectName,\n });\n\n return {\n enabled: true,\n projectId: config.projectId,\n projectName: projectInfo.projectName,\n server: config.server,\n ...(httpReady ? {} : { reason: 'no-http-adapter' as const }),\n };\n }\n\n /** Teardown everything (mostly useful in tests). */\n static destroy(): void {\n for (const cleanup of this.cleanups.splice(0)) {\n try {\n cleanup();\n } catch {\n /* ignore */\n }\n }\n this.initialized = false;\n coreDevtools.shutdown();\n }\n\n /** Whether the SDK is currently active in this process. */\n static isActive(): boolean {\n return this.initialized;\n }\n\n /** Start an explicit CPU or heap profile. */\n static startProfile(kind: ProfileKind): Promise<{ profileId: string; startedAt: number }> {\n return coreDevtools.startProfile(kind);\n }\n\n /** Stop the active profile and return its captured result. */\n static stopProfile(): Promise<ProfileResult> {\n return coreDevtools.stopProfile();\n }\n}\n\n/** Convenience functional alias: devtools.init(app). */\nexport const devtools = {\n init: NestDevTools.init.bind(NestDevTools),\n destroy: NestDevTools.destroy.bind(NestDevTools),\n isActive: NestDevTools.isActive.bind(NestDevTools),\n startProfile: NestDevTools.startProfile.bind(NestDevTools),\n stopProfile: NestDevTools.stopProfile.bind(NestDevTools),\n};\n\nfunction safeHostname(): string {\n try {\n return hostname();\n } catch {\n return 'unknown';\n }\n}\n\nfunction detectRuntime(): string {\n const versions = process.versions as Record<string, string | undefined>;\n if (versions['bun']) return 'bun';\n if (versions['deno']) return 'deno';\n return 'node';\n}\n\nfunction detectRuntimeVersion(): string {\n const versions = process.versions as Record<string, string | undefined>;\n return versions['bun'] ?? versions['deno'] ?? process.version;\n}\n\nfunction dashboardUrl(server: string): string {\n try {\n const url = new URL(server);\n url.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';\n const port = Number(url.port);\n url.port = String(Number.isFinite(port) && port > 0 ? port - 1 : 4317);\n url.pathname = '';\n url.search = '';\n url.hash = '';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return 'http://localhost:4317';\n }\n}\n\nexport { captureError };","import type { IncomingMessage, ServerResponse, Server as HttpServer } from 'http';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport type {\n ProjectInfo,\n RequestCompletedPayload,\n RequestStartedPayload,\n TimelineSpan,\n} from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { recordSpan, trackSpans } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\n/** Shared context every instrumentation module receives. */\nexport interface InstrumentationContext {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n}\n\n/** Request headers captured by default (denylist still applies). */\nconst REQUEST_HEADERS = [\n 'content-type',\n 'content-length',\n 'accept',\n 'origin',\n 'referer',\n 'user-agent',\n 'x-forwarded-for',\n 'x-request-id',\n 'x-forwarded-proto',\n] as const;\n\n/** Response headers captured by default. */\nconst RESPONSE_HEADERS = [\n 'content-type',\n 'content-length',\n 'location',\n 'set-cookie',\n 'x-request-id',\n 'x-response-time',\n] as const;\n\ntype RequestListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst WRAPPED = Symbol('nest-devtools.wrapped');\n\n/**\n * Instrument the HTTP server of a NestJS application.\n *\n * Covers both bootstrap orders without touching Node module internals:\n * - `NestDevTools.init(app)` after `app.listen()`: the server already exists\n * and is wrapped immediately.\n * - `NestDevTools.init(app)` before `app.listen()` (recommended): `app.listen`\n * is wrapped so the server is wrapped the moment it exists.\n */\nexport class HttpInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: InstrumentationContext) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Begin capturing HTTP requests. Returns a cleanup function. */\n attach(app: INestApplication): () => void {\n try {\n const adapter = app.getHttpAdapter();\n // 'http' = platform-default adapter, 'express' = @nestjs/platform-express\n if (!adapter || !['http', 'express'].includes(adapter.getType())) return () => {};\n\n const getServer = (): HttpServer | undefined =>\n (adapter as unknown as { getHttpServer?: () => HttpServer }).getHttpServer?.();\n\n // 1) server already exists (init called after listen)\n const existing = getServer();\n if (existing) {\n this.wrapServer(existing);\n return () => {};\n }\n\n // 2) init called before listen: wrap the server once listen() resolves\n const appLike = app as unknown as { listen: (...args: unknown[]) => unknown };\n const originalListen = appLike.listen.bind(app);\n const self = this;\n const patchedListen = (...args: unknown[]) => {\n const result = originalListen(...args);\n Promise.resolve(result)\n .then(() => {\n const server = getServer();\n if (server) self.wrapServer(server);\n })\n .catch(() => {\n /* listen failed — the app will surface its own error */\n });\n return result;\n };\n appLike.listen = patchedListen;\n\n return () => {\n appLike.listen = originalListen;\n };\n } catch {\n return () => {};\n }\n }\n\n /** Wrap the 'request' listeners of a server exactly once. */\n private wrapServer(server: HttpServer): void {\n const target = server as unknown as Record<symbol, unknown>;\n if (target[WRAPPED]) return;\n target[WRAPPED] = true;\n\n const self = this;\n const originalListeners = server.rawListeners('request') as RequestListener[];\n\n server.removeAllListeners('request');\n server.on('request', (req, res) => {\n self.instrumentRequest(req, res, () => {\n for (const listener of originalListeners) {\n listener.call(server, req, res);\n }\n });\n });\n }\n\n /** Wrap a single request lifecycle. */\n private instrumentRequest(req: IncomingMessage, res: ServerResponse, next: () => void): void {\n if (!this.ctx.config.capture.requests) {\n next();\n return;\n }\n\n const startedAt = Date.now();\n const requestId = randomId('req');\n const method = (req.method ?? 'GET').toUpperCase();\n const rawUrl = req.url ?? '/';\n const url = safeUrlPath(rawUrl);\n\n const spans: TimelineSpan[] = [];\n const unregister = trackSpans(requestId, spans);\n res.once('finish', unregister);\n\n const started: RequestStartedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n headers: this.collectRequestHeaders(req),\n query: parseQuery(rawUrl),\n ip: clientIp(req),\n userAgent: asString(req.headers['user-agent']) || undefined,\n startedAt,\n };\n\n const middlewareSpan: TimelineSpan = {\n layer: 'middleware',\n label: `${method} ${url}`,\n duration: 0,\n startedAt,\n status: 'ok',\n };\n spans.push(middlewareSpan);\n\n const capturedBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n const responseCapture = createResponseCapture(res, this.ctx.config.maxPayloadBytes, this.redactor);\n\n const onFinished = () => {\n const finishedAt = Date.now();\n middlewareSpan.duration = Math.max(0, finishedAt - middlewareSpan.startedAt);\n middlewareSpan.status = res.statusCode >= 500 ? 'error' : 'ok';\n\n const responseSpan: TimelineSpan = {\n layer: 'response',\n label: 'response',\n duration: 0,\n startedAt: finishedAt,\n status: res.statusCode >= 400 ? 'error' : 'ok',\n };\n spans.push(responseSpan);\n\n const responseHeaders = this.collectResponseHeaders(res);\n const responsePreview = responseCapture.read();\n const requestBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n\n const errored = res.statusCode >= 500;\n\n const completed: RequestCompletedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n statusCode: res.statusCode,\n duration: finishedAt - startedAt,\n startedAt,\n timeline: spans,\n requestHeaders: started.headers,\n query: parseQuery(rawUrl),\n headers: responseHeaders,\n responsePreview,\n requestBody: requestBody ?? capturedBody,\n errored,\n };\n\n emit('request.completed', completed);\n\n // NestJS exception filters turn controller errors into 5xx responses\n // without any process-level signal — surface them in the Error Explorer.\n if (errored) {\n emit('error.created', {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n name: 'HttpError',\n message: `${method} ${url} failed with status ${res.statusCode}`,\n fingerprint: httpErrorFingerprint(method, url, res.statusCode),\n request: { method, url: String(url), statusCode: res.statusCode },\n timestamp: finishedAt,\n });\n }\n };\n\n const context = requestContext();\n context.run({ requestId, method, url, startedAt }, () => {\n emit('request.started', started);\n res.once('finish', onFinished);\n next();\n });\n }\n\n private collectRequestHeaders(req: IncomingMessage): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : asString(value).slice(0, 200);\n }\n return out;\n }\n\n private collectResponseHeaders(res: ServerResponse): Record<string, string> {\n const out: Record<string, string> = {};\n const headers = typeof res.getHeaders === 'function' ? res.getHeaders() : {};\n\n for (const rawKey of Object.keys(headers)) {\n const key = rawKey.toLowerCase();\n const raw = headers[rawKey] as string | number | string[] | undefined ?? '';\n const value = String(raw);\n if (value === '') continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : value.slice(0, 200);\n }\n return out;\n }\n}\n\nfunction asString(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value.join(', ');\n return value ?? '';\n}\n\n/** Stable fingerprint for framework-handled HTTP failures. */\nfunction httpErrorFingerprint(method: string, url: string, statusCode: number): string {\n const route = url.replace(/\\/\\d+(?=\\/|$)/g, '/:id'); // group /users/15 with /users/16\n const raw = `${method}::${route}::${statusCode}`;\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction safeUrlPath(raw: string): string {\n const index = raw.indexOf('?');\n return index === -1 ? raw : raw.slice(0, index);\n}\n\nfunction parseQuery(raw: string): Record<string, unknown> {\n const index = raw.indexOf('?');\n if (index === -1) return {};\n const out: Record<string, unknown> = {};\n for (const [key, value] of new URLSearchParams(raw.slice(index + 1))) {\n out[key] = value;\n }\n return out;\n}\n\nfunction clientIp(req: IncomingMessage): string | undefined {\n const forwarded = req.headers['x-forwarded-for'];\n if (typeof forwarded === 'string') return forwarded.split(',')[0]?.trim();\n return req.socket?.remoteAddress ?? undefined;\n}\n\n/** Best-effort route extraction from Express/Nest request. */\nfunction routeFromReq(req: IncomingMessage): string | undefined {\n try {\n const http = req as unknown as { httpVersion?: string };\n const out: RequestStartedPayload = {\n requestId: '',\n projectId: '',\n method: '',\n url: '',\n route: undefined,\n headers: {},\n query: {},\n ip: undefined,\n userAgent: undefined,\n startedAt: 0,\n };\n const routeRaw: unknown = (req as unknown as Record<string, unknown>).route;\n if (routeRaw && typeof routeRaw === 'object' && routeRaw !== null) {\n const route = routeRaw as { name?: unknown };\n const name = route.name as string | undefined;\n if (typeof name === 'string' && name.length > 0) return name;\n }\n const path = (req as unknown as { baseUrl?: string }).baseUrl\n ?? (req as any).path;\n if (typeof path === 'string' && path.length > 0) return path;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the request body (limited, redacted). */\nfunction captureRequestPreview(req: IncomingMessage, redactor: Redactor): unknown {\n try {\n const body = (req as unknown as Record<string, unknown>).body;\n if (body === undefined || body === null) return undefined;\n return redactor.redact(body);\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the response body after the response finishes. */\nfunction captureResponsePreview(res: ServerResponse, redactor: Redactor): string | undefined {\n try {\n const resLike = res as unknown as Record<string, unknown>;\n const body = resLike.body;\n if (body === undefined || body === null) return undefined;\n if (typeof body === 'string') return redactor.redactString(body);\n return redactor.serialize(body);\n } catch {\n return undefined;\n }\n}\n\nfunction createResponseCapture(\n res: ServerResponse,\n maxBytes: number,\n redactor: Redactor,\n): { read: () => string | undefined } {\n if (maxBytes <= 0) return { read: () => undefined };\n const chunks: Buffer[] = [];\n let size = 0;\n const originalWrite = res.write.bind(res);\n const originalEnd = res.end.bind(res);\n const capture = (chunk: unknown): void => {\n if (chunk === undefined || chunk === null || size >= maxBytes) return;\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n const remaining = maxBytes - size;\n chunks.push(buffer.subarray(0, remaining));\n size += Math.min(buffer.length, remaining);\n };\n (res as any).write = (chunk: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalWrite(chunk as any, ...(args as any));\n };\n (res as any).end = (chunk?: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalEnd(chunk as any, ...(args as any));\n };\n res.once('finish', () => {\n (res as any).write = originalWrite;\n (res as any).end = originalEnd;\n });\n return {\n read: () => {\n if (chunks.length === 0) return undefined;\n const raw = Buffer.concat(chunks).toString('utf8');\n return redactor.redactString(raw);\n },\n };\n}\n\nexport { safeUrlPath, parseQuery, clientIp, routeFromReq };\n","import { devtools as coreDevtools } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName } from '@angelitosystems/devtools-protocol';\n\n/** Emit a typed protocol event to the DevTools server (fire-and-forget). */\nexport function emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void {\n try {\n coreDevtools.send(event, payload);\n } catch {\n /* instrumentation must never break the app */\n }\n}\n","import type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\n\n/** Create a started span inside a request's span list. */\nexport function startSpan(\n spans: TimelineSpan[],\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): TimelineSpan {\n const span: TimelineSpan = {\n layer,\n label,\n duration: 0,\n startedAt: Date.now(),\n status: options?.status ?? 'ok',\n ...(options?.detail !== undefined ? { detail: options.detail } : {}),\n ...(options?.source !== undefined ? { source: options.source } : {}),\n };\n spans.push(span);\n return span;\n}\n\n/** Finalize a span, computing its duration. */\nexport function endSpan(span: TimelineSpan, status?: 'ok' | 'error'): void {\n span.duration = Math.max(0, Date.now() - span.startedAt);\n if (status) span.status = status;\n}\n\n/**\n * Registry of active request timelines, keyed by requestId.\n * Lets deeper instrumentation (database, websockets) attach spans to the\n * request that caused them, using the AsyncLocalStorage request id.\n */\nconst recorders = new Map<string, TimelineSpan[]>();\n\n/** Register a request's span list. Returns an unregister callback. */\nexport function trackSpans(requestId: string, spans: TimelineSpan[]): () => void {\n recorders.set(requestId, spans);\n return () => recorders.delete(requestId);\n}\n\n/** Add an auto-ended span to a request if it is still active. */\nexport function recordSpan(\n requestId: string,\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): void {\n const spans = recorders.get(requestId);\n if (!spans) return;\n const span = startSpan(spans, layer, label, options);\n endSpan(span, options?.status);\n}\n","import { Console } from 'console';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\nconst METHODS = ['log', 'info', 'warn', 'error', 'debug'] as const;\ntype ConsoleMethod = (typeof METHODS)[number];\n\nconst LEVEL_BY_METHOD: Record<ConsoleMethod, LogLevel> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n debug: 'debug',\n};\n\n/** Original console bound directly to the process streams. */\nconst originalConsole = new Console({\n stdout: process.stdout,\n stderr: process.stderr,\n colorMode: 'auto',\n});\n\n/** Write through the untouched console (used by DevTools' own logging). */\nexport function writeOriginalConsole(method: ConsoleMethod, ...args: unknown[]): void {\n const fn = (originalConsole as unknown as Record<string, (...a: unknown[]) => void>)[method];\n if (fn) fn.apply(originalConsole, args);\n}\n\n/** Capture console output and mirror it to DevTools. */\nexport class ConsoleInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Patch console methods. Returns a restore function. */\n attach(): () => void {\n const self = this;\n const restores: Array<() => void> = [];\n\n for (const method of METHODS) {\n const original = (console as unknown as Record<string, unknown>)[method];\n if (typeof original !== 'function') continue;\n\n const patched = (...args: unknown[]) => {\n try {\n (original as (...a: unknown[]) => void).apply(console, args);\n } catch {\n /* never break host logging */\n }\n self.capture(method, args);\n };\n\n (console as unknown as Record<string, unknown>)[method] = patched;\n restores.push(() => {\n (console as unknown as Record<string, unknown>)[method] = original;\n });\n }\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n\n private capture(method: ConsoleMethod, args: unknown[]): void {\n if (!this.ctx.config.capture.logs) return;\n try {\n const level = LEVEL_BY_METHOD[method];\n const payload: LogPayload = {\n projectId: this.ctx.projectInfo.projectId,\n level,\n message: formatMessage(args, this.redactor),\n arguments: args.length > 0 ? (this.redactor.redact(args) as unknown[]) : undefined,\n stack: method === 'error' ? captureStack() : undefined,\n source: resolveSourceLocation(captureStack() ?? '', { skip: 0 }),\n context: undefined,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n if (method === 'error') payload.level = 'error';\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n }\n}\n\nfunction formatMessage(args: unknown[], redactor: Redactor): string {\n if (args.length === 0) return '';\n const first = args[0];\n if (typeof first === 'string') {\n return args.length === 1 ? redactor.redactString(first) : `${first} ${redactor.serialize(args.slice(1))}`;\n }\n return redactor.serialize(args);\n}\n\nfunction captureStack(): string | undefined {\n const err = new Error();\n const stack = err.stack;\n if (!stack) return undefined;\n // drop the frames created by this helper\n return stack.split('\\n').slice(3).join('\\n');\n}\n","import { Logger } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\n/**\n * Captures NestJS framework logs (`new Logger('Ctx').log(...)` and the static\n * `Logger.log(...)` variants). Nest's Logger writes through process.stdout\n * internals, not console.*, so it needs its own hook.\n *\n * State is module-scoped on purpose: the patched methods are plain functions\n * and must never depend on class-instance `this` binding.\n */\nlet activeRedactor = new Redactor();\nlet activeConfig: DevToolsConfig | null = null;\nlet activeProjectId = '';\n\nfunction capture(level: LogLevel, message: unknown, context?: string, stack?: string): void {\n try {\n if (!activeConfig?.capture.logs) return;\n const text = typeof message === 'string' ? message : activeRedactor.serialize(message);\n const payload: LogPayload = {\n projectId: activeProjectId,\n level,\n message: activeRedactor.redactString(text),\n source: stack ? undefined : resolveSdkAwareLocation(),\n context,\n stack,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\n/** Captures NestJS Logger output and mirrors it to DevTools. */\nexport class LoggerInstrumentation {\n constructor(ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n activeRedactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n activeConfig = ctx.config;\n activeProjectId = ctx.projectInfo.projectId;\n }\n\n /** Patch Logger.prototype and the static Logger methods. Returns a restore function. */\n attach(): () => void {\n const restores: Array<() => void> = [];\n\n const patch = (owner: Record<string, unknown>, method: string, level: LogLevel, instance: boolean) => {\n const original = owner[method];\n if (typeof original !== 'function') return;\n\n owner[method] = function (this: unknown, message: unknown, ...rest: unknown[]) {\n const context = instance\n ? ((this as { context?: string } | undefined)?.context ?? (rest[0] as string | undefined))\n : (rest[0] as string | undefined);\n const stack = rest[1] as string | undefined;\n try {\n const result = (original as (...a: unknown[]) => unknown).apply(this, [message, ...rest]);\n capture(level, message, context, stack);\n return result;\n } catch (err) {\n capture(level, message, context, stack);\n throw err;\n }\n };\n\n restores.push(() => {\n owner[method] = original;\n });\n };\n\n // instance loggers: `new Logger('Ctx').log(...)` — the common case\n const proto = Logger.prototype as unknown as Record<string, unknown>;\n patch(proto, 'log', 'info', true);\n patch(proto, 'error', 'error', true);\n patch(proto, 'warn', 'warn', true);\n patch(proto, 'debug', 'debug', true);\n patch(proto, 'verbose', 'verbose', true);\n\n // static loggers: `Logger.log(...)`\n const statics = Logger as unknown as Record<string, unknown>;\n patch(statics, 'log', 'info', false);\n patch(statics, 'error', 'error', false);\n patch(statics, 'warn', 'warn', false);\n patch(statics, 'debug', 'debug', false);\n patch(statics, 'verbose', 'verbose', false);\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n}\n\nfunction resolveSdkAwareLocation(): LogPayload['source'] {\n try {\n const err = new Error();\n const stack = err.stack?.split('\\n').slice(3).join('\\n');\n return resolveSourceLocation(stack ?? '', { skip: 0 });\n } catch {\n return undefined;\n }\n}\n","import { basename } from 'path';\nimport type { ErrorPayload, ProjectInfo, SourceLocation } from '@angelitosystems/devtools-protocol';\nimport { requestContext, safeStringify, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\ntype InstrumentationCtx = {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n};\n\n/**\n * Global error capture via process-level hooks. Errors handled by NestJS\n * filters surface through request.completed; unexpected errors land here.\n */\nexport class ExceptionsInstrumentation {\n /** Attach process-level hooks. Returns a detach function. */\n static attach(ctx: InstrumentationCtx): () => void {\n const onUncaught = (error: unknown): void => {\n reportError(error, ctx, { source: 'uncaughtException' });\n };\n const onRejection = (reason: unknown): void => {\n reportError(reason, ctx, { source: 'unhandledRejection' });\n };\n\n process.on('uncaughtException', onUncaught);\n process.on('unhandledRejection', onRejection);\n\n return () => {\n process.off('uncaughtException', onUncaught);\n process.off('unhandledRejection', onRejection);\n };\n }\n}\n\n/** Public helper: report an error manually from anywhere in the app. */\nexport function captureError(\n error: unknown,\n options?: { context?: string; controller?: string; service?: string },\n): void {\n reportError(error, undefined, options);\n}\n\nfunction reportError(\n error: unknown,\n ctx: InstrumentationCtx | undefined,\n options?: { context?: string; controller?: string; service?: string; source?: string },\n): void {\n try {\n if (ctx && !ctx.config.capture.errors) return;\n\n const normalized = normalizeError(error);\n const location = resolveSourceLocation(normalized.error ?? normalized.message, { skip: 1 });\n const projectId = ctx?.projectInfo.projectId ?? basename(process.cwd());\n\n const payload: ErrorPayload = {\n requestId: requestContext().requestId(),\n projectId,\n name: normalized.name,\n message: normalized.message,\n stack: normalized.error?.stack,\n source: location,\n fingerprint: fingerprint(normalized.name, normalized.message, location),\n context: options?.context ?? options?.source,\n request: currentRequestSummary(),\n controller: options?.controller,\n service: options?.service,\n timestamp: Date.now(),\n };\n\n emit('error.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\nfunction normalizeError(error: unknown): { error: Error | undefined; name: string; message: string } {\n if (error instanceof Error) {\n return { error, name: error.name, message: error.message };\n }\n if (typeof error === 'string') {\n return { error: undefined, name: 'Unknown', message: error };\n }\n if (error !== null && typeof error === 'object' && 'message' in error) {\n const record = error as Record<string, unknown>;\n return {\n error: undefined,\n name: typeof record['name'] === 'string' ? record['name'] : 'Error',\n message: String(record['message']),\n };\n }\n return { error: undefined, name: 'Unknown', message: safeStringify(error) };\n}\n\nfunction fingerprint(name: string, message: string, location?: SourceLocation): string {\n const raw = name + '::' + message + '::' + (location?.file ?? '') + ':' + String(location?.line ?? '');\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction currentRequestSummary(): { method: string; url: string } | undefined {\n const context = requestContext().current();\n if (!context?.method || !context?.url) return undefined;\n return { method: context.method, url: context.url };\n}\n","import type { InstrumentationContext } from './http';\n\n/**\n * Performance instrumentation.\n *\n * Periodic CPU/memory/event-loop/latency sampling lives in core\n * (CoreDevtools.startPerformance) so it works even without an HTTP adapter.\n * This module exists as the capture-toggle boundary and future extension\n * point (gc hooks, histograms, cluster awareness).\n */\nexport class PerformanceInstrumentation {\n constructor(private readonly ctx: InstrumentationContext) {}\n\n /** No-op: sampling is owned by core. Returns a no-op cleanup. */\n attach(): () => void {\n void this.ctx;\n return () => {};\n }\n}\n","import type { AppModuleNode, AppMemberNode, AppSnapshot, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { HttpInstrumentation } from './http';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\ninterface ContainerNode {\n id: string;\n name?: string;\n metatype?: Function;\n instance?: object;\n subtype?: 'httpController' | 'gateway';\n controllers?: Map<string, unknown>;\n providers?: Map<string, unknown>;\n}\n\n/**\n * Explore the Nest container to build the module graph (modules, controllers,\n * providers, guards, pipes...). Best effort: any failure keeps the app safe.\n */\nexport class AppExplorer {\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {}\n\n /** Walk the container and emit app.snapshot. Returns a no-op cleanup. */\n attach(app: INestApplication): () => void {\n try {\n const snapshot = this.buildSnapshot(app);\n emit('app.snapshot', snapshot);\n } catch {\n /* best effort */\n }\n return () => {};\n }\n\n private buildSnapshot(app: INestApplication): AppSnapshot {\n const internal = (app as unknown as { container?: unknown }).container as\n | { getModules?: () => Map<string, ContainerNode> }\n | undefined;\n\n const modules: AppModuleNode[] = [];\n const modulesMap = internal?.getModules?.();\n if (modulesMap) {\n for (const [id, node] of modulesMap) {\n const moduleName = node.metatype?.name ?? String(id);\n const members = this.extractMembers(node);\n modules.push({\n name: moduleName,\n imports: [],\n controllers: members.controllers,\n providers: members.providers,\n exports: [],\n });\n }\n }\n\n return {\n projectId: this.ctx.projectInfo.projectId,\n projectName: this.ctx.projectInfo.projectName,\n modules,\n nestjsVersion: this.ctx.projectInfo.nestjsVersion,\n capturedAt: Date.now(),\n };\n }\n\n private extractMembers(node: ContainerNode): { controllers: AppMemberNode[]; providers: AppMemberNode[] } {\n const controllers: AppMemberNode[] = [];\n const providers: AppMemberNode[] = [];\n\n const controllersMap = node.controllers;\n if (controllersMap instanceof Map) {\n for (const [id, wrapper] of controllersMap) {\n const member = this.memberFromWrapper(id, wrapper, 'controller');\n if (member) controllers.push(member);\n }\n }\n\n const providersMap = node.providers;\n if (providersMap instanceof Map) {\n for (const [id, wrapper] of providersMap) {\n const member = this.memberFromWrapper(id, wrapper);\n if (!member) continue;\n if (wrapper && (wrapper as { subtype?: string }).subtype === 'httpController') {\n controllers.push(member);\n } else {\n providers.push(member);\n }\n }\n }\n\n return { controllers, providers };\n }\n\n private memberFromWrapper(id: string, wrapper: unknown, forcedType?: AppMemberNode['type']): AppMemberNode | null {\n const w = wrapper as { name?: string; metatype?: Function; subtype?: string; instance?: Record<string, unknown> } | null;\n const name = w?.metatype?.name ?? (typeof id === 'string' ? id.replace(/^[A-Z_0-9]+:/, '') : 'unknown');\n const type = forcedType ?? classify(name, w?.instance);\n const routes = type === 'controller' ? extractControllerRoutes(w?.metatype) : undefined;\n return { name, type, routes };\n }\n}\n\n/** Heuristic classification of providers into guards/interceptors/pipes/filters. */\nfunction classify(name: string, instance?: Record<string, unknown>): AppMemberNode['type'] {\n if (name.endsWith('Gateway')) return 'gateway';\n if (name.endsWith('Guard')) return 'guard';\n if (name.endsWith('Interceptor')) return 'interceptor';\n if (name.endsWith('Pipe')) return 'pipe';\n if (name.endsWith('Filter')) return 'filter';\n if (instance && typeof instance.canActivate === 'function') return 'guard';\n if (instance && typeof instance.intercept === 'function') return 'interceptor';\n if (instance && typeof instance.transform === 'function') return 'pipe';\n if (instance && typeof instance.catch === 'function') return 'filter';\n return 'provider';\n}\n\n/** Best-effort extraction of controller routes from a controller metatype. */\nfunction extractControllerRoutes(metatype?: Function): string[] {\n if (!metatype) return [];\n try {\n const proto = metatype.prototype;\n if (!proto) return [];\n const props = Object.getOwnPropertyNames(proto).filter((name) => name !== 'constructor');\n const routes: string[] = [];\n for (const key of props) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (!desc?.value) continue;\n const value = desc.value;\n const routesForMethod = gatherHttpRoutes(value);\n for (const r of routesForMethod) {\n if (typeof r === 'string' && r.length > 0) routes.push(r);\n }\n }\n return routes;\n } catch {\n return [];\n }\n}\n\n/** Attempt to extract HTTP routes from a controller method via NestJS decorators. */\nfunction gatherHttpRoutes(value: Function): (string | undefined)[] {\n try {\n const decorators = (Reflect as any).getMetadata?.('design:http:method', {} as any, undefined, undefined) ?? [];\n const out: (string | undefined)[] = [];\n\n if (decorators.length > 0) {\n for (const d of decorators) {\n if (d && typeof d === 'object' && (d as any).method && (d as any).path) {\n out.push(`${String((d as any).method).toUpperCase()} ${String((d as any).path)}`);\n }\n }\n }\n\n if (typeof value === 'function') {\n const fn = value as any;\n const path = fn.PATH ?? undefined;\n const method = fn.METHOD ?? undefined;\n if (typeof path === 'string' && typeof method === 'string') {\n out.push(`${method.toUpperCase()} ${path}`);\n } else if (typeof path === 'string') {\n out.push(path);\n }\n }\n\n return out;\n } catch {\n return [];\n }\n}\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo, GatewayConnectionPayload, GatewayMessagePayload } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/**\n * WebSocket gateway instrumentation, best-effort.\n *\n * Detects @WebSocketGateway classes via the Nest container and reports\n * connection counts and message flow (received/sent) with redaction.\n * Does not intercept raw sockets unless the gateway exposes them.\n */\nexport class WebsocketInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach gateway hooks. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.websockets) return () => cleanup.forEach((fn) => fn());\n\n const gateways = this.detectGateways();\n for (const gw of gateways) {\n cleanup.push(this.wrapGateway(gw));\n }\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private detectGateways(): Array<{ name: string; instance: any }> {\n try {\n const app = this.getApp();\n if (!app) return [];\n const container = (app as any).container;\n if (!container) return [];\n const modules = container.getModules?.() ?? new Map();\n const out: Array<{ name: string; instance: any }> = [];\n for (const [id, node] of modules) {\n const providers = (node as any).providers;\n if (!providers || !(providers instanceof Map)) continue;\n for (const [key, wrapper] of providers) {\n const w = wrapper as any;\n if (!w || !w.instance) continue;\n const subtype = w.subtype ?? (node.subtype ?? null);\n if (subtype === 'gateway' || (w.instance && w.instance.constructor?.name?.endsWith('Gateway'))) {\n out.push({ name: w.name ?? key, instance: w.instance });\n }\n }\n }\n return out;\n } catch {\n return [];\n }\n }\n\n private wrapGateway(gw: { name: string; instance: any }): () => void {\n const instance = gw.instance;\n if (!instance || typeof instance !== 'object') return () => {};\n\n const hooks: Array<() => void> = [];\n const methods = [\n 'handleConnection',\n 'handleDisconnect',\n 'handleEvent',\n 'handleMessage',\n 'afterInit',\n 'beforeHandle',\n ];\n\n for (const method of methods) {\n if (typeof (instance as any)[method] !== 'function') continue;\n const orig = (instance as any)[method];\n const wrapped = this.buildGatewayWrapper(instance, method, orig);\n (instance as any)[method] = wrapped;\n hooks.push(() => {\n (instance as any)[method] = orig;\n });\n }\n\n return () => hooks.forEach((fn) => fn());\n }\n\n private buildGatewayWrapper(\n instance: any,\n method: string,\n original: (...args: any[]) => any,\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const started = Date.now();\n const requestId = requestContext().requestId() ?? randomId('ws');\n\n if (method === 'handleConnection' || method === 'afterInit') {\n emit('websocket.connected', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n namespace: this.estimateNamespace(args),\n connections: this.countConnections(instance),\n timestamp: Date.now(),\n } as GatewayConnectionPayload);\n }\n\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('received', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.receive:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n });\n }\n\n try {\n const result = await Promise.resolve(original.call(instance, ...args));\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('sent', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n status: 'ok',\n });\n }\n return result;\n } catch (err) {\n if (method === 'handleMessage' || method === 'handleEvent') {\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} error=${this.redactor.serialize(err)}`,\n status: 'error',\n });\n }\n throw err;\n }\n };\n }\n\n private emitMessage(\n direction: 'received' | 'sent',\n instance: any,\n args: any[],\n payload: unknown,\n requestId: string,\n startedAt: number,\n ): void {\n const preview = this.redactor.redact(payload);\n const serialized = this.redactor.serialize(payload);\n emit('websocket.message', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n event: this.estimateEvent(args),\n direction,\n payloadSize: Buffer.byteLength(serialized, 'utf8'),\n payloadPreview: preview,\n requestId,\n duration: Date.now() - startedAt,\n timestamp: Date.now(),\n } as GatewayMessagePayload);\n }\n\n private extractPayload(args: any[]): any {\n for (const arg of args) {\n if (arg && typeof arg === 'object' && !Buffer.isBuffer(arg) && !ArrayBuffer.isView(arg)) {\n return arg;\n }\n }\n return args[0];\n }\n\n private estimateEvent(args: any[]): string {\n const payload = this.extractPayload(args);\n if (!payload || typeof payload !== 'object') return 'message';\n return (payload.event as string) ?? (payload.type as string) ?? 'message';\n }\n\n private estimateNamespace(args: any[]): string {\n if (args.length > 0) {\n const first = args[0];\n if (first && typeof first === 'object' && first.namespace) return first.namespace;\n }\n return '/';\n }\n\n private countConnections(instance: any): number {\n try {\n if (instance.connections && typeof instance.connections === 'function') return instance.connections();\n if (instance.clients && typeof instance.clients === 'function') return instance.clients().size ?? 0;\n return 0;\n } catch {\n return 0;\n }\n }\n\n private estimateGatewayName(instance: any): string {\n return instance.constructor?.name ?? 'Gateway';\n }\n\n private getApp(): any {\n try {\n const ctx: any = this.ctxRaw;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/** Database instrumentation, best-effort provider detection. */\nexport class DatabaseInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach database hooks for detected clients. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n\n if (!this.config.capture.database) return () => cleanup.forEach((fn) => fn());\n\n if (this.tryAttachTypeOrm()) cleanup.push(this.detachTypeOrm());\n if (this.tryAttachPrisma()) cleanup.push(this.detachPrisma());\n if (this.tryAttachMongoose()) cleanup.push(this.detachMongoose());\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private tryAttachTypeOrm(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const dataSource = this.resolveTypeOrmDataSource(app);\n if (!dataSource) return false;\n\n if (typeof dataSource.query === 'function') {\n const originalQuery = dataSource.query.bind(dataSource);\n dataSource.__nestDevToolsOriginalQuery = originalQuery;\n dataSource.query = async (query: unknown, parameters?: unknown[]) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ?? []);\n try {\n const result = await originalQuery(query, parameters);\n this.endQuery(String(query), parameters ?? [], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(String(query), parameters ?? [], Date.now() - started, error);\n throw error;\n }\n };\n return true;\n }\n\n const listener = {\n beforeQuery: (query: string, parameters: unknown[]) => {\n this.startQuery(query, parameters);\n },\n afterQuery: (query: string, parameters: unknown[], durationMs: number) => {\n this.endQuery(query, parameters, durationMs);\n },\n };\n\n const sub = dataSource.subscriber;\n if (sub) {\n const before = sub.beforeQuery as ((q: string, p: unknown[]) => void) | undefined;\n const after = sub.afterQuery as ((q: string, p: unknown[], d: number) => void) | undefined;\n sub.beforeQuery = (q: string, p: unknown[]) => {\n try { before?.(q, p); } catch {}\n listener.beforeQuery(q, p);\n };\n sub.afterQuery = (q: string, p: unknown[], d: number) => {\n try { after?.(q, p, d); } catch {}\n listener.afterQuery(q, p, d);\n };\n } else {\n dataSource.subscriber = listener;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachTypeOrm(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const ds = this.resolveTypeOrmDataSource(app);\n if (!ds || !ds.subscriber) return;\n ds.subscriber = null;\n } catch {}\n };\n }\n\n private tryAttachPrisma(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return false;\n\n if (typeof prisma.$use === 'function') {\n prisma.$use(async (params: any, next: (args: any) => Promise<unknown>) => {\n const label = `${params.model ?? 'prisma'}.${params.action ?? 'query'}`;\n const started = Date.now();\n this.startQuery(label, [params.args]);\n try {\n const result = await next(params);\n this.endQuery(label, [params.args], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(label, [params.args], Date.now() - started, error);\n throw error;\n }\n });\n return true;\n }\n\n const original = prisma.$queryRaw ?? prisma.$executeRaw ?? null;\n if (!original) return false;\n\n const wrapped = (query: unknown, parameters?: unknown) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ? [parameters] : []);\n try {\n const result = original.call(prisma, query, parameters);\n if (result instanceof Promise) {\n return result.then((r) => {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return r;\n });\n }\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return result;\n } catch (err) {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started, err);\n throw err;\n }\n };\n\n prisma.$queryRaw = wrapped;\n prisma.$executeRaw = wrapped;\n return true;\n } catch {\n return false;\n }\n }\n\n private detachPrisma(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return;\n // restore original by removing wrapper and re-assigning? Not safe here.\n // We attempt a soft reset by clearing extension if possible.\n if (typeof prisma.$extends === 'function') prisma.$extends(prisma);\n } catch {}\n };\n }\n\n private tryAttachMongoose(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose) return false;\n\n const instrumentation = this;\n const hook = mongoose.plugin((schema: any, _name: string) => {\n if (!schema || typeof schema !== 'object') return;\n const hooks = schema.pre ?? null;\n if (typeof hooks !== 'function') return;\n const bound = hooks.bind(schema);\n if (!bound) return;\n const originalPre = bound as (method: string, fn: unknown) => void;\n schema.pre = function (method: string, fn: unknown) {\n if (method === 'find' || method === 'findOne' || method === 'findById' || method === 'aggregate' || method === 'countDocuments' || method === 'count') {\n const wrapped = async function (this: unknown, ...args: unknown[]) {\n const started = Date.now();\n const sql = `[Mongoose:${method}]`;\n instrumentation.startQuery(sql, args);\n try {\n const handler = fn as ((...args: unknown[]) => unknown) | null;\n if (!handler) return;\n const result = await handler.apply(this, args);\n instrumentation.endQuery(sql, args, Date.now() - started);\n return result;\n } catch (err) {\n instrumentation.endQuery(sql, args, Date.now() - started, err);\n throw err;\n }\n };\n originalPre(method, wrapped as unknown);\n } else {\n originalPre(method, fn as unknown);\n }\n };\n });\n\n if (typeof mongoose.plugin === 'function') mongoose.plugin(hook);\n return true;\n } catch {\n return false;\n }\n }\n\n private detachMongoose(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose || typeof mongoose.plugin !== 'function') return;\n // Soft reset: re-plugin empty to override previous plugin?\n // Not safe to undo; we leave best-effort.\n } catch {}\n };\n }\n\n private startQuery(sql: string, parameters: unknown[]): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n recordSpan(requestId, 'database', sql.slice(0, 120), {\n detail: `provider=${this.providerLabel()} parameters=${this.redactor.serialize(parameters)}`,\n });\n }\n\n private endQuery(\n sql: string,\n parameters: unknown[],\n durationMs: number,\n error?: unknown,\n ): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n const payload = {\n requestId,\n projectId: this.projectId,\n provider: this.providerLabel() as any,\n sql: sql.slice(0, 2000),\n duration: durationMs,\n parameters: this.redactor.redact(parameters),\n timestamp: Date.now(),\n };\n emit('query.executed', payload as any);\n }\n\n private providerLabel(): string {\n if (this.isTypeOrm()) return 'typeorm';\n if (this.isPrisma()) return 'prisma';\n if (this.isMongoose()) return 'mongoose';\n return 'other';\n }\n\n private isTypeOrm(): boolean {\n return !!this.resolveTypeOrmDataSource(this.getApp());\n }\n\n private isPrisma(): boolean {\n return !!this.resolvePrismaClient(this.getApp());\n }\n\n private isMongoose(): boolean {\n return !!this.resolveMongoose(this.getApp());\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctxRaw as any;\n if (ctx && typeof ctx === 'object' && (ctx as any).app) return (ctx as any).app;\n if (ctx && typeof ctx === 'object' && (ctx as any).getHttpAdapter) {\n return ctx as any;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveTypeOrmDataSource(app: any): any {\n try {\n const dataSource = this.findProvider(app, (value) => typeof value?.query === 'function' && typeof value?.manager === 'object');\n if (dataSource) return dataSource;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolvePrismaClient(app: any): any {\n try {\n const prisma = this.safeGet(app, 'PrismaService')\n ?? this.safeGet(app, 'PrismaClient')\n ?? this.safeGet(app, 'prisma')\n ?? this.findProvider(app, (value) => typeof value?.$queryRaw === 'function');\n if (prisma && typeof prisma.$queryRaw === 'function') return prisma;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveMongoose(app: any): any {\n try {\n const mongoose = this.safeGet(app, 'MongooseService')\n ?? this.safeGet(app, 'Mongoose')\n ?? this.safeGet(app, 'mongoose')\n ?? this.findProvider(app, (value) => typeof value?.plugin === 'function');\n if (mongoose && typeof mongoose.plugin === 'function') return mongoose;\n return null;\n } catch {\n return null;\n }\n }\n\n private safeGet(app: any, token: string): any {\n try {\n return app?.get?.(token, { strict: false }) ?? null;\n } catch {\n return null;\n }\n }\n\n private findProvider(app: any, predicate: (value: any) => boolean): any {\n try {\n const modules = app?.container?.getModules?.() ?? new Map();\n for (const module of modules.values()) {\n for (const wrapper of (module.providers?.values?.() ?? [])) {\n const instance = wrapper?.instance;\n if (instance && predicate(instance)) return instance;\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\n\n/** Queue/event instrumentation, best-effort and opt-in. */\nexport class QueueEventInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctx: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctx = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach queue hooks if a supported client is detected. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.requests && !this.config.capture.logs && !this.config.capture.errors) {\n return () => cleanup.forEach((fn) => fn());\n }\n\n if (this.tryAttachBull()) cleanup.push(this.detachBull());\n return () => cleanup.forEach((fn) => fn());\n }\n\n /** Register a queue span correlated with the active request, if any. */\n static recordJobSpan(\n queueName: string,\n jobId: string,\n label: string,\n options?: { source?: SourceLocation; status?: 'ok' | 'error' },\n ): void {\n const requestId = requestContext().requestId() ?? randomId('queue');\n recordSpan(requestId, 'queue', `${queueName}:${label} (${jobId})`, {\n detail: `queue=${queueName} job=${jobId}`,\n source: options?.source,\n status: options?.status,\n } as any);\n }\n\n /** Emit a log for queue events, correlated with the active request if any. */\n static emitJobLog(\n queueName: string,\n jobId: string,\n level: 'debug' | 'info' | 'warn' | 'error' | 'verbose',\n message: string,\n options?: { source?: SourceLocation },\n ): void {\n const requestId = requestContext().requestId();\n emit('log.created', {\n requestId,\n projectId: undefined,\n level,\n message: `[${queueName}] ${message} (${jobId})`,\n source: options?.source,\n context: queueName,\n processId: process.pid,\n timestamp: Date.now(),\n } as any);\n }\n\n private tryAttachBull(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const bull = this.resolveBull(app);\n if (!bull) return false;\n\n const origProcess = bull.prototype?.process ?? bull.process;\n if (typeof origProcess === 'function') {\n const wrapped = this.wrapProcess(origProcess, bull);\n if (bull.prototype) bull.prototype.process = wrapped;\n bull.process = wrapped;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachBull(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const bull = this.resolveBull(app);\n if (!bull) return;\n // Not safe to restore reliably; best-effort no-op.\n } catch {}\n };\n }\n\n private wrapProcess(original: Function, bull: any): Function {\n return async function (this: any, ...args: any[]) {\n const handler = args[0];\n if (!handler || typeof handler !== 'function') return original.apply(this, args);\n\n const wrapped = async (...handlerArgs: any[]) => {\n const job = handlerArgs[0];\n if (!job || typeof job !== 'object') return handler.apply(this, handlerArgs);\n\n const jobId = job.id ?? job.data?.jobId ?? randomId('job');\n const queueName = job.queueName ?? this.estimateQueueName(bull);\n const started = Date.now();\n\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', { status: 'ok' });\n try {\n const result = await Promise.resolve(handler.apply(this, handlerArgs));\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'ok',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'info', 'job completed', {\n source: resolveSourceLocation(new Error(), { skip: 2 }),\n });\n return result;\n } catch (err) {\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'error',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'error', String(err), {\n source: resolveSourceLocation(err instanceof Error ? err : new Error(), { skip: 2 }),\n });\n throw err;\n }\n };\n\n return original.apply(this, [wrapped, ...args.slice(1)]);\n };\n }\n\n private estimateQueueName(bull: any): string {\n try {\n if (bull.name) return bull.name;\n if (typeof bull === 'function') return bull.name;\n return 'queue';\n } catch {\n return 'queue';\n }\n }\n\n private resolveBull(app: any): any {\n try {\n const bull = app.get('BullService') ?? app.get('Bull') ?? app.get('bull') ?? app.get('Queue') ?? null;\n if (bull && (typeof bull.process === 'function' || typeof bull.prototype?.process === 'function')) return bull;\n return null;\n } catch {\n return null;\n }\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctx as any;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import { existsSync, readFileSync } from 'fs';\nimport { resolve } from 'path';\n\nlet cached: string | null | undefined;\n\n/** Best-effort detection of the host app's @nestjs/core version. */\nexport function detectNestJsVersion(): string | null {\n if (cached !== undefined) return cached;\n cached = null;\n try {\n const candidates = [\n resolve(process.cwd(), 'node_modules/@nestjs/core/package.json'),\n // bun/pnpm layouts: walk up a couple of levels\n resolve(process.cwd(), '../../node_modules/@nestjs/core/package.json'),\n ];\n for (const path of candidates) {\n if (!existsSync(path)) continue;\n const pkg = JSON.parse(readFileSync(path, 'utf8')) as { version?: string };\n if (pkg.version) {\n cached = pkg.version;\n break;\n }\n }\n } catch {\n cached = null;\n }\n return cached;\n}\n","/** SDK version reported to the DevTools server. Keep in sync with package.json. */\nexport const SDK_VERSION = '1.0.9';\n","import { writeOriginalConsole } from './instrumentation/console';\n\n/** ANSI escape helpers (kept tiny and dependency-free, mirrors the CLI renderer). */\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst WIDTH = 47;\n\nfunction colorEnabled(): boolean {\n // Respect NO_COLOR / non-TTY output the same way most CLIs do.\n if (process.env['NO_COLOR']) return false;\n return Boolean(process.stdout?.isTTY);\n}\n\nfunction paint(color: string, text: string): string {\n return colorEnabled() ? `${color}${text}${RESET}` : text;\n}\n\nfunction pad(label: string, value: string): string {\n const line = ` ${paint(GRAY, label.padEnd(9))} ${paint(CYAN, value)}`;\n return line;\n}\n\n/** Prints the boxed \"SDK started\" banner once, right after init(). */\nexport function printStartupBanner(info: { endpoint: string; dashboard: string; project: string }): void {\n const top = `${paint(GRAY, '┌' + '─'.repeat(WIDTH) + '┐')}`;\n const bottom = `${paint(GRAY, '└' + '─'.repeat(WIDTH) + '┘')}`;\n const title = ` ${paint(BOLD + CYAN, 'NestJS DevTools')} ${paint(GREEN, '●')} ${paint(DIM, `(${info.project})`)}`;\n\n writeOriginalConsole('log', '');\n writeOriginalConsole('log', top);\n writeOriginalConsole('log', title);\n writeOriginalConsole('log', pad('Endpoint', info.endpoint));\n writeOriginalConsole('log', pad('Dashboard', info.dashboard));\n writeOriginalConsole('log', `${paint(GRAY, ' Estado')} ${paint(YELLOW, '◌ conectando…')}`);\n writeOriginalConsole('log', bottom);\n}\n\n/** Prints a single status line once the transport's connection state is known. */\nexport function printConnectionStatus(state: 'open' | 'offline', dashboard: string): void {\n if (state === 'open') {\n writeOriginalConsole('log', ` ${paint(GREEN, '✓')} Conectado al dashboard ${paint(DIM, `(${dashboard})`)}`);\n return;\n }\n writeOriginalConsole('log', ` ${paint(YELLOW, '⚠')} No se pudo conectar al dashboard todavía.`);\n writeOriginalConsole('log', ` ${paint(DIM, '¿Aún no lo instalaste? →')} ${paint(BOLD, 'bun add -g @angelitosystems/nest-devtools-cli')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Luego, en otra terminal: →')} ${paint(BOLD, 'nest-devtools start')}`);\n writeOriginalConsole('log', ` ${paint(DIM, '(sin instalar, una sola vez: npx -p @angelitosystems/nest-devtools-cli nest-devtools start)')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Reintentando en segundo plano — se conectará solo cuando el dashboard esté arriba.')}`);\n}","import type { INestApplication } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { emit } from './emitter';\n\nexport interface PluginContext {\n readonly config: DevToolsConfig;\n readonly project: ProjectInfo;\n readonly redactor: Redactor;\n emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void;\n custom(name: string, data?: unknown): void;\n}\n\nexport interface DevToolsPlugin {\n readonly name: string;\n onInit?(context: PluginContext): void | Promise<void>;\n onAttach?(app: INestApplication, context: PluginContext): void | (() => void) | Promise<void | (() => void)>;\n onDispose?(): void | Promise<void>;\n}\n\n/** Runs third-party instrumentation without allowing it to affect the app. */\nexport class PluginManager {\n private readonly cleanups: Array<() => void> = [];\n private readonly initialized: DevToolsPlugin[] = [];\n\n constructor(private readonly plugins: DevToolsPlugin[]) {}\n\n attach(app: INestApplication, config: DevToolsConfig, project: ProjectInfo): () => void {\n const redactor = new Redactor({ redact: config.redact, allow: config.allow, maxBytes: config.maxPayloadBytes });\n const context: PluginContext = {\n config,\n project,\n redactor,\n emit: (event, payload) => {\n try { emit(event, redactor.redact(payload) as DevToolsEventMap[typeof event]); } catch { /* plugin isolation */ }\n },\n custom: (name, data) => {\n try {\n emit('plugin.event', {\n projectId: project.projectId,\n plugin: 'custom',\n name,\n data: redactor.redact(data),\n timestamp: Date.now(),\n });\n } catch { /* plugin isolation */ }\n },\n };\n\n for (const plugin of this.plugins) {\n if (!plugin || !plugin.name) continue;\n this.initialized.push(plugin);\n this.run(plugin.name, () => plugin.onInit?.(context));\n this.run(plugin.name, async () => {\n const cleanup = await plugin.onAttach?.(app, context);\n if (typeof cleanup === 'function') this.cleanups.push(cleanup);\n });\n }\n\n return () => {\n for (const cleanup of this.cleanups.splice(0)) {\n try { cleanup(); } catch { /* plugin isolation */ }\n }\n for (const plugin of this.initialized.splice(0)) this.run(plugin.name, () => plugin.onDispose?.());\n };\n }\n\n private run(name: string, operation: () => void | Promise<void>): void {\n try {\n const result = operation();\n if (result && typeof (result as Promise<void>).then === 'function') {\n void (result as Promise<void>).catch((error) => this.reportFailure(name, error));\n }\n } catch (error) {\n this.reportFailure(name, error);\n }\n }\n\n private reportFailure(name: string, error: unknown): void {\n try {\n emit('log.created', {\n projectId: 'plugin-system',\n level: 'error',\n message: `DevTools plugin ${name} failed: ${error instanceof Error ? error.message : String(error)}`,\n processId: process.pid,\n timestamp: Date.now(),\n context: 'plugin',\n });\n } catch { /* plugin isolation */ }\n }\n}\n"],"mappings":"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","names":["import_devtools_core","import_devtools_core","coreDevtools","capture","import_devtools_protocol","import_devtools_core","import_devtools_protocol","import_devtools_core","import_devtools_core","import_devtools_core","import_devtools_protocol","import_devtools_core","import_devtools_protocol","module","import_devtools_core","import_devtools_protocol","import_devtools_core","import_path","import_devtools_protocol","coreDevtools","import_devtools_core"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/sdk.ts","../src/instrumentation/http.ts","../src/emitter.ts","../src/instrumentation/timeline.ts","../src/instrumentation/console.ts","../src/instrumentation/nest-logger.ts","../src/instrumentation/exceptions.ts","../src/instrumentation/performance.ts","../src/instrumentation/app-explorer.ts","../src/instrumentation/websockets.ts","../src/instrumentation/database.ts","../src/instrumentation/queue.ts","../src/detect.ts","../src/version.ts","../src/banner.ts","../src/plugins.ts"],"sourcesContent":["/**\n * @angelitosystems/nest-devtools\n *\n * Drop-in real-time debugging and observability for NestJS.\n *\n * Usage:\n * import { NestDevTools } from '@angelitosystems/nest-devtools';\n * const app = await NestFactory.create(AppModule);\n * NestDevTools.init(app);\n */\nexport { NestDevTools, devtools } from './sdk';\nexport type { InitResult, NestDevToolsOptions } from './sdk';\nexport { PluginManager } from './plugins';\nexport type { DevToolsPlugin, PluginContext } from './plugins';\nexport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\nexport { captureError } from './instrumentation/exceptions';\nexport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nexport { requestContext } from '@angelitosystems/devtools-core';\nexport type { RequestContext } from '@angelitosystems/devtools-core';\n","import { hostname } from 'os';\nimport { devtools as coreDevtools, resolveConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { HttpInstrumentation } from './instrumentation/http';\nimport { ConsoleInstrumentation } from './instrumentation/console';\nimport { LoggerInstrumentation } from './instrumentation/nest-logger';\nimport { ExceptionsInstrumentation, captureError } from './instrumentation/exceptions';\nimport { PerformanceInstrumentation } from './instrumentation/performance';\nimport { AppExplorer } from './instrumentation/app-explorer';\nimport { WebsocketInstrumentation } from './instrumentation/websockets';\nimport { DatabaseInstrumentation } from './instrumentation/database';\nimport { QueueEventInstrumentation } from './instrumentation/queue';\nimport { detectNestJsVersion } from './detect';\nimport { SDK_VERSION } from './version';\nimport { printStartupBanner, printConnectionStatus } from './banner';\nimport { PluginManager } from './plugins';\nimport type { DevToolsPlugin } from './plugins';\nimport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\n\n/** Result of calling NestDevTools.init(). */\nexport interface InitResult {\n /** True when instrumentation is live. */\n enabled: boolean;\n /** Reason when partially or fully disabled. */\n reason?: 'disabled-by-config' | 'already-initialized' | 'no-http-adapter';\n projectId: string;\n projectName: string;\n server: string;\n}\n\nexport type NestDevToolsOptions = DevToolsUserConfig & { plugins?: DevToolsPlugin[] };\n\n/**\n * Main entry point: `NestDevTools.init(app, config?)`.\n *\n * Never throws, never blocks startup, and disables itself in production\n * unless explicitly enabled.\n */\nexport class NestDevTools {\n private static readonly cleanups: Array<() => void> = [];\n private static initialized = false;\n\n /** Initialize DevTools for a NestJS application. One active instance per process. */\n static init(app: INestApplication, userConfig?: NestDevToolsOptions): InitResult {\n const config = resolveConfig(userConfig);\n const disabled: InitResult = {\n enabled: false,\n reason: 'disabled-by-config',\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n server: config.server,\n };\n\n if (this.initialized) return { ...disabled, reason: 'already-initialized' };\n if (!config.enabled) return disabled; // zero side effects: no patching, no sockets, no timers\n\n this.initialized = true;\n const registerCleanup = (fn: () => void) => this.cleanups.push(fn);\n\n const projectInfo: ProjectInfo = {\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n environment: config.environment,\n hostname: safeHostname(),\n port: null,\n pid: process.pid,\n runtime: detectRuntime(),\n runtimeVersion: detectRuntimeVersion(),\n nodeVersion: process.version,\n nestjsVersion: detectNestJsVersion(),\n sdkVersion: SDK_VERSION,\n };\n\n // transport is fully async: a missing server never affects startup\n let hasWarnedOffline = false;\n coreDevtools.initialize({\n config,\n projectInfo,\n registerCleanup,\n onStateChange: (state: any) => {\n if (state === 'open') {\n printConnectionStatus('open', dashboardUrl(config.server));\n } else if (state === 'retrying' && !hasWarnedOffline) {\n hasWarnedOffline = true;\n printConnectionStatus('offline', dashboardUrl(config.server));\n }\n },\n } as any);\n\n if (userConfig?.plugins && userConfig.plugins.length > 0) {\n registerCleanup(new PluginManager(userConfig.plugins).attach(app, config, projectInfo));\n }\n\n const adapter = app.getHttpAdapter();\n const httpReady = Boolean(adapter && ['http', 'express'].includes(adapter.getType()));\n\n // ---- HTTP instrumentation -------------------------------------------\n const http = new HttpInstrumentation({ config, projectInfo });\n registerCleanup(http.attach(app));\n\n // ---- console + NestJS Logger + global errors ------------------------\n registerCleanup(new ConsoleInstrumentation({ config, projectInfo }).attach());\n registerCleanup(new LoggerInstrumentation({ config, projectInfo }).attach());\n registerCleanup(ExceptionsInstrumentation.attach({ config, projectInfo }));\n\n // ---- performance sampling -------------------------------------------\n registerCleanup(new PerformanceInstrumentation({ config, projectInfo }).attach());\n\n // ---- application graph ----------------------------------------------\n registerCleanup(new AppExplorer({ config, projectInfo }).attach(app));\n\n // ---- websockets + database + queues (best effort) ------------------\n if (config.capture.websockets) {\n registerCleanup(new WebsocketInstrumentation({ config, projectInfo }).attach());\n }\n if (config.capture.database) {\n registerCleanup(new DatabaseInstrumentation({ config, projectInfo }).attach());\n }\n registerCleanup(new QueueEventInstrumentation({ config, projectInfo }).attach());\n\n printStartupBanner({\n endpoint: config.server,\n dashboard: dashboardUrl(config.server),\n project: projectInfo.projectName,\n });\n\n return {\n enabled: true,\n projectId: config.projectId,\n projectName: projectInfo.projectName,\n server: config.server,\n ...(httpReady ? {} : { reason: 'no-http-adapter' as const }),\n };\n }\n\n /** Teardown everything (mostly useful in tests). */\n static destroy(): void {\n for (const cleanup of this.cleanups.splice(0)) {\n try {\n cleanup();\n } catch {\n /* ignore */\n }\n }\n this.initialized = false;\n coreDevtools.shutdown();\n }\n\n /** Whether the SDK is currently active in this process. */\n static isActive(): boolean {\n return this.initialized;\n }\n\n /** Start an explicit CPU or heap profile. */\n static startProfile(kind: ProfileKind): Promise<{ profileId: string; startedAt: number }> {\n return coreDevtools.startProfile(kind);\n }\n\n /** Stop the active profile and return its captured result. */\n static stopProfile(): Promise<ProfileResult> {\n return coreDevtools.stopProfile();\n }\n}\n\n/** Convenience functional alias: devtools.init(app). */\nexport const devtools = {\n init: NestDevTools.init.bind(NestDevTools),\n destroy: NestDevTools.destroy.bind(NestDevTools),\n isActive: NestDevTools.isActive.bind(NestDevTools),\n startProfile: NestDevTools.startProfile.bind(NestDevTools),\n stopProfile: NestDevTools.stopProfile.bind(NestDevTools),\n};\n\nfunction safeHostname(): string {\n try {\n return hostname();\n } catch {\n return 'unknown';\n }\n}\n\nfunction detectRuntime(): string {\n const versions = process.versions as Record<string, string | undefined>;\n if (versions['bun']) return 'bun';\n if (versions['deno']) return 'deno';\n return 'node';\n}\n\nfunction detectRuntimeVersion(): string {\n const versions = process.versions as Record<string, string | undefined>;\n return versions['bun'] ?? versions['deno'] ?? process.version;\n}\n\nfunction dashboardUrl(server: string): string {\n try {\n const url = new URL(server);\n url.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';\n const port = Number(url.port);\n url.port = String(Number.isFinite(port) && port > 0 ? port - 1 : 4317);\n url.pathname = '';\n url.search = '';\n url.hash = '';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return 'http://localhost:4317';\n }\n}\n\nexport { captureError };","import type { IncomingMessage, ServerResponse, Server as HttpServer } from 'http';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport type {\n ProjectInfo,\n RequestCompletedPayload,\n RequestStartedPayload,\n TimelineSpan,\n} from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { recordSpan, trackSpans } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\n/** Shared context every instrumentation module receives. */\nexport interface InstrumentationContext {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n}\n\n/** Request headers captured by default (denylist still applies). */\nconst REQUEST_HEADERS = [\n 'content-type',\n 'content-length',\n 'accept',\n 'origin',\n 'referer',\n 'user-agent',\n 'x-forwarded-for',\n 'x-request-id',\n 'x-forwarded-proto',\n] as const;\n\n/** Response headers captured by default. */\nconst RESPONSE_HEADERS = [\n 'content-type',\n 'content-length',\n 'location',\n 'set-cookie',\n 'x-request-id',\n 'x-response-time',\n] as const;\n\ntype RequestListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst WRAPPED = Symbol('nest-devtools.wrapped');\n\n/**\n * Instrument the HTTP server of a NestJS application.\n *\n * Covers both bootstrap orders without touching Node module internals:\n * - `NestDevTools.init(app)` after `app.listen()`: the server already exists\n * and is wrapped immediately.\n * - `NestDevTools.init(app)` before `app.listen()` (recommended): `app.listen`\n * is wrapped so the server is wrapped the moment it exists.\n */\nexport class HttpInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: InstrumentationContext) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Begin capturing HTTP requests. Returns a cleanup function. */\n attach(app: INestApplication): () => void {\n try {\n const adapter = app.getHttpAdapter();\n // 'http' = platform-default adapter, 'express' = @nestjs/platform-express\n if (!adapter || !['http', 'express'].includes(adapter.getType())) return () => {};\n\n const getServer = (): HttpServer | undefined =>\n (adapter as unknown as { getHttpServer?: () => HttpServer }).getHttpServer?.();\n\n // 1) server already exists (init called after listen)\n const existing = getServer();\n if (existing) {\n this.wrapServer(existing);\n return () => {};\n }\n\n // 2) init called before listen: wrap the server once listen() resolves\n const appLike = app as unknown as { listen: (...args: unknown[]) => unknown };\n const originalListen = appLike.listen.bind(app);\n const self = this;\n const patchedListen = (...args: unknown[]) => {\n const result = originalListen(...args);\n Promise.resolve(result)\n .then(() => {\n const server = getServer();\n if (server) self.wrapServer(server);\n })\n .catch(() => {\n /* listen failed — the app will surface its own error */\n });\n return result;\n };\n appLike.listen = patchedListen;\n\n return () => {\n appLike.listen = originalListen;\n };\n } catch {\n return () => {};\n }\n }\n\n /** Wrap the 'request' listeners of a server exactly once. */\n private wrapServer(server: HttpServer): void {\n const target = server as unknown as Record<symbol, unknown>;\n if (target[WRAPPED]) return;\n target[WRAPPED] = true;\n\n const self = this;\n const originalListeners = server.rawListeners('request') as RequestListener[];\n\n server.removeAllListeners('request');\n server.on('request', (req, res) => {\n self.instrumentRequest(req, res, () => {\n for (const listener of originalListeners) {\n listener.call(server, req, res);\n }\n });\n });\n }\n\n /** Wrap a single request lifecycle. */\n private instrumentRequest(req: IncomingMessage, res: ServerResponse, next: () => void): void {\n if (!this.ctx.config.capture.requests) {\n next();\n return;\n }\n\n const startedAt = Date.now();\n const requestId = randomId('req');\n const method = (req.method ?? 'GET').toUpperCase();\n const rawUrl = req.url ?? '/';\n const url = safeUrlPath(rawUrl);\n\n const spans: TimelineSpan[] = [];\n const unregister = trackSpans(requestId, spans);\n res.once('finish', unregister);\n\n const started: RequestStartedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n headers: this.collectRequestHeaders(req),\n query: parseQuery(rawUrl),\n ip: clientIp(req),\n userAgent: asString(req.headers['user-agent']) || undefined,\n startedAt,\n };\n\n const middlewareSpan: TimelineSpan = {\n layer: 'middleware',\n label: `${method} ${url}`,\n duration: 0,\n startedAt,\n status: 'ok',\n };\n spans.push(middlewareSpan);\n\n const capturedBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n const responseCapture = createResponseCapture(res, this.ctx.config.maxPayloadBytes, this.redactor);\n\n const onFinished = () => {\n const finishedAt = Date.now();\n middlewareSpan.duration = Math.max(0, finishedAt - middlewareSpan.startedAt);\n middlewareSpan.status = res.statusCode >= 500 ? 'error' : 'ok';\n\n const responseSpan: TimelineSpan = {\n layer: 'response',\n label: 'response',\n duration: 0,\n startedAt: finishedAt,\n status: res.statusCode >= 400 ? 'error' : 'ok',\n };\n spans.push(responseSpan);\n\n const responseHeaders = this.collectResponseHeaders(res);\n const responsePreview = responseCapture.read();\n const requestBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n\n const errored = res.statusCode >= 500;\n\n const completed: RequestCompletedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n statusCode: res.statusCode,\n duration: finishedAt - startedAt,\n startedAt,\n timeline: spans,\n requestHeaders: started.headers,\n query: parseQuery(rawUrl),\n headers: responseHeaders,\n responsePreview,\n requestBody: requestBody ?? capturedBody,\n errored,\n };\n\n emit('request.completed', completed);\n\n // NestJS exception filters turn controller errors into 5xx responses\n // without any process-level signal — surface them in the Error Explorer.\n if (errored) {\n emit('error.created', {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n name: 'HttpError',\n message: `${method} ${url} failed with status ${res.statusCode}`,\n fingerprint: httpErrorFingerprint(method, url, res.statusCode),\n request: { method, url: String(url), statusCode: res.statusCode },\n timestamp: finishedAt,\n });\n }\n };\n\n const context = requestContext();\n context.run({ requestId, method, url, startedAt }, () => {\n emit('request.started', started);\n res.once('finish', onFinished);\n next();\n });\n }\n\n private collectRequestHeaders(req: IncomingMessage): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : asString(value).slice(0, 200);\n }\n return out;\n }\n\n private collectResponseHeaders(res: ServerResponse): Record<string, string> {\n const out: Record<string, string> = {};\n const headers = typeof res.getHeaders === 'function' ? res.getHeaders() : {};\n\n for (const rawKey of Object.keys(headers)) {\n const key = rawKey.toLowerCase();\n const raw = headers[rawKey] as string | number | string[] | undefined ?? '';\n const value = String(raw);\n if (value === '') continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : value.slice(0, 200);\n }\n return out;\n }\n}\n\nfunction asString(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value.join(', ');\n return value ?? '';\n}\n\n/** Stable fingerprint for framework-handled HTTP failures. */\nfunction httpErrorFingerprint(method: string, url: string, statusCode: number): string {\n const route = url.replace(/\\/\\d+(?=\\/|$)/g, '/:id'); // group /users/15 with /users/16\n const raw = `${method}::${route}::${statusCode}`;\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction safeUrlPath(raw: string): string {\n const index = raw.indexOf('?');\n return index === -1 ? raw : raw.slice(0, index);\n}\n\nfunction parseQuery(raw: string): Record<string, unknown> {\n const index = raw.indexOf('?');\n if (index === -1) return {};\n const out: Record<string, unknown> = {};\n for (const [key, value] of new URLSearchParams(raw.slice(index + 1))) {\n out[key] = value;\n }\n return out;\n}\n\nfunction clientIp(req: IncomingMessage): string | undefined {\n const forwarded = req.headers['x-forwarded-for'];\n if (typeof forwarded === 'string') return forwarded.split(',')[0]?.trim();\n return req.socket?.remoteAddress ?? undefined;\n}\n\n/** Best-effort route extraction from Express/Nest request. */\nfunction routeFromReq(req: IncomingMessage): string | undefined {\n try {\n const http = req as unknown as { httpVersion?: string };\n const out: RequestStartedPayload = {\n requestId: '',\n projectId: '',\n method: '',\n url: '',\n route: undefined,\n headers: {},\n query: {},\n ip: undefined,\n userAgent: undefined,\n startedAt: 0,\n };\n const routeRaw: unknown = (req as unknown as Record<string, unknown>).route;\n if (routeRaw && typeof routeRaw === 'object' && routeRaw !== null) {\n const route = routeRaw as { name?: unknown };\n const name = route.name as string | undefined;\n if (typeof name === 'string' && name.length > 0) return name;\n }\n const path = (req as unknown as { baseUrl?: string }).baseUrl\n ?? (req as any).path;\n if (typeof path === 'string' && path.length > 0) return path;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the request body (limited, redacted). */\nfunction captureRequestPreview(req: IncomingMessage, redactor: Redactor): unknown {\n try {\n const body = (req as unknown as Record<string, unknown>).body;\n if (body === undefined || body === null) return undefined;\n return redactor.redact(body);\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the response body after the response finishes. */\nfunction captureResponsePreview(res: ServerResponse, redactor: Redactor): string | undefined {\n try {\n const resLike = res as unknown as Record<string, unknown>;\n const body = resLike.body;\n if (body === undefined || body === null) return undefined;\n if (typeof body === 'string') return redactor.redactString(body);\n return redactor.serialize(body);\n } catch {\n return undefined;\n }\n}\n\nfunction createResponseCapture(\n res: ServerResponse,\n maxBytes: number,\n redactor: Redactor,\n): { read: () => string | undefined } {\n if (maxBytes <= 0) return { read: () => undefined };\n const chunks: Buffer[] = [];\n let size = 0;\n const originalWrite = res.write.bind(res);\n const originalEnd = res.end.bind(res);\n const capture = (chunk: unknown): void => {\n if (chunk === undefined || chunk === null || size >= maxBytes) return;\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n const remaining = maxBytes - size;\n chunks.push(buffer.subarray(0, remaining));\n size += Math.min(buffer.length, remaining);\n };\n (res as any).write = (chunk: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalWrite(chunk as any, ...(args as any));\n };\n (res as any).end = (chunk?: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalEnd(chunk as any, ...(args as any));\n };\n res.once('finish', () => {\n (res as any).write = originalWrite;\n (res as any).end = originalEnd;\n });\n return {\n read: () => {\n if (chunks.length === 0) return undefined;\n const raw = Buffer.concat(chunks).toString('utf8');\n return redactor.redactString(raw);\n },\n };\n}\n\nexport { safeUrlPath, parseQuery, clientIp, routeFromReq };\n","import { devtools as coreDevtools } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName } from '@angelitosystems/devtools-protocol';\n\n/** Emit a typed protocol event to the DevTools server (fire-and-forget). */\nexport function emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void {\n try {\n coreDevtools.send(event, payload);\n } catch {\n /* instrumentation must never break the app */\n }\n}\n","import type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\n\n/** Create a started span inside a request's span list. */\nexport function startSpan(\n spans: TimelineSpan[],\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): TimelineSpan {\n const span: TimelineSpan = {\n layer,\n label,\n duration: 0,\n startedAt: Date.now(),\n status: options?.status ?? 'ok',\n ...(options?.detail !== undefined ? { detail: options.detail } : {}),\n ...(options?.source !== undefined ? { source: options.source } : {}),\n };\n spans.push(span);\n return span;\n}\n\n/** Finalize a span, computing its duration. */\nexport function endSpan(span: TimelineSpan, status?: 'ok' | 'error'): void {\n span.duration = Math.max(0, Date.now() - span.startedAt);\n if (status) span.status = status;\n}\n\n/**\n * Registry of active request timelines, keyed by requestId.\n * Lets deeper instrumentation (database, websockets) attach spans to the\n * request that caused them, using the AsyncLocalStorage request id.\n */\nconst recorders = new Map<string, TimelineSpan[]>();\n\n/** Register a request's span list. Returns an unregister callback. */\nexport function trackSpans(requestId: string, spans: TimelineSpan[]): () => void {\n recorders.set(requestId, spans);\n return () => recorders.delete(requestId);\n}\n\n/** Add an auto-ended span to a request if it is still active. */\nexport function recordSpan(\n requestId: string,\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): void {\n const spans = recorders.get(requestId);\n if (!spans) return;\n const span = startSpan(spans, layer, label, options);\n endSpan(span, options?.status);\n}\n","import { Console } from 'console';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\nconst METHODS = ['log', 'info', 'warn', 'error', 'debug'] as const;\ntype ConsoleMethod = (typeof METHODS)[number];\n\nconst LEVEL_BY_METHOD: Record<ConsoleMethod, LogLevel> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n debug: 'debug',\n};\n\n/** Original console bound directly to the process streams. */\nconst originalConsole = new Console({\n stdout: process.stdout,\n stderr: process.stderr,\n colorMode: 'auto',\n});\n\n/** Write through the untouched console (used by DevTools' own logging). */\nexport function writeOriginalConsole(method: ConsoleMethod, ...args: unknown[]): void {\n const fn = (originalConsole as unknown as Record<string, (...a: unknown[]) => void>)[method];\n if (fn) fn.apply(originalConsole, args);\n}\n\n/** Capture console output and mirror it to DevTools. */\nexport class ConsoleInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Patch console methods. Returns a restore function. */\n attach(): () => void {\n const self = this;\n const restores: Array<() => void> = [];\n\n for (const method of METHODS) {\n const original = (console as unknown as Record<string, unknown>)[method];\n if (typeof original !== 'function') continue;\n\n const patched = (...args: unknown[]) => {\n try {\n (original as (...a: unknown[]) => void).apply(console, args);\n } catch {\n /* never break host logging */\n }\n self.capture(method, args);\n };\n\n (console as unknown as Record<string, unknown>)[method] = patched;\n restores.push(() => {\n (console as unknown as Record<string, unknown>)[method] = original;\n });\n }\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n\n private capture(method: ConsoleMethod, args: unknown[]): void {\n if (!this.ctx.config.capture.logs) return;\n try {\n const level = LEVEL_BY_METHOD[method];\n const payload: LogPayload = {\n projectId: this.ctx.projectInfo.projectId,\n level,\n message: formatMessage(args, this.redactor),\n arguments: args.length > 0 ? (this.redactor.redact(args) as unknown[]) : undefined,\n stack: method === 'error' ? captureStack() : undefined,\n source: resolveSourceLocation(captureStack() ?? '', { skip: 0 }),\n context: undefined,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n if (method === 'error') payload.level = 'error';\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n }\n}\n\nfunction formatMessage(args: unknown[], redactor: Redactor): string {\n if (args.length === 0) return '';\n const first = args[0];\n if (typeof first === 'string') {\n return args.length === 1 ? redactor.redactString(first) : `${first} ${redactor.serialize(args.slice(1))}`;\n }\n return redactor.serialize(args);\n}\n\nfunction captureStack(): string | undefined {\n const err = new Error();\n const stack = err.stack;\n if (!stack) return undefined;\n // drop the frames created by this helper\n return stack.split('\\n').slice(3).join('\\n');\n}\n","import { Logger } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\n/**\n * Captures NestJS framework logs (`new Logger('Ctx').log(...)` and the static\n * `Logger.log(...)` variants). Nest's Logger writes through process.stdout\n * internals, not console.*, so it needs its own hook.\n *\n * State is module-scoped on purpose: the patched methods are plain functions\n * and must never depend on class-instance `this` binding.\n */\nlet activeRedactor = new Redactor();\nlet activeConfig: DevToolsConfig | null = null;\nlet activeProjectId = '';\n\nfunction capture(level: LogLevel, message: unknown, context?: string, stack?: string): void {\n try {\n if (!activeConfig?.capture.logs) return;\n const text = typeof message === 'string' ? message : activeRedactor.serialize(message);\n const payload: LogPayload = {\n projectId: activeProjectId,\n level,\n message: activeRedactor.redactString(text),\n source: stack ? undefined : resolveSdkAwareLocation(),\n context,\n stack,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\n/** Captures NestJS Logger output and mirrors it to DevTools. */\nexport class LoggerInstrumentation {\n constructor(ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n activeRedactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n activeConfig = ctx.config;\n activeProjectId = ctx.projectInfo.projectId;\n }\n\n /** Patch Logger.prototype and the static Logger methods. Returns a restore function. */\n attach(): () => void {\n const restores: Array<() => void> = [];\n\n const patch = (owner: Record<string, unknown>, method: string, level: LogLevel, instance: boolean) => {\n const original = owner[method];\n if (typeof original !== 'function') return;\n\n owner[method] = function (this: unknown, message: unknown, ...rest: unknown[]) {\n const context = instance\n ? ((this as { context?: string } | undefined)?.context ?? (rest[0] as string | undefined))\n : (rest[0] as string | undefined);\n const stack = rest[1] as string | undefined;\n try {\n const result = (original as (...a: unknown[]) => unknown).apply(this, [message, ...rest]);\n capture(level, message, context, stack);\n return result;\n } catch (err) {\n capture(level, message, context, stack);\n throw err;\n }\n };\n\n restores.push(() => {\n owner[method] = original;\n });\n };\n\n // instance loggers: `new Logger('Ctx').log(...)` — the common case\n const proto = Logger.prototype as unknown as Record<string, unknown>;\n patch(proto, 'log', 'info', true);\n patch(proto, 'error', 'error', true);\n patch(proto, 'warn', 'warn', true);\n patch(proto, 'debug', 'debug', true);\n patch(proto, 'verbose', 'verbose', true);\n\n // static loggers: `Logger.log(...)`\n const statics = Logger as unknown as Record<string, unknown>;\n patch(statics, 'log', 'info', false);\n patch(statics, 'error', 'error', false);\n patch(statics, 'warn', 'warn', false);\n patch(statics, 'debug', 'debug', false);\n patch(statics, 'verbose', 'verbose', false);\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n}\n\nfunction resolveSdkAwareLocation(): LogPayload['source'] {\n try {\n const err = new Error();\n const stack = err.stack?.split('\\n').slice(3).join('\\n');\n return resolveSourceLocation(stack ?? '', { skip: 0 });\n } catch {\n return undefined;\n }\n}\n","import { basename } from 'path';\nimport type { ErrorPayload, ProjectInfo, SourceLocation } from '@angelitosystems/devtools-protocol';\nimport { requestContext, safeStringify, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\ntype InstrumentationCtx = {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n};\n\n/**\n * Global error capture via process-level hooks. Errors handled by NestJS\n * filters surface through request.completed; unexpected errors land here.\n */\nexport class ExceptionsInstrumentation {\n /** Attach process-level hooks. Returns a detach function. */\n static attach(ctx: InstrumentationCtx): () => void {\n const onUncaught = (error: unknown): void => {\n reportError(error, ctx, { source: 'uncaughtException' });\n };\n const onRejection = (reason: unknown): void => {\n reportError(reason, ctx, { source: 'unhandledRejection' });\n };\n\n process.on('uncaughtException', onUncaught);\n process.on('unhandledRejection', onRejection);\n\n return () => {\n process.off('uncaughtException', onUncaught);\n process.off('unhandledRejection', onRejection);\n };\n }\n}\n\n/** Public helper: report an error manually from anywhere in the app. */\nexport function captureError(\n error: unknown,\n options?: { context?: string; controller?: string; service?: string },\n): void {\n reportError(error, undefined, options);\n}\n\nfunction reportError(\n error: unknown,\n ctx: InstrumentationCtx | undefined,\n options?: { context?: string; controller?: string; service?: string; source?: string },\n): void {\n try {\n if (ctx && !ctx.config.capture.errors) return;\n\n const normalized = normalizeError(error);\n const location = resolveSourceLocation(normalized.error ?? normalized.message, { skip: 1 });\n const projectId = ctx?.projectInfo.projectId ?? basename(process.cwd());\n\n const payload: ErrorPayload = {\n requestId: requestContext().requestId(),\n projectId,\n name: normalized.name,\n message: normalized.message,\n stack: normalized.error?.stack,\n source: location,\n fingerprint: fingerprint(normalized.name, normalized.message, location),\n context: options?.context ?? options?.source,\n request: currentRequestSummary(),\n controller: options?.controller,\n service: options?.service,\n timestamp: Date.now(),\n };\n\n emit('error.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\nfunction normalizeError(error: unknown): { error: Error | undefined; name: string; message: string } {\n if (error instanceof Error) {\n return { error, name: error.name, message: error.message };\n }\n if (typeof error === 'string') {\n return { error: undefined, name: 'Unknown', message: error };\n }\n if (error !== null && typeof error === 'object' && 'message' in error) {\n const record = error as Record<string, unknown>;\n return {\n error: undefined,\n name: typeof record['name'] === 'string' ? record['name'] : 'Error',\n message: String(record['message']),\n };\n }\n return { error: undefined, name: 'Unknown', message: safeStringify(error) };\n}\n\nfunction fingerprint(name: string, message: string, location?: SourceLocation): string {\n const raw = name + '::' + message + '::' + (location?.file ?? '') + ':' + String(location?.line ?? '');\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction currentRequestSummary(): { method: string; url: string } | undefined {\n const context = requestContext().current();\n if (!context?.method || !context?.url) return undefined;\n return { method: context.method, url: context.url };\n}\n","import type { InstrumentationContext } from './http';\n\n/**\n * Performance instrumentation.\n *\n * Periodic CPU/memory/event-loop/latency sampling lives in core\n * (CoreDevtools.startPerformance) so it works even without an HTTP adapter.\n * This module exists as the capture-toggle boundary and future extension\n * point (gc hooks, histograms, cluster awareness).\n */\nexport class PerformanceInstrumentation {\n constructor(private readonly ctx: InstrumentationContext) {}\n\n /** No-op: sampling is owned by core. Returns a no-op cleanup. */\n attach(): () => void {\n void this.ctx;\n return () => {};\n }\n}\n","import type { AppModuleNode, AppMemberNode, AppSnapshot, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { HttpInstrumentation } from './http';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\ninterface ContainerNode {\n id: string;\n name?: string;\n metatype?: Function;\n instance?: object;\n subtype?: 'httpController' | 'gateway';\n controllers?: Map<string, unknown>;\n providers?: Map<string, unknown>;\n}\n\n/**\n * Explore the Nest container to build the module graph (modules, controllers,\n * providers, guards, pipes...). Best effort: any failure keeps the app safe.\n */\nexport class AppExplorer {\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {}\n\n /** Walk the container and emit app.snapshot. Returns a no-op cleanup. */\n attach(app: INestApplication): () => void {\n try {\n const snapshot = this.buildSnapshot(app);\n emit('app.snapshot', snapshot);\n } catch {\n /* best effort */\n }\n return () => {};\n }\n\n private buildSnapshot(app: INestApplication): AppSnapshot {\n const internal = (app as unknown as { container?: unknown }).container as\n | { getModules?: () => Map<string, ContainerNode> }\n | undefined;\n\n const modules: AppModuleNode[] = [];\n const modulesMap = internal?.getModules?.();\n if (modulesMap) {\n for (const [id, node] of modulesMap) {\n const moduleName = node.metatype?.name ?? String(id);\n const members = this.extractMembers(node);\n modules.push({\n name: moduleName,\n imports: [],\n controllers: members.controllers,\n providers: members.providers,\n exports: [],\n });\n }\n }\n\n return {\n projectId: this.ctx.projectInfo.projectId,\n projectName: this.ctx.projectInfo.projectName,\n modules,\n nestjsVersion: this.ctx.projectInfo.nestjsVersion,\n capturedAt: Date.now(),\n };\n }\n\n private extractMembers(node: ContainerNode): { controllers: AppMemberNode[]; providers: AppMemberNode[] } {\n const controllers: AppMemberNode[] = [];\n const providers: AppMemberNode[] = [];\n\n const controllersMap = node.controllers;\n if (controllersMap instanceof Map) {\n for (const [id, wrapper] of controllersMap) {\n const member = this.memberFromWrapper(id, wrapper, 'controller');\n if (member) controllers.push(member);\n }\n }\n\n const providersMap = node.providers;\n if (providersMap instanceof Map) {\n for (const [id, wrapper] of providersMap) {\n const member = this.memberFromWrapper(id, wrapper);\n if (!member) continue;\n if (wrapper && (wrapper as { subtype?: string }).subtype === 'httpController') {\n controllers.push(member);\n } else {\n providers.push(member);\n }\n }\n }\n\n return { controllers, providers };\n }\n\n private memberFromWrapper(id: string, wrapper: unknown, forcedType?: AppMemberNode['type']): AppMemberNode | null {\n const w = wrapper as { name?: string; metatype?: Function; subtype?: string; instance?: Record<string, unknown> } | null;\n const name = w?.metatype?.name ?? (typeof id === 'string' ? id.replace(/^[A-Z_0-9]+:/, '') : 'unknown');\n const type = forcedType ?? classify(name, w?.instance);\n const routes = type === 'controller' ? extractControllerRoutes(w?.metatype) : undefined;\n return { name, type, routes };\n }\n}\n\n/** Heuristic classification of providers into guards/interceptors/pipes/filters. */\nfunction classify(name: string, instance?: Record<string, unknown>): AppMemberNode['type'] {\n if (name.endsWith('Gateway')) return 'gateway';\n if (name.endsWith('Guard')) return 'guard';\n if (name.endsWith('Interceptor')) return 'interceptor';\n if (name.endsWith('Pipe')) return 'pipe';\n if (name.endsWith('Filter')) return 'filter';\n if (instance && typeof instance.canActivate === 'function') return 'guard';\n if (instance && typeof instance.intercept === 'function') return 'interceptor';\n if (instance && typeof instance.transform === 'function') return 'pipe';\n if (instance && typeof instance.catch === 'function') return 'filter';\n return 'provider';\n}\n\n/** Best-effort extraction of controller routes from a controller metatype. */\nfunction extractControllerRoutes(metatype?: Function): string[] {\n if (!metatype) return [];\n try {\n const proto = metatype.prototype;\n if (!proto) return [];\n const props = Object.getOwnPropertyNames(proto).filter((name) => name !== 'constructor');\n const routes: string[] = [];\n for (const key of props) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (!desc?.value) continue;\n const value = desc.value;\n const routesForMethod = gatherHttpRoutes(value);\n for (const r of routesForMethod) {\n if (typeof r === 'string' && r.length > 0) routes.push(r);\n }\n }\n return routes;\n } catch {\n return [];\n }\n}\n\n/** Attempt to extract HTTP routes from a controller method via NestJS decorators. */\nfunction gatherHttpRoutes(value: Function): (string | undefined)[] {\n try {\n const decorators = (Reflect as any).getMetadata?.('design:http:method', {} as any, undefined, undefined) ?? [];\n const out: (string | undefined)[] = [];\n\n if (decorators.length > 0) {\n for (const d of decorators) {\n if (d && typeof d === 'object' && (d as any).method && (d as any).path) {\n out.push(`${String((d as any).method).toUpperCase()} ${String((d as any).path)}`);\n }\n }\n }\n\n if (typeof value === 'function') {\n const fn = value as any;\n const path = fn.PATH ?? undefined;\n const method = fn.METHOD ?? undefined;\n if (typeof path === 'string' && typeof method === 'string') {\n out.push(`${method.toUpperCase()} ${path}`);\n } else if (typeof path === 'string') {\n out.push(path);\n }\n }\n\n return out;\n } catch {\n return [];\n }\n}\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo, GatewayConnectionPayload, GatewayMessagePayload } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/**\n * WebSocket gateway instrumentation, best-effort.\n *\n * Detects @WebSocketGateway classes via the Nest container and reports\n * connection counts and message flow (received/sent) with redaction.\n * Does not intercept raw sockets unless the gateway exposes them.\n */\nexport class WebsocketInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach gateway hooks. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.websockets) return () => cleanup.forEach((fn) => fn());\n\n const gateways = this.detectGateways();\n for (const gw of gateways) {\n cleanup.push(this.wrapGateway(gw));\n }\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private detectGateways(): Array<{ name: string; instance: any }> {\n try {\n const app = this.getApp();\n if (!app) return [];\n const container = (app as any).container;\n if (!container) return [];\n const modules = container.getModules?.() ?? new Map();\n const out: Array<{ name: string; instance: any }> = [];\n for (const [id, node] of modules) {\n const providers = (node as any).providers;\n if (!providers || !(providers instanceof Map)) continue;\n for (const [key, wrapper] of providers) {\n const w = wrapper as any;\n if (!w || !w.instance) continue;\n const subtype = w.subtype ?? (node.subtype ?? null);\n if (subtype === 'gateway' || (w.instance && w.instance.constructor?.name?.endsWith('Gateway'))) {\n out.push({ name: w.name ?? key, instance: w.instance });\n }\n }\n }\n return out;\n } catch {\n return [];\n }\n }\n\n private wrapGateway(gw: { name: string; instance: any }): () => void {\n const instance = gw.instance;\n if (!instance || typeof instance !== 'object') return () => {};\n\n const hooks: Array<() => void> = [];\n const methods = [\n 'handleConnection',\n 'handleDisconnect',\n 'handleEvent',\n 'handleMessage',\n 'afterInit',\n 'beforeHandle',\n ];\n\n for (const method of methods) {\n if (typeof (instance as any)[method] !== 'function') continue;\n const orig = (instance as any)[method];\n const wrapped = this.buildGatewayWrapper(instance, method, orig);\n (instance as any)[method] = wrapped;\n hooks.push(() => {\n (instance as any)[method] = orig;\n });\n }\n\n return () => hooks.forEach((fn) => fn());\n }\n\n private buildGatewayWrapper(\n instance: any,\n method: string,\n original: (...args: any[]) => any,\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const started = Date.now();\n const requestId = requestContext().requestId() ?? randomId('ws');\n\n if (method === 'handleConnection' || method === 'afterInit') {\n emit('websocket.connected', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n namespace: this.estimateNamespace(args),\n connections: this.countConnections(instance),\n timestamp: Date.now(),\n } as GatewayConnectionPayload);\n }\n\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('received', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.receive:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n });\n }\n\n try {\n const result = await Promise.resolve(original.call(instance, ...args));\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('sent', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n status: 'ok',\n });\n }\n return result;\n } catch (err) {\n if (method === 'handleMessage' || method === 'handleEvent') {\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} error=${this.redactor.serialize(err)}`,\n status: 'error',\n });\n }\n throw err;\n }\n };\n }\n\n private emitMessage(\n direction: 'received' | 'sent',\n instance: any,\n args: any[],\n payload: unknown,\n requestId: string,\n startedAt: number,\n ): void {\n const preview = this.redactor.redact(payload);\n const serialized = this.redactor.serialize(payload);\n emit('websocket.message', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n event: this.estimateEvent(args),\n direction,\n payloadSize: Buffer.byteLength(serialized, 'utf8'),\n payloadPreview: preview,\n requestId,\n duration: Date.now() - startedAt,\n timestamp: Date.now(),\n } as GatewayMessagePayload);\n }\n\n private extractPayload(args: any[]): any {\n for (const arg of args) {\n if (arg && typeof arg === 'object' && !Buffer.isBuffer(arg) && !ArrayBuffer.isView(arg)) {\n return arg;\n }\n }\n return args[0];\n }\n\n private estimateEvent(args: any[]): string {\n const payload = this.extractPayload(args);\n if (!payload || typeof payload !== 'object') return 'message';\n return (payload.event as string) ?? (payload.type as string) ?? 'message';\n }\n\n private estimateNamespace(args: any[]): string {\n if (args.length > 0) {\n const first = args[0];\n if (first && typeof first === 'object' && first.namespace) return first.namespace;\n }\n return '/';\n }\n\n private countConnections(instance: any): number {\n try {\n if (instance.connections && typeof instance.connections === 'function') return instance.connections();\n if (instance.clients && typeof instance.clients === 'function') return instance.clients().size ?? 0;\n return 0;\n } catch {\n return 0;\n }\n }\n\n private estimateGatewayName(instance: any): string {\n return instance.constructor?.name ?? 'Gateway';\n }\n\n private getApp(): any {\n try {\n const ctx: any = this.ctxRaw;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/** Database instrumentation, best-effort provider detection. */\nexport class DatabaseInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach database hooks for detected clients. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n\n if (!this.config.capture.database) return () => cleanup.forEach((fn) => fn());\n\n if (this.tryAttachTypeOrm()) cleanup.push(this.detachTypeOrm());\n if (this.tryAttachPrisma()) cleanup.push(this.detachPrisma());\n if (this.tryAttachMongoose()) cleanup.push(this.detachMongoose());\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private tryAttachTypeOrm(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const dataSource = this.resolveTypeOrmDataSource(app);\n if (!dataSource) return false;\n\n if (typeof dataSource.query === 'function') {\n const originalQuery = dataSource.query.bind(dataSource);\n dataSource.__nestDevToolsOriginalQuery = originalQuery;\n dataSource.query = async (query: unknown, parameters?: unknown[]) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ?? []);\n try {\n const result = await originalQuery(query, parameters);\n this.endQuery(String(query), parameters ?? [], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(String(query), parameters ?? [], Date.now() - started, error);\n throw error;\n }\n };\n return true;\n }\n\n const listener = {\n beforeQuery: (query: string, parameters: unknown[]) => {\n this.startQuery(query, parameters);\n },\n afterQuery: (query: string, parameters: unknown[], durationMs: number) => {\n this.endQuery(query, parameters, durationMs);\n },\n };\n\n const sub = dataSource.subscriber;\n if (sub) {\n const before = sub.beforeQuery as ((q: string, p: unknown[]) => void) | undefined;\n const after = sub.afterQuery as ((q: string, p: unknown[], d: number) => void) | undefined;\n sub.beforeQuery = (q: string, p: unknown[]) => {\n try { before?.(q, p); } catch {}\n listener.beforeQuery(q, p);\n };\n sub.afterQuery = (q: string, p: unknown[], d: number) => {\n try { after?.(q, p, d); } catch {}\n listener.afterQuery(q, p, d);\n };\n } else {\n dataSource.subscriber = listener;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachTypeOrm(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const ds = this.resolveTypeOrmDataSource(app);\n if (!ds || !ds.subscriber) return;\n ds.subscriber = null;\n } catch {}\n };\n }\n\n private tryAttachPrisma(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return false;\n\n if (typeof prisma.$use === 'function') {\n prisma.$use(async (params: any, next: (args: any) => Promise<unknown>) => {\n const label = `${params.model ?? 'prisma'}.${params.action ?? 'query'}`;\n const started = Date.now();\n this.startQuery(label, [params.args]);\n try {\n const result = await next(params);\n this.endQuery(label, [params.args], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(label, [params.args], Date.now() - started, error);\n throw error;\n }\n });\n return true;\n }\n\n const original = prisma.$queryRaw ?? prisma.$executeRaw ?? null;\n if (!original) return false;\n\n const wrapped = (query: unknown, parameters?: unknown) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ? [parameters] : []);\n try {\n const result = original.call(prisma, query, parameters);\n if (result instanceof Promise) {\n return result.then((r) => {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return r;\n });\n }\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return result;\n } catch (err) {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started, err);\n throw err;\n }\n };\n\n prisma.$queryRaw = wrapped;\n prisma.$executeRaw = wrapped;\n return true;\n } catch {\n return false;\n }\n }\n\n private detachPrisma(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return;\n // restore original by removing wrapper and re-assigning? Not safe here.\n // We attempt a soft reset by clearing extension if possible.\n if (typeof prisma.$extends === 'function') prisma.$extends(prisma);\n } catch {}\n };\n }\n\n private tryAttachMongoose(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose) return false;\n\n const instrumentation = this;\n const hook = mongoose.plugin((schema: any, _name: string) => {\n if (!schema || typeof schema !== 'object') return;\n const hooks = schema.pre ?? null;\n if (typeof hooks !== 'function') return;\n const bound = hooks.bind(schema);\n if (!bound) return;\n const originalPre = bound as (method: string, fn: unknown) => void;\n schema.pre = function (method: string, fn: unknown) {\n if (method === 'find' || method === 'findOne' || method === 'findById' || method === 'aggregate' || method === 'countDocuments' || method === 'count') {\n const wrapped = async function (this: unknown, ...args: unknown[]) {\n const started = Date.now();\n const sql = `[Mongoose:${method}]`;\n instrumentation.startQuery(sql, args);\n try {\n const handler = fn as ((...args: unknown[]) => unknown) | null;\n if (!handler) return;\n const result = await handler.apply(this, args);\n instrumentation.endQuery(sql, args, Date.now() - started);\n return result;\n } catch (err) {\n instrumentation.endQuery(sql, args, Date.now() - started, err);\n throw err;\n }\n };\n originalPre(method, wrapped as unknown);\n } else {\n originalPre(method, fn as unknown);\n }\n };\n });\n\n if (typeof mongoose.plugin === 'function') mongoose.plugin(hook);\n return true;\n } catch {\n return false;\n }\n }\n\n private detachMongoose(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose || typeof mongoose.plugin !== 'function') return;\n // Soft reset: re-plugin empty to override previous plugin?\n // Not safe to undo; we leave best-effort.\n } catch {}\n };\n }\n\n private startQuery(sql: string, parameters: unknown[]): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n recordSpan(requestId, 'database', sql.slice(0, 120), {\n detail: `provider=${this.providerLabel()} parameters=${this.redactor.serialize(parameters)}`,\n });\n }\n\n private endQuery(\n sql: string,\n parameters: unknown[],\n durationMs: number,\n error?: unknown,\n ): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n const payload = {\n requestId,\n projectId: this.projectId,\n provider: this.providerLabel() as any,\n sql: sql.slice(0, 2000),\n duration: durationMs,\n parameters: this.redactor.redact(parameters),\n timestamp: Date.now(),\n };\n emit('query.executed', payload as any);\n }\n\n private providerLabel(): string {\n if (this.isTypeOrm()) return 'typeorm';\n if (this.isPrisma()) return 'prisma';\n if (this.isMongoose()) return 'mongoose';\n return 'other';\n }\n\n private isTypeOrm(): boolean {\n return !!this.resolveTypeOrmDataSource(this.getApp());\n }\n\n private isPrisma(): boolean {\n return !!this.resolvePrismaClient(this.getApp());\n }\n\n private isMongoose(): boolean {\n return !!this.resolveMongoose(this.getApp());\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctxRaw as any;\n if (ctx && typeof ctx === 'object' && (ctx as any).app) return (ctx as any).app;\n if (ctx && typeof ctx === 'object' && (ctx as any).getHttpAdapter) {\n return ctx as any;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveTypeOrmDataSource(app: any): any {\n try {\n const dataSource = this.findProvider(app, (value) => typeof value?.query === 'function' && typeof value?.manager === 'object');\n if (dataSource) return dataSource;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolvePrismaClient(app: any): any {\n try {\n const prisma = this.safeGet(app, 'PrismaService')\n ?? this.safeGet(app, 'PrismaClient')\n ?? this.safeGet(app, 'prisma')\n ?? this.findProvider(app, (value) => typeof value?.$queryRaw === 'function');\n if (prisma && typeof prisma.$queryRaw === 'function') return prisma;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveMongoose(app: any): any {\n try {\n const mongoose = this.safeGet(app, 'MongooseService')\n ?? this.safeGet(app, 'Mongoose')\n ?? this.safeGet(app, 'mongoose')\n ?? this.findProvider(app, (value) => typeof value?.plugin === 'function');\n if (mongoose && typeof mongoose.plugin === 'function') return mongoose;\n return null;\n } catch {\n return null;\n }\n }\n\n private safeGet(app: any, token: string): any {\n try {\n return app?.get?.(token, { strict: false }) ?? null;\n } catch {\n return null;\n }\n }\n\n private findProvider(app: any, predicate: (value: any) => boolean): any {\n try {\n const modules = app?.container?.getModules?.() ?? new Map();\n for (const module of modules.values()) {\n for (const wrapper of (module.providers?.values?.() ?? [])) {\n const instance = wrapper?.instance;\n if (instance && predicate(instance)) return instance;\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\n\n/** Queue/event instrumentation, best-effort and opt-in. */\nexport class QueueEventInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctx: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctx = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach queue hooks if a supported client is detected. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.requests && !this.config.capture.logs && !this.config.capture.errors) {\n return () => cleanup.forEach((fn) => fn());\n }\n\n if (this.tryAttachBull()) cleanup.push(this.detachBull());\n return () => cleanup.forEach((fn) => fn());\n }\n\n /** Register a queue span correlated with the active request, if any. */\n static recordJobSpan(\n queueName: string,\n jobId: string,\n label: string,\n options?: { source?: SourceLocation; status?: 'ok' | 'error' },\n ): void {\n const requestId = requestContext().requestId() ?? randomId('queue');\n recordSpan(requestId, 'queue', `${queueName}:${label} (${jobId})`, {\n detail: `queue=${queueName} job=${jobId}`,\n source: options?.source,\n status: options?.status,\n } as any);\n }\n\n /** Emit a log for queue events, correlated with the active request if any. */\n static emitJobLog(\n queueName: string,\n jobId: string,\n level: 'debug' | 'info' | 'warn' | 'error' | 'verbose',\n message: string,\n options?: { source?: SourceLocation },\n ): void {\n const requestId = requestContext().requestId();\n emit('log.created', {\n requestId,\n projectId: undefined,\n level,\n message: `[${queueName}] ${message} (${jobId})`,\n source: options?.source,\n context: queueName,\n processId: process.pid,\n timestamp: Date.now(),\n } as any);\n }\n\n private tryAttachBull(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const bull = this.resolveBull(app);\n if (!bull) return false;\n\n const origProcess = bull.prototype?.process ?? bull.process;\n if (typeof origProcess === 'function') {\n const wrapped = this.wrapProcess(origProcess, bull);\n if (bull.prototype) bull.prototype.process = wrapped;\n bull.process = wrapped;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachBull(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const bull = this.resolveBull(app);\n if (!bull) return;\n // Not safe to restore reliably; best-effort no-op.\n } catch {}\n };\n }\n\n private wrapProcess(original: Function, bull: any): Function {\n return async function (this: any, ...args: any[]) {\n const handler = args[0];\n if (!handler || typeof handler !== 'function') return original.apply(this, args);\n\n const wrapped = async (...handlerArgs: any[]) => {\n const job = handlerArgs[0];\n if (!job || typeof job !== 'object') return handler.apply(this, handlerArgs);\n\n const jobId = job.id ?? job.data?.jobId ?? randomId('job');\n const queueName = job.queueName ?? this.estimateQueueName(bull);\n const started = Date.now();\n\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', { status: 'ok' });\n try {\n const result = await Promise.resolve(handler.apply(this, handlerArgs));\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'ok',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'info', 'job completed', {\n source: resolveSourceLocation(new Error(), { skip: 2 }),\n });\n return result;\n } catch (err) {\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'error',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'error', String(err), {\n source: resolveSourceLocation(err instanceof Error ? err : new Error(), { skip: 2 }),\n });\n throw err;\n }\n };\n\n return original.apply(this, [wrapped, ...args.slice(1)]);\n };\n }\n\n private estimateQueueName(bull: any): string {\n try {\n if (bull.name) return bull.name;\n if (typeof bull === 'function') return bull.name;\n return 'queue';\n } catch {\n return 'queue';\n }\n }\n\n private resolveBull(app: any): any {\n try {\n const bull = app.get('BullService') ?? app.get('Bull') ?? app.get('bull') ?? app.get('Queue') ?? null;\n if (bull && (typeof bull.process === 'function' || typeof bull.prototype?.process === 'function')) return bull;\n return null;\n } catch {\n return null;\n }\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctx as any;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import { existsSync, readFileSync } from 'fs';\nimport { resolve } from 'path';\n\nlet cached: string | null | undefined;\n\n/** Best-effort detection of the host app's @nestjs/core version. */\nexport function detectNestJsVersion(): string | null {\n if (cached !== undefined) return cached;\n cached = null;\n try {\n const candidates = [\n resolve(process.cwd(), 'node_modules/@nestjs/core/package.json'),\n // bun/pnpm layouts: walk up a couple of levels\n resolve(process.cwd(), '../../node_modules/@nestjs/core/package.json'),\n ];\n for (const path of candidates) {\n if (!existsSync(path)) continue;\n const pkg = JSON.parse(readFileSync(path, 'utf8')) as { version?: string };\n if (pkg.version) {\n cached = pkg.version;\n break;\n }\n }\n } catch {\n cached = null;\n }\n return cached;\n}\n","/** SDK version reported to the DevTools server. Keep in sync with package.json. */\nexport const SDK_VERSION = '1.0.10';\n","import { writeOriginalConsole } from './instrumentation/console';\n\n/** ANSI escape helpers (kept tiny and dependency-free, mirrors the CLI renderer). */\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst WIDTH = 47;\n\nfunction colorEnabled(): boolean {\n // Respect NO_COLOR / non-TTY output the same way most CLIs do.\n if (process.env['NO_COLOR']) return false;\n return Boolean(process.stdout?.isTTY);\n}\n\nfunction paint(color: string, text: string): string {\n return colorEnabled() ? `${color}${text}${RESET}` : text;\n}\n\nfunction pad(label: string, value: string): string {\n const line = ` ${paint(GRAY, label.padEnd(9))} ${paint(CYAN, value)}`;\n return line;\n}\n\n/** Prints the boxed \"SDK started\" banner once, right after init(). */\nexport function printStartupBanner(info: { endpoint: string; dashboard: string; project: string }): void {\n const top = `${paint(GRAY, '┌' + '─'.repeat(WIDTH) + '┐')}`;\n const bottom = `${paint(GRAY, '└' + '─'.repeat(WIDTH) + '┘')}`;\n const title = ` ${paint(BOLD + CYAN, 'NestJS DevTools')} ${paint(GREEN, '●')} ${paint(DIM, `(${info.project})`)}`;\n\n writeOriginalConsole('log', '');\n writeOriginalConsole('log', top);\n writeOriginalConsole('log', title);\n writeOriginalConsole('log', pad('Endpoint', info.endpoint));\n writeOriginalConsole('log', pad('Dashboard', info.dashboard));\n writeOriginalConsole('log', `${paint(GRAY, ' Estado')} ${paint(YELLOW, '◌ conectando…')}`);\n writeOriginalConsole('log', bottom);\n}\n\n/** Prints a single status line once the transport's connection state is known. */\nexport function printConnectionStatus(state: 'open' | 'offline', dashboard: string): void {\n if (state === 'open') {\n writeOriginalConsole('log', ` ${paint(GREEN, '✓')} Conectado al dashboard ${paint(DIM, `(${dashboard})`)}`);\n return;\n }\n writeOriginalConsole('log', ` ${paint(YELLOW, '⚠')} No se pudo conectar al dashboard todavía.`);\n writeOriginalConsole('log', ` ${paint(DIM, '¿Aún no lo instalaste? →')} ${paint(BOLD, 'bun add -g @angelitosystems/nest-devtools-cli')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Luego, en otra terminal: →')} ${paint(BOLD, 'nest-devtools start')}`);\n writeOriginalConsole('log', ` ${paint(DIM, '(sin instalar, una sola vez: npx -p @angelitosystems/nest-devtools-cli nest-devtools start)')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Reintentando en segundo plano — se conectará solo cuando el dashboard esté arriba.')}`);\n}","import type { INestApplication } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { emit } from './emitter';\n\nexport interface PluginContext {\n readonly config: DevToolsConfig;\n readonly project: ProjectInfo;\n readonly redactor: Redactor;\n emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void;\n custom(name: string, data?: unknown): void;\n}\n\nexport interface DevToolsPlugin {\n readonly name: string;\n onInit?(context: PluginContext): void | Promise<void>;\n onAttach?(app: INestApplication, context: PluginContext): void | (() => void) | Promise<void | (() => void)>;\n onDispose?(): void | Promise<void>;\n}\n\n/** Runs third-party instrumentation without allowing it to affect the app. */\nexport class PluginManager {\n private readonly cleanups: Array<() => void> = [];\n private readonly initialized: DevToolsPlugin[] = [];\n\n constructor(private readonly plugins: DevToolsPlugin[]) {}\n\n attach(app: INestApplication, config: DevToolsConfig, project: ProjectInfo): () => void {\n const redactor = new Redactor({ redact: config.redact, allow: config.allow, maxBytes: config.maxPayloadBytes });\n const context: PluginContext = {\n config,\n project,\n redactor,\n emit: (event, payload) => {\n try { emit(event, redactor.redact(payload) as DevToolsEventMap[typeof event]); } catch { /* plugin isolation */ }\n },\n custom: (name, data) => {\n try {\n emit('plugin.event', {\n projectId: project.projectId,\n plugin: 'custom',\n name,\n data: redactor.redact(data),\n timestamp: Date.now(),\n });\n } catch { /* plugin isolation */ }\n },\n };\n\n for (const plugin of this.plugins) {\n if (!plugin || !plugin.name) continue;\n this.initialized.push(plugin);\n this.run(plugin.name, () => plugin.onInit?.(context));\n this.run(plugin.name, async () => {\n const cleanup = await plugin.onAttach?.(app, context);\n if (typeof cleanup === 'function') this.cleanups.push(cleanup);\n });\n }\n\n return () => {\n for (const cleanup of this.cleanups.splice(0)) {\n try { cleanup(); } catch { /* plugin isolation */ }\n }\n for (const plugin of this.initialized.splice(0)) this.run(plugin.name, () => plugin.onDispose?.());\n };\n }\n\n private run(name: string, operation: () => void | Promise<void>): void {\n try {\n const result = operation();\n if (result && typeof (result as Promise<void>).then === 'function') {\n void (result as Promise<void>).catch((error) => this.reportFailure(name, error));\n }\n } catch (error) {\n this.reportFailure(name, error);\n }\n }\n\n private reportFailure(name: string, error: unknown): void {\n try {\n emit('log.created', {\n projectId: 'plugin-system',\n level: 'error',\n message: `DevTools plugin ${name} failed: ${error instanceof Error ? error.message : String(error)}`,\n processId: process.pid,\n timestamp: Date.now(),\n context: 'plugin',\n });\n } catch { /* plugin isolation */ }\n }\n}\n"],"mappings":"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","names":["import_devtools_core","import_devtools_core","coreDevtools","capture","import_devtools_protocol","import_devtools_core","import_devtools_protocol","import_devtools_core","import_devtools_core","import_devtools_core","import_devtools_protocol","import_devtools_core","import_devtools_protocol","module","import_devtools_core","import_devtools_protocol","import_devtools_core","import_path","import_devtools_protocol","coreDevtools","import_devtools_core"]}
package/dist/index.js CHANGED
@@ -1380,7 +1380,7 @@ function detectNestJsVersion() {
1380
1380
  }
1381
1381
 
1382
1382
  // src/version.ts
1383
- var SDK_VERSION = "1.0.9";
1383
+ var SDK_VERSION = "1.0.10";
1384
1384
 
1385
1385
  // src/banner.ts
1386
1386
  var RESET = "\x1B[0m";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/sdk.ts","../src/instrumentation/http.ts","../src/emitter.ts","../src/instrumentation/timeline.ts","../src/instrumentation/console.ts","../src/instrumentation/nest-logger.ts","../src/instrumentation/exceptions.ts","../src/instrumentation/performance.ts","../src/instrumentation/app-explorer.ts","../src/instrumentation/websockets.ts","../src/instrumentation/database.ts","../src/instrumentation/queue.ts","../src/detect.ts","../src/version.ts","../src/banner.ts","../src/plugins.ts","../src/index.ts"],"sourcesContent":["import { hostname } from 'os';\nimport { devtools as coreDevtools, resolveConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { HttpInstrumentation } from './instrumentation/http';\nimport { ConsoleInstrumentation } from './instrumentation/console';\nimport { LoggerInstrumentation } from './instrumentation/nest-logger';\nimport { ExceptionsInstrumentation, captureError } from './instrumentation/exceptions';\nimport { PerformanceInstrumentation } from './instrumentation/performance';\nimport { AppExplorer } from './instrumentation/app-explorer';\nimport { WebsocketInstrumentation } from './instrumentation/websockets';\nimport { DatabaseInstrumentation } from './instrumentation/database';\nimport { QueueEventInstrumentation } from './instrumentation/queue';\nimport { detectNestJsVersion } from './detect';\nimport { SDK_VERSION } from './version';\nimport { printStartupBanner, printConnectionStatus } from './banner';\nimport { PluginManager } from './plugins';\nimport type { DevToolsPlugin } from './plugins';\nimport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\n\n/** Result of calling NestDevTools.init(). */\nexport interface InitResult {\n /** True when instrumentation is live. */\n enabled: boolean;\n /** Reason when partially or fully disabled. */\n reason?: 'disabled-by-config' | 'already-initialized' | 'no-http-adapter';\n projectId: string;\n projectName: string;\n server: string;\n}\n\nexport type NestDevToolsOptions = DevToolsUserConfig & { plugins?: DevToolsPlugin[] };\n\n/**\n * Main entry point: `NestDevTools.init(app, config?)`.\n *\n * Never throws, never blocks startup, and disables itself in production\n * unless explicitly enabled.\n */\nexport class NestDevTools {\n private static readonly cleanups: Array<() => void> = [];\n private static initialized = false;\n\n /** Initialize DevTools for a NestJS application. One active instance per process. */\n static init(app: INestApplication, userConfig?: NestDevToolsOptions): InitResult {\n const config = resolveConfig(userConfig);\n const disabled: InitResult = {\n enabled: false,\n reason: 'disabled-by-config',\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n server: config.server,\n };\n\n if (this.initialized) return { ...disabled, reason: 'already-initialized' };\n if (!config.enabled) return disabled; // zero side effects: no patching, no sockets, no timers\n\n this.initialized = true;\n const registerCleanup = (fn: () => void) => this.cleanups.push(fn);\n\n const projectInfo: ProjectInfo = {\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n environment: config.environment,\n hostname: safeHostname(),\n port: null,\n pid: process.pid,\n runtime: detectRuntime(),\n runtimeVersion: detectRuntimeVersion(),\n nodeVersion: process.version,\n nestjsVersion: detectNestJsVersion(),\n sdkVersion: SDK_VERSION,\n };\n\n // transport is fully async: a missing server never affects startup\n let hasWarnedOffline = false;\n coreDevtools.initialize({\n config,\n projectInfo,\n registerCleanup,\n onStateChange: (state: any) => {\n if (state === 'open') {\n printConnectionStatus('open', dashboardUrl(config.server));\n } else if (state === 'retrying' && !hasWarnedOffline) {\n hasWarnedOffline = true;\n printConnectionStatus('offline', dashboardUrl(config.server));\n }\n },\n } as any);\n\n if (userConfig?.plugins && userConfig.plugins.length > 0) {\n registerCleanup(new PluginManager(userConfig.plugins).attach(app, config, projectInfo));\n }\n\n const adapter = app.getHttpAdapter();\n const httpReady = Boolean(adapter && ['http', 'express'].includes(adapter.getType()));\n\n // ---- HTTP instrumentation -------------------------------------------\n const http = new HttpInstrumentation({ config, projectInfo });\n registerCleanup(http.attach(app));\n\n // ---- console + NestJS Logger + global errors ------------------------\n registerCleanup(new ConsoleInstrumentation({ config, projectInfo }).attach());\n registerCleanup(new LoggerInstrumentation({ config, projectInfo }).attach());\n registerCleanup(ExceptionsInstrumentation.attach({ config, projectInfo }));\n\n // ---- performance sampling -------------------------------------------\n registerCleanup(new PerformanceInstrumentation({ config, projectInfo }).attach());\n\n // ---- application graph ----------------------------------------------\n registerCleanup(new AppExplorer({ config, projectInfo }).attach(app));\n\n // ---- websockets + database + queues (best effort) ------------------\n if (config.capture.websockets) {\n registerCleanup(new WebsocketInstrumentation({ config, projectInfo }).attach());\n }\n if (config.capture.database) {\n registerCleanup(new DatabaseInstrumentation({ config, projectInfo }).attach());\n }\n registerCleanup(new QueueEventInstrumentation({ config, projectInfo }).attach());\n\n printStartupBanner({\n endpoint: config.server,\n dashboard: dashboardUrl(config.server),\n project: projectInfo.projectName,\n });\n\n return {\n enabled: true,\n projectId: config.projectId,\n projectName: projectInfo.projectName,\n server: config.server,\n ...(httpReady ? {} : { reason: 'no-http-adapter' as const }),\n };\n }\n\n /** Teardown everything (mostly useful in tests). */\n static destroy(): void {\n for (const cleanup of this.cleanups.splice(0)) {\n try {\n cleanup();\n } catch {\n /* ignore */\n }\n }\n this.initialized = false;\n coreDevtools.shutdown();\n }\n\n /** Whether the SDK is currently active in this process. */\n static isActive(): boolean {\n return this.initialized;\n }\n\n /** Start an explicit CPU or heap profile. */\n static startProfile(kind: ProfileKind): Promise<{ profileId: string; startedAt: number }> {\n return coreDevtools.startProfile(kind);\n }\n\n /** Stop the active profile and return its captured result. */\n static stopProfile(): Promise<ProfileResult> {\n return coreDevtools.stopProfile();\n }\n}\n\n/** Convenience functional alias: devtools.init(app). */\nexport const devtools = {\n init: NestDevTools.init.bind(NestDevTools),\n destroy: NestDevTools.destroy.bind(NestDevTools),\n isActive: NestDevTools.isActive.bind(NestDevTools),\n startProfile: NestDevTools.startProfile.bind(NestDevTools),\n stopProfile: NestDevTools.stopProfile.bind(NestDevTools),\n};\n\nfunction safeHostname(): string {\n try {\n return hostname();\n } catch {\n return 'unknown';\n }\n}\n\nfunction detectRuntime(): string {\n const versions = process.versions as Record<string, string | undefined>;\n if (versions['bun']) return 'bun';\n if (versions['deno']) return 'deno';\n return 'node';\n}\n\nfunction detectRuntimeVersion(): string {\n const versions = process.versions as Record<string, string | undefined>;\n return versions['bun'] ?? versions['deno'] ?? process.version;\n}\n\nfunction dashboardUrl(server: string): string {\n try {\n const url = new URL(server);\n url.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';\n const port = Number(url.port);\n url.port = String(Number.isFinite(port) && port > 0 ? port - 1 : 4317);\n url.pathname = '';\n url.search = '';\n url.hash = '';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return 'http://localhost:4317';\n }\n}\n\nexport { captureError };","import type { IncomingMessage, ServerResponse, Server as HttpServer } from 'http';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport type {\n ProjectInfo,\n RequestCompletedPayload,\n RequestStartedPayload,\n TimelineSpan,\n} from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { recordSpan, trackSpans } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\n/** Shared context every instrumentation module receives. */\nexport interface InstrumentationContext {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n}\n\n/** Request headers captured by default (denylist still applies). */\nconst REQUEST_HEADERS = [\n 'content-type',\n 'content-length',\n 'accept',\n 'origin',\n 'referer',\n 'user-agent',\n 'x-forwarded-for',\n 'x-request-id',\n 'x-forwarded-proto',\n] as const;\n\n/** Response headers captured by default. */\nconst RESPONSE_HEADERS = [\n 'content-type',\n 'content-length',\n 'location',\n 'set-cookie',\n 'x-request-id',\n 'x-response-time',\n] as const;\n\ntype RequestListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst WRAPPED = Symbol('nest-devtools.wrapped');\n\n/**\n * Instrument the HTTP server of a NestJS application.\n *\n * Covers both bootstrap orders without touching Node module internals:\n * - `NestDevTools.init(app)` after `app.listen()`: the server already exists\n * and is wrapped immediately.\n * - `NestDevTools.init(app)` before `app.listen()` (recommended): `app.listen`\n * is wrapped so the server is wrapped the moment it exists.\n */\nexport class HttpInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: InstrumentationContext) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Begin capturing HTTP requests. Returns a cleanup function. */\n attach(app: INestApplication): () => void {\n try {\n const adapter = app.getHttpAdapter();\n // 'http' = platform-default adapter, 'express' = @nestjs/platform-express\n if (!adapter || !['http', 'express'].includes(adapter.getType())) return () => {};\n\n const getServer = (): HttpServer | undefined =>\n (adapter as unknown as { getHttpServer?: () => HttpServer }).getHttpServer?.();\n\n // 1) server already exists (init called after listen)\n const existing = getServer();\n if (existing) {\n this.wrapServer(existing);\n return () => {};\n }\n\n // 2) init called before listen: wrap the server once listen() resolves\n const appLike = app as unknown as { listen: (...args: unknown[]) => unknown };\n const originalListen = appLike.listen.bind(app);\n const self = this;\n const patchedListen = (...args: unknown[]) => {\n const result = originalListen(...args);\n Promise.resolve(result)\n .then(() => {\n const server = getServer();\n if (server) self.wrapServer(server);\n })\n .catch(() => {\n /* listen failed — the app will surface its own error */\n });\n return result;\n };\n appLike.listen = patchedListen;\n\n return () => {\n appLike.listen = originalListen;\n };\n } catch {\n return () => {};\n }\n }\n\n /** Wrap the 'request' listeners of a server exactly once. */\n private wrapServer(server: HttpServer): void {\n const target = server as unknown as Record<symbol, unknown>;\n if (target[WRAPPED]) return;\n target[WRAPPED] = true;\n\n const self = this;\n const originalListeners = server.rawListeners('request') as RequestListener[];\n\n server.removeAllListeners('request');\n server.on('request', (req, res) => {\n self.instrumentRequest(req, res, () => {\n for (const listener of originalListeners) {\n listener.call(server, req, res);\n }\n });\n });\n }\n\n /** Wrap a single request lifecycle. */\n private instrumentRequest(req: IncomingMessage, res: ServerResponse, next: () => void): void {\n if (!this.ctx.config.capture.requests) {\n next();\n return;\n }\n\n const startedAt = Date.now();\n const requestId = randomId('req');\n const method = (req.method ?? 'GET').toUpperCase();\n const rawUrl = req.url ?? '/';\n const url = safeUrlPath(rawUrl);\n\n const spans: TimelineSpan[] = [];\n const unregister = trackSpans(requestId, spans);\n res.once('finish', unregister);\n\n const started: RequestStartedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n headers: this.collectRequestHeaders(req),\n query: parseQuery(rawUrl),\n ip: clientIp(req),\n userAgent: asString(req.headers['user-agent']) || undefined,\n startedAt,\n };\n\n const middlewareSpan: TimelineSpan = {\n layer: 'middleware',\n label: `${method} ${url}`,\n duration: 0,\n startedAt,\n status: 'ok',\n };\n spans.push(middlewareSpan);\n\n const capturedBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n const responseCapture = createResponseCapture(res, this.ctx.config.maxPayloadBytes, this.redactor);\n\n const onFinished = () => {\n const finishedAt = Date.now();\n middlewareSpan.duration = Math.max(0, finishedAt - middlewareSpan.startedAt);\n middlewareSpan.status = res.statusCode >= 500 ? 'error' : 'ok';\n\n const responseSpan: TimelineSpan = {\n layer: 'response',\n label: 'response',\n duration: 0,\n startedAt: finishedAt,\n status: res.statusCode >= 400 ? 'error' : 'ok',\n };\n spans.push(responseSpan);\n\n const responseHeaders = this.collectResponseHeaders(res);\n const responsePreview = responseCapture.read();\n const requestBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n\n const errored = res.statusCode >= 500;\n\n const completed: RequestCompletedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n statusCode: res.statusCode,\n duration: finishedAt - startedAt,\n startedAt,\n timeline: spans,\n requestHeaders: started.headers,\n query: parseQuery(rawUrl),\n headers: responseHeaders,\n responsePreview,\n requestBody: requestBody ?? capturedBody,\n errored,\n };\n\n emit('request.completed', completed);\n\n // NestJS exception filters turn controller errors into 5xx responses\n // without any process-level signal — surface them in the Error Explorer.\n if (errored) {\n emit('error.created', {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n name: 'HttpError',\n message: `${method} ${url} failed with status ${res.statusCode}`,\n fingerprint: httpErrorFingerprint(method, url, res.statusCode),\n request: { method, url: String(url), statusCode: res.statusCode },\n timestamp: finishedAt,\n });\n }\n };\n\n const context = requestContext();\n context.run({ requestId, method, url, startedAt }, () => {\n emit('request.started', started);\n res.once('finish', onFinished);\n next();\n });\n }\n\n private collectRequestHeaders(req: IncomingMessage): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : asString(value).slice(0, 200);\n }\n return out;\n }\n\n private collectResponseHeaders(res: ServerResponse): Record<string, string> {\n const out: Record<string, string> = {};\n const headers = typeof res.getHeaders === 'function' ? res.getHeaders() : {};\n\n for (const rawKey of Object.keys(headers)) {\n const key = rawKey.toLowerCase();\n const raw = headers[rawKey] as string | number | string[] | undefined ?? '';\n const value = String(raw);\n if (value === '') continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : value.slice(0, 200);\n }\n return out;\n }\n}\n\nfunction asString(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value.join(', ');\n return value ?? '';\n}\n\n/** Stable fingerprint for framework-handled HTTP failures. */\nfunction httpErrorFingerprint(method: string, url: string, statusCode: number): string {\n const route = url.replace(/\\/\\d+(?=\\/|$)/g, '/:id'); // group /users/15 with /users/16\n const raw = `${method}::${route}::${statusCode}`;\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction safeUrlPath(raw: string): string {\n const index = raw.indexOf('?');\n return index === -1 ? raw : raw.slice(0, index);\n}\n\nfunction parseQuery(raw: string): Record<string, unknown> {\n const index = raw.indexOf('?');\n if (index === -1) return {};\n const out: Record<string, unknown> = {};\n for (const [key, value] of new URLSearchParams(raw.slice(index + 1))) {\n out[key] = value;\n }\n return out;\n}\n\nfunction clientIp(req: IncomingMessage): string | undefined {\n const forwarded = req.headers['x-forwarded-for'];\n if (typeof forwarded === 'string') return forwarded.split(',')[0]?.trim();\n return req.socket?.remoteAddress ?? undefined;\n}\n\n/** Best-effort route extraction from Express/Nest request. */\nfunction routeFromReq(req: IncomingMessage): string | undefined {\n try {\n const http = req as unknown as { httpVersion?: string };\n const out: RequestStartedPayload = {\n requestId: '',\n projectId: '',\n method: '',\n url: '',\n route: undefined,\n headers: {},\n query: {},\n ip: undefined,\n userAgent: undefined,\n startedAt: 0,\n };\n const routeRaw: unknown = (req as unknown as Record<string, unknown>).route;\n if (routeRaw && typeof routeRaw === 'object' && routeRaw !== null) {\n const route = routeRaw as { name?: unknown };\n const name = route.name as string | undefined;\n if (typeof name === 'string' && name.length > 0) return name;\n }\n const path = (req as unknown as { baseUrl?: string }).baseUrl\n ?? (req as any).path;\n if (typeof path === 'string' && path.length > 0) return path;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the request body (limited, redacted). */\nfunction captureRequestPreview(req: IncomingMessage, redactor: Redactor): unknown {\n try {\n const body = (req as unknown as Record<string, unknown>).body;\n if (body === undefined || body === null) return undefined;\n return redactor.redact(body);\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the response body after the response finishes. */\nfunction captureResponsePreview(res: ServerResponse, redactor: Redactor): string | undefined {\n try {\n const resLike = res as unknown as Record<string, unknown>;\n const body = resLike.body;\n if (body === undefined || body === null) return undefined;\n if (typeof body === 'string') return redactor.redactString(body);\n return redactor.serialize(body);\n } catch {\n return undefined;\n }\n}\n\nfunction createResponseCapture(\n res: ServerResponse,\n maxBytes: number,\n redactor: Redactor,\n): { read: () => string | undefined } {\n if (maxBytes <= 0) return { read: () => undefined };\n const chunks: Buffer[] = [];\n let size = 0;\n const originalWrite = res.write.bind(res);\n const originalEnd = res.end.bind(res);\n const capture = (chunk: unknown): void => {\n if (chunk === undefined || chunk === null || size >= maxBytes) return;\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n const remaining = maxBytes - size;\n chunks.push(buffer.subarray(0, remaining));\n size += Math.min(buffer.length, remaining);\n };\n (res as any).write = (chunk: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalWrite(chunk as any, ...(args as any));\n };\n (res as any).end = (chunk?: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalEnd(chunk as any, ...(args as any));\n };\n res.once('finish', () => {\n (res as any).write = originalWrite;\n (res as any).end = originalEnd;\n });\n return {\n read: () => {\n if (chunks.length === 0) return undefined;\n const raw = Buffer.concat(chunks).toString('utf8');\n return redactor.redactString(raw);\n },\n };\n}\n\nexport { safeUrlPath, parseQuery, clientIp, routeFromReq };\n","import { devtools as coreDevtools } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName } from '@angelitosystems/devtools-protocol';\n\n/** Emit a typed protocol event to the DevTools server (fire-and-forget). */\nexport function emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void {\n try {\n coreDevtools.send(event, payload);\n } catch {\n /* instrumentation must never break the app */\n }\n}\n","import type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\n\n/** Create a started span inside a request's span list. */\nexport function startSpan(\n spans: TimelineSpan[],\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): TimelineSpan {\n const span: TimelineSpan = {\n layer,\n label,\n duration: 0,\n startedAt: Date.now(),\n status: options?.status ?? 'ok',\n ...(options?.detail !== undefined ? { detail: options.detail } : {}),\n ...(options?.source !== undefined ? { source: options.source } : {}),\n };\n spans.push(span);\n return span;\n}\n\n/** Finalize a span, computing its duration. */\nexport function endSpan(span: TimelineSpan, status?: 'ok' | 'error'): void {\n span.duration = Math.max(0, Date.now() - span.startedAt);\n if (status) span.status = status;\n}\n\n/**\n * Registry of active request timelines, keyed by requestId.\n * Lets deeper instrumentation (database, websockets) attach spans to the\n * request that caused them, using the AsyncLocalStorage request id.\n */\nconst recorders = new Map<string, TimelineSpan[]>();\n\n/** Register a request's span list. Returns an unregister callback. */\nexport function trackSpans(requestId: string, spans: TimelineSpan[]): () => void {\n recorders.set(requestId, spans);\n return () => recorders.delete(requestId);\n}\n\n/** Add an auto-ended span to a request if it is still active. */\nexport function recordSpan(\n requestId: string,\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): void {\n const spans = recorders.get(requestId);\n if (!spans) return;\n const span = startSpan(spans, layer, label, options);\n endSpan(span, options?.status);\n}\n","import { Console } from 'console';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\nconst METHODS = ['log', 'info', 'warn', 'error', 'debug'] as const;\ntype ConsoleMethod = (typeof METHODS)[number];\n\nconst LEVEL_BY_METHOD: Record<ConsoleMethod, LogLevel> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n debug: 'debug',\n};\n\n/** Original console bound directly to the process streams. */\nconst originalConsole = new Console({\n stdout: process.stdout,\n stderr: process.stderr,\n colorMode: 'auto',\n});\n\n/** Write through the untouched console (used by DevTools' own logging). */\nexport function writeOriginalConsole(method: ConsoleMethod, ...args: unknown[]): void {\n const fn = (originalConsole as unknown as Record<string, (...a: unknown[]) => void>)[method];\n if (fn) fn.apply(originalConsole, args);\n}\n\n/** Capture console output and mirror it to DevTools. */\nexport class ConsoleInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Patch console methods. Returns a restore function. */\n attach(): () => void {\n const self = this;\n const restores: Array<() => void> = [];\n\n for (const method of METHODS) {\n const original = (console as unknown as Record<string, unknown>)[method];\n if (typeof original !== 'function') continue;\n\n const patched = (...args: unknown[]) => {\n try {\n (original as (...a: unknown[]) => void).apply(console, args);\n } catch {\n /* never break host logging */\n }\n self.capture(method, args);\n };\n\n (console as unknown as Record<string, unknown>)[method] = patched;\n restores.push(() => {\n (console as unknown as Record<string, unknown>)[method] = original;\n });\n }\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n\n private capture(method: ConsoleMethod, args: unknown[]): void {\n if (!this.ctx.config.capture.logs) return;\n try {\n const level = LEVEL_BY_METHOD[method];\n const payload: LogPayload = {\n projectId: this.ctx.projectInfo.projectId,\n level,\n message: formatMessage(args, this.redactor),\n arguments: args.length > 0 ? (this.redactor.redact(args) as unknown[]) : undefined,\n stack: method === 'error' ? captureStack() : undefined,\n source: resolveSourceLocation(captureStack() ?? '', { skip: 0 }),\n context: undefined,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n if (method === 'error') payload.level = 'error';\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n }\n}\n\nfunction formatMessage(args: unknown[], redactor: Redactor): string {\n if (args.length === 0) return '';\n const first = args[0];\n if (typeof first === 'string') {\n return args.length === 1 ? redactor.redactString(first) : `${first} ${redactor.serialize(args.slice(1))}`;\n }\n return redactor.serialize(args);\n}\n\nfunction captureStack(): string | undefined {\n const err = new Error();\n const stack = err.stack;\n if (!stack) return undefined;\n // drop the frames created by this helper\n return stack.split('\\n').slice(3).join('\\n');\n}\n","import { Logger } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\n/**\n * Captures NestJS framework logs (`new Logger('Ctx').log(...)` and the static\n * `Logger.log(...)` variants). Nest's Logger writes through process.stdout\n * internals, not console.*, so it needs its own hook.\n *\n * State is module-scoped on purpose: the patched methods are plain functions\n * and must never depend on class-instance `this` binding.\n */\nlet activeRedactor = new Redactor();\nlet activeConfig: DevToolsConfig | null = null;\nlet activeProjectId = '';\n\nfunction capture(level: LogLevel, message: unknown, context?: string, stack?: string): void {\n try {\n if (!activeConfig?.capture.logs) return;\n const text = typeof message === 'string' ? message : activeRedactor.serialize(message);\n const payload: LogPayload = {\n projectId: activeProjectId,\n level,\n message: activeRedactor.redactString(text),\n source: stack ? undefined : resolveSdkAwareLocation(),\n context,\n stack,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\n/** Captures NestJS Logger output and mirrors it to DevTools. */\nexport class LoggerInstrumentation {\n constructor(ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n activeRedactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n activeConfig = ctx.config;\n activeProjectId = ctx.projectInfo.projectId;\n }\n\n /** Patch Logger.prototype and the static Logger methods. Returns a restore function. */\n attach(): () => void {\n const restores: Array<() => void> = [];\n\n const patch = (owner: Record<string, unknown>, method: string, level: LogLevel, instance: boolean) => {\n const original = owner[method];\n if (typeof original !== 'function') return;\n\n owner[method] = function (this: unknown, message: unknown, ...rest: unknown[]) {\n const context = instance\n ? ((this as { context?: string } | undefined)?.context ?? (rest[0] as string | undefined))\n : (rest[0] as string | undefined);\n const stack = rest[1] as string | undefined;\n try {\n const result = (original as (...a: unknown[]) => unknown).apply(this, [message, ...rest]);\n capture(level, message, context, stack);\n return result;\n } catch (err) {\n capture(level, message, context, stack);\n throw err;\n }\n };\n\n restores.push(() => {\n owner[method] = original;\n });\n };\n\n // instance loggers: `new Logger('Ctx').log(...)` — the common case\n const proto = Logger.prototype as unknown as Record<string, unknown>;\n patch(proto, 'log', 'info', true);\n patch(proto, 'error', 'error', true);\n patch(proto, 'warn', 'warn', true);\n patch(proto, 'debug', 'debug', true);\n patch(proto, 'verbose', 'verbose', true);\n\n // static loggers: `Logger.log(...)`\n const statics = Logger as unknown as Record<string, unknown>;\n patch(statics, 'log', 'info', false);\n patch(statics, 'error', 'error', false);\n patch(statics, 'warn', 'warn', false);\n patch(statics, 'debug', 'debug', false);\n patch(statics, 'verbose', 'verbose', false);\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n}\n\nfunction resolveSdkAwareLocation(): LogPayload['source'] {\n try {\n const err = new Error();\n const stack = err.stack?.split('\\n').slice(3).join('\\n');\n return resolveSourceLocation(stack ?? '', { skip: 0 });\n } catch {\n return undefined;\n }\n}\n","import { basename } from 'path';\nimport type { ErrorPayload, ProjectInfo, SourceLocation } from '@angelitosystems/devtools-protocol';\nimport { requestContext, safeStringify, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\ntype InstrumentationCtx = {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n};\n\n/**\n * Global error capture via process-level hooks. Errors handled by NestJS\n * filters surface through request.completed; unexpected errors land here.\n */\nexport class ExceptionsInstrumentation {\n /** Attach process-level hooks. Returns a detach function. */\n static attach(ctx: InstrumentationCtx): () => void {\n const onUncaught = (error: unknown): void => {\n reportError(error, ctx, { source: 'uncaughtException' });\n };\n const onRejection = (reason: unknown): void => {\n reportError(reason, ctx, { source: 'unhandledRejection' });\n };\n\n process.on('uncaughtException', onUncaught);\n process.on('unhandledRejection', onRejection);\n\n return () => {\n process.off('uncaughtException', onUncaught);\n process.off('unhandledRejection', onRejection);\n };\n }\n}\n\n/** Public helper: report an error manually from anywhere in the app. */\nexport function captureError(\n error: unknown,\n options?: { context?: string; controller?: string; service?: string },\n): void {\n reportError(error, undefined, options);\n}\n\nfunction reportError(\n error: unknown,\n ctx: InstrumentationCtx | undefined,\n options?: { context?: string; controller?: string; service?: string; source?: string },\n): void {\n try {\n if (ctx && !ctx.config.capture.errors) return;\n\n const normalized = normalizeError(error);\n const location = resolveSourceLocation(normalized.error ?? normalized.message, { skip: 1 });\n const projectId = ctx?.projectInfo.projectId ?? basename(process.cwd());\n\n const payload: ErrorPayload = {\n requestId: requestContext().requestId(),\n projectId,\n name: normalized.name,\n message: normalized.message,\n stack: normalized.error?.stack,\n source: location,\n fingerprint: fingerprint(normalized.name, normalized.message, location),\n context: options?.context ?? options?.source,\n request: currentRequestSummary(),\n controller: options?.controller,\n service: options?.service,\n timestamp: Date.now(),\n };\n\n emit('error.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\nfunction normalizeError(error: unknown): { error: Error | undefined; name: string; message: string } {\n if (error instanceof Error) {\n return { error, name: error.name, message: error.message };\n }\n if (typeof error === 'string') {\n return { error: undefined, name: 'Unknown', message: error };\n }\n if (error !== null && typeof error === 'object' && 'message' in error) {\n const record = error as Record<string, unknown>;\n return {\n error: undefined,\n name: typeof record['name'] === 'string' ? record['name'] : 'Error',\n message: String(record['message']),\n };\n }\n return { error: undefined, name: 'Unknown', message: safeStringify(error) };\n}\n\nfunction fingerprint(name: string, message: string, location?: SourceLocation): string {\n const raw = name + '::' + message + '::' + (location?.file ?? '') + ':' + String(location?.line ?? '');\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction currentRequestSummary(): { method: string; url: string } | undefined {\n const context = requestContext().current();\n if (!context?.method || !context?.url) return undefined;\n return { method: context.method, url: context.url };\n}\n","import type { InstrumentationContext } from './http';\n\n/**\n * Performance instrumentation.\n *\n * Periodic CPU/memory/event-loop/latency sampling lives in core\n * (CoreDevtools.startPerformance) so it works even without an HTTP adapter.\n * This module exists as the capture-toggle boundary and future extension\n * point (gc hooks, histograms, cluster awareness).\n */\nexport class PerformanceInstrumentation {\n constructor(private readonly ctx: InstrumentationContext) {}\n\n /** No-op: sampling is owned by core. Returns a no-op cleanup. */\n attach(): () => void {\n void this.ctx;\n return () => {};\n }\n}\n","import type { AppModuleNode, AppMemberNode, AppSnapshot, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { HttpInstrumentation } from './http';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\ninterface ContainerNode {\n id: string;\n name?: string;\n metatype?: Function;\n instance?: object;\n subtype?: 'httpController' | 'gateway';\n controllers?: Map<string, unknown>;\n providers?: Map<string, unknown>;\n}\n\n/**\n * Explore the Nest container to build the module graph (modules, controllers,\n * providers, guards, pipes...). Best effort: any failure keeps the app safe.\n */\nexport class AppExplorer {\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {}\n\n /** Walk the container and emit app.snapshot. Returns a no-op cleanup. */\n attach(app: INestApplication): () => void {\n try {\n const snapshot = this.buildSnapshot(app);\n emit('app.snapshot', snapshot);\n } catch {\n /* best effort */\n }\n return () => {};\n }\n\n private buildSnapshot(app: INestApplication): AppSnapshot {\n const internal = (app as unknown as { container?: unknown }).container as\n | { getModules?: () => Map<string, ContainerNode> }\n | undefined;\n\n const modules: AppModuleNode[] = [];\n const modulesMap = internal?.getModules?.();\n if (modulesMap) {\n for (const [id, node] of modulesMap) {\n const moduleName = node.metatype?.name ?? String(id);\n const members = this.extractMembers(node);\n modules.push({\n name: moduleName,\n imports: [],\n controllers: members.controllers,\n providers: members.providers,\n exports: [],\n });\n }\n }\n\n return {\n projectId: this.ctx.projectInfo.projectId,\n projectName: this.ctx.projectInfo.projectName,\n modules,\n nestjsVersion: this.ctx.projectInfo.nestjsVersion,\n capturedAt: Date.now(),\n };\n }\n\n private extractMembers(node: ContainerNode): { controllers: AppMemberNode[]; providers: AppMemberNode[] } {\n const controllers: AppMemberNode[] = [];\n const providers: AppMemberNode[] = [];\n\n const controllersMap = node.controllers;\n if (controllersMap instanceof Map) {\n for (const [id, wrapper] of controllersMap) {\n const member = this.memberFromWrapper(id, wrapper, 'controller');\n if (member) controllers.push(member);\n }\n }\n\n const providersMap = node.providers;\n if (providersMap instanceof Map) {\n for (const [id, wrapper] of providersMap) {\n const member = this.memberFromWrapper(id, wrapper);\n if (!member) continue;\n if (wrapper && (wrapper as { subtype?: string }).subtype === 'httpController') {\n controllers.push(member);\n } else {\n providers.push(member);\n }\n }\n }\n\n return { controllers, providers };\n }\n\n private memberFromWrapper(id: string, wrapper: unknown, forcedType?: AppMemberNode['type']): AppMemberNode | null {\n const w = wrapper as { name?: string; metatype?: Function; subtype?: string; instance?: Record<string, unknown> } | null;\n const name = w?.metatype?.name ?? (typeof id === 'string' ? id.replace(/^[A-Z_0-9]+:/, '') : 'unknown');\n const type = forcedType ?? classify(name, w?.instance);\n const routes = type === 'controller' ? extractControllerRoutes(w?.metatype) : undefined;\n return { name, type, routes };\n }\n}\n\n/** Heuristic classification of providers into guards/interceptors/pipes/filters. */\nfunction classify(name: string, instance?: Record<string, unknown>): AppMemberNode['type'] {\n if (name.endsWith('Gateway')) return 'gateway';\n if (name.endsWith('Guard')) return 'guard';\n if (name.endsWith('Interceptor')) return 'interceptor';\n if (name.endsWith('Pipe')) return 'pipe';\n if (name.endsWith('Filter')) return 'filter';\n if (instance && typeof instance.canActivate === 'function') return 'guard';\n if (instance && typeof instance.intercept === 'function') return 'interceptor';\n if (instance && typeof instance.transform === 'function') return 'pipe';\n if (instance && typeof instance.catch === 'function') return 'filter';\n return 'provider';\n}\n\n/** Best-effort extraction of controller routes from a controller metatype. */\nfunction extractControllerRoutes(metatype?: Function): string[] {\n if (!metatype) return [];\n try {\n const proto = metatype.prototype;\n if (!proto) return [];\n const props = Object.getOwnPropertyNames(proto).filter((name) => name !== 'constructor');\n const routes: string[] = [];\n for (const key of props) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (!desc?.value) continue;\n const value = desc.value;\n const routesForMethod = gatherHttpRoutes(value);\n for (const r of routesForMethod) {\n if (typeof r === 'string' && r.length > 0) routes.push(r);\n }\n }\n return routes;\n } catch {\n return [];\n }\n}\n\n/** Attempt to extract HTTP routes from a controller method via NestJS decorators. */\nfunction gatherHttpRoutes(value: Function): (string | undefined)[] {\n try {\n const decorators = (Reflect as any).getMetadata?.('design:http:method', {} as any, undefined, undefined) ?? [];\n const out: (string | undefined)[] = [];\n\n if (decorators.length > 0) {\n for (const d of decorators) {\n if (d && typeof d === 'object' && (d as any).method && (d as any).path) {\n out.push(`${String((d as any).method).toUpperCase()} ${String((d as any).path)}`);\n }\n }\n }\n\n if (typeof value === 'function') {\n const fn = value as any;\n const path = fn.PATH ?? undefined;\n const method = fn.METHOD ?? undefined;\n if (typeof path === 'string' && typeof method === 'string') {\n out.push(`${method.toUpperCase()} ${path}`);\n } else if (typeof path === 'string') {\n out.push(path);\n }\n }\n\n return out;\n } catch {\n return [];\n }\n}\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo, GatewayConnectionPayload, GatewayMessagePayload } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/**\n * WebSocket gateway instrumentation, best-effort.\n *\n * Detects @WebSocketGateway classes via the Nest container and reports\n * connection counts and message flow (received/sent) with redaction.\n * Does not intercept raw sockets unless the gateway exposes them.\n */\nexport class WebsocketInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach gateway hooks. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.websockets) return () => cleanup.forEach((fn) => fn());\n\n const gateways = this.detectGateways();\n for (const gw of gateways) {\n cleanup.push(this.wrapGateway(gw));\n }\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private detectGateways(): Array<{ name: string; instance: any }> {\n try {\n const app = this.getApp();\n if (!app) return [];\n const container = (app as any).container;\n if (!container) return [];\n const modules = container.getModules?.() ?? new Map();\n const out: Array<{ name: string; instance: any }> = [];\n for (const [id, node] of modules) {\n const providers = (node as any).providers;\n if (!providers || !(providers instanceof Map)) continue;\n for (const [key, wrapper] of providers) {\n const w = wrapper as any;\n if (!w || !w.instance) continue;\n const subtype = w.subtype ?? (node.subtype ?? null);\n if (subtype === 'gateway' || (w.instance && w.instance.constructor?.name?.endsWith('Gateway'))) {\n out.push({ name: w.name ?? key, instance: w.instance });\n }\n }\n }\n return out;\n } catch {\n return [];\n }\n }\n\n private wrapGateway(gw: { name: string; instance: any }): () => void {\n const instance = gw.instance;\n if (!instance || typeof instance !== 'object') return () => {};\n\n const hooks: Array<() => void> = [];\n const methods = [\n 'handleConnection',\n 'handleDisconnect',\n 'handleEvent',\n 'handleMessage',\n 'afterInit',\n 'beforeHandle',\n ];\n\n for (const method of methods) {\n if (typeof (instance as any)[method] !== 'function') continue;\n const orig = (instance as any)[method];\n const wrapped = this.buildGatewayWrapper(instance, method, orig);\n (instance as any)[method] = wrapped;\n hooks.push(() => {\n (instance as any)[method] = orig;\n });\n }\n\n return () => hooks.forEach((fn) => fn());\n }\n\n private buildGatewayWrapper(\n instance: any,\n method: string,\n original: (...args: any[]) => any,\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const started = Date.now();\n const requestId = requestContext().requestId() ?? randomId('ws');\n\n if (method === 'handleConnection' || method === 'afterInit') {\n emit('websocket.connected', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n namespace: this.estimateNamespace(args),\n connections: this.countConnections(instance),\n timestamp: Date.now(),\n } as GatewayConnectionPayload);\n }\n\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('received', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.receive:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n });\n }\n\n try {\n const result = await Promise.resolve(original.call(instance, ...args));\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('sent', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n status: 'ok',\n });\n }\n return result;\n } catch (err) {\n if (method === 'handleMessage' || method === 'handleEvent') {\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} error=${this.redactor.serialize(err)}`,\n status: 'error',\n });\n }\n throw err;\n }\n };\n }\n\n private emitMessage(\n direction: 'received' | 'sent',\n instance: any,\n args: any[],\n payload: unknown,\n requestId: string,\n startedAt: number,\n ): void {\n const preview = this.redactor.redact(payload);\n const serialized = this.redactor.serialize(payload);\n emit('websocket.message', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n event: this.estimateEvent(args),\n direction,\n payloadSize: Buffer.byteLength(serialized, 'utf8'),\n payloadPreview: preview,\n requestId,\n duration: Date.now() - startedAt,\n timestamp: Date.now(),\n } as GatewayMessagePayload);\n }\n\n private extractPayload(args: any[]): any {\n for (const arg of args) {\n if (arg && typeof arg === 'object' && !Buffer.isBuffer(arg) && !ArrayBuffer.isView(arg)) {\n return arg;\n }\n }\n return args[0];\n }\n\n private estimateEvent(args: any[]): string {\n const payload = this.extractPayload(args);\n if (!payload || typeof payload !== 'object') return 'message';\n return (payload.event as string) ?? (payload.type as string) ?? 'message';\n }\n\n private estimateNamespace(args: any[]): string {\n if (args.length > 0) {\n const first = args[0];\n if (first && typeof first === 'object' && first.namespace) return first.namespace;\n }\n return '/';\n }\n\n private countConnections(instance: any): number {\n try {\n if (instance.connections && typeof instance.connections === 'function') return instance.connections();\n if (instance.clients && typeof instance.clients === 'function') return instance.clients().size ?? 0;\n return 0;\n } catch {\n return 0;\n }\n }\n\n private estimateGatewayName(instance: any): string {\n return instance.constructor?.name ?? 'Gateway';\n }\n\n private getApp(): any {\n try {\n const ctx: any = this.ctxRaw;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/** Database instrumentation, best-effort provider detection. */\nexport class DatabaseInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach database hooks for detected clients. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n\n if (!this.config.capture.database) return () => cleanup.forEach((fn) => fn());\n\n if (this.tryAttachTypeOrm()) cleanup.push(this.detachTypeOrm());\n if (this.tryAttachPrisma()) cleanup.push(this.detachPrisma());\n if (this.tryAttachMongoose()) cleanup.push(this.detachMongoose());\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private tryAttachTypeOrm(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const dataSource = this.resolveTypeOrmDataSource(app);\n if (!dataSource) return false;\n\n if (typeof dataSource.query === 'function') {\n const originalQuery = dataSource.query.bind(dataSource);\n dataSource.__nestDevToolsOriginalQuery = originalQuery;\n dataSource.query = async (query: unknown, parameters?: unknown[]) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ?? []);\n try {\n const result = await originalQuery(query, parameters);\n this.endQuery(String(query), parameters ?? [], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(String(query), parameters ?? [], Date.now() - started, error);\n throw error;\n }\n };\n return true;\n }\n\n const listener = {\n beforeQuery: (query: string, parameters: unknown[]) => {\n this.startQuery(query, parameters);\n },\n afterQuery: (query: string, parameters: unknown[], durationMs: number) => {\n this.endQuery(query, parameters, durationMs);\n },\n };\n\n const sub = dataSource.subscriber;\n if (sub) {\n const before = sub.beforeQuery as ((q: string, p: unknown[]) => void) | undefined;\n const after = sub.afterQuery as ((q: string, p: unknown[], d: number) => void) | undefined;\n sub.beforeQuery = (q: string, p: unknown[]) => {\n try { before?.(q, p); } catch {}\n listener.beforeQuery(q, p);\n };\n sub.afterQuery = (q: string, p: unknown[], d: number) => {\n try { after?.(q, p, d); } catch {}\n listener.afterQuery(q, p, d);\n };\n } else {\n dataSource.subscriber = listener;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachTypeOrm(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const ds = this.resolveTypeOrmDataSource(app);\n if (!ds || !ds.subscriber) return;\n ds.subscriber = null;\n } catch {}\n };\n }\n\n private tryAttachPrisma(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return false;\n\n if (typeof prisma.$use === 'function') {\n prisma.$use(async (params: any, next: (args: any) => Promise<unknown>) => {\n const label = `${params.model ?? 'prisma'}.${params.action ?? 'query'}`;\n const started = Date.now();\n this.startQuery(label, [params.args]);\n try {\n const result = await next(params);\n this.endQuery(label, [params.args], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(label, [params.args], Date.now() - started, error);\n throw error;\n }\n });\n return true;\n }\n\n const original = prisma.$queryRaw ?? prisma.$executeRaw ?? null;\n if (!original) return false;\n\n const wrapped = (query: unknown, parameters?: unknown) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ? [parameters] : []);\n try {\n const result = original.call(prisma, query, parameters);\n if (result instanceof Promise) {\n return result.then((r) => {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return r;\n });\n }\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return result;\n } catch (err) {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started, err);\n throw err;\n }\n };\n\n prisma.$queryRaw = wrapped;\n prisma.$executeRaw = wrapped;\n return true;\n } catch {\n return false;\n }\n }\n\n private detachPrisma(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return;\n // restore original by removing wrapper and re-assigning? Not safe here.\n // We attempt a soft reset by clearing extension if possible.\n if (typeof prisma.$extends === 'function') prisma.$extends(prisma);\n } catch {}\n };\n }\n\n private tryAttachMongoose(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose) return false;\n\n const instrumentation = this;\n const hook = mongoose.plugin((schema: any, _name: string) => {\n if (!schema || typeof schema !== 'object') return;\n const hooks = schema.pre ?? null;\n if (typeof hooks !== 'function') return;\n const bound = hooks.bind(schema);\n if (!bound) return;\n const originalPre = bound as (method: string, fn: unknown) => void;\n schema.pre = function (method: string, fn: unknown) {\n if (method === 'find' || method === 'findOne' || method === 'findById' || method === 'aggregate' || method === 'countDocuments' || method === 'count') {\n const wrapped = async function (this: unknown, ...args: unknown[]) {\n const started = Date.now();\n const sql = `[Mongoose:${method}]`;\n instrumentation.startQuery(sql, args);\n try {\n const handler = fn as ((...args: unknown[]) => unknown) | null;\n if (!handler) return;\n const result = await handler.apply(this, args);\n instrumentation.endQuery(sql, args, Date.now() - started);\n return result;\n } catch (err) {\n instrumentation.endQuery(sql, args, Date.now() - started, err);\n throw err;\n }\n };\n originalPre(method, wrapped as unknown);\n } else {\n originalPre(method, fn as unknown);\n }\n };\n });\n\n if (typeof mongoose.plugin === 'function') mongoose.plugin(hook);\n return true;\n } catch {\n return false;\n }\n }\n\n private detachMongoose(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose || typeof mongoose.plugin !== 'function') return;\n // Soft reset: re-plugin empty to override previous plugin?\n // Not safe to undo; we leave best-effort.\n } catch {}\n };\n }\n\n private startQuery(sql: string, parameters: unknown[]): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n recordSpan(requestId, 'database', sql.slice(0, 120), {\n detail: `provider=${this.providerLabel()} parameters=${this.redactor.serialize(parameters)}`,\n });\n }\n\n private endQuery(\n sql: string,\n parameters: unknown[],\n durationMs: number,\n error?: unknown,\n ): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n const payload = {\n requestId,\n projectId: this.projectId,\n provider: this.providerLabel() as any,\n sql: sql.slice(0, 2000),\n duration: durationMs,\n parameters: this.redactor.redact(parameters),\n timestamp: Date.now(),\n };\n emit('query.executed', payload as any);\n }\n\n private providerLabel(): string {\n if (this.isTypeOrm()) return 'typeorm';\n if (this.isPrisma()) return 'prisma';\n if (this.isMongoose()) return 'mongoose';\n return 'other';\n }\n\n private isTypeOrm(): boolean {\n return !!this.resolveTypeOrmDataSource(this.getApp());\n }\n\n private isPrisma(): boolean {\n return !!this.resolvePrismaClient(this.getApp());\n }\n\n private isMongoose(): boolean {\n return !!this.resolveMongoose(this.getApp());\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctxRaw as any;\n if (ctx && typeof ctx === 'object' && (ctx as any).app) return (ctx as any).app;\n if (ctx && typeof ctx === 'object' && (ctx as any).getHttpAdapter) {\n return ctx as any;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveTypeOrmDataSource(app: any): any {\n try {\n const dataSource = this.findProvider(app, (value) => typeof value?.query === 'function' && typeof value?.manager === 'object');\n if (dataSource) return dataSource;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolvePrismaClient(app: any): any {\n try {\n const prisma = this.safeGet(app, 'PrismaService')\n ?? this.safeGet(app, 'PrismaClient')\n ?? this.safeGet(app, 'prisma')\n ?? this.findProvider(app, (value) => typeof value?.$queryRaw === 'function');\n if (prisma && typeof prisma.$queryRaw === 'function') return prisma;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveMongoose(app: any): any {\n try {\n const mongoose = this.safeGet(app, 'MongooseService')\n ?? this.safeGet(app, 'Mongoose')\n ?? this.safeGet(app, 'mongoose')\n ?? this.findProvider(app, (value) => typeof value?.plugin === 'function');\n if (mongoose && typeof mongoose.plugin === 'function') return mongoose;\n return null;\n } catch {\n return null;\n }\n }\n\n private safeGet(app: any, token: string): any {\n try {\n return app?.get?.(token, { strict: false }) ?? null;\n } catch {\n return null;\n }\n }\n\n private findProvider(app: any, predicate: (value: any) => boolean): any {\n try {\n const modules = app?.container?.getModules?.() ?? new Map();\n for (const module of modules.values()) {\n for (const wrapper of (module.providers?.values?.() ?? [])) {\n const instance = wrapper?.instance;\n if (instance && predicate(instance)) return instance;\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\n\n/** Queue/event instrumentation, best-effort and opt-in. */\nexport class QueueEventInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctx: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctx = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach queue hooks if a supported client is detected. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.requests && !this.config.capture.logs && !this.config.capture.errors) {\n return () => cleanup.forEach((fn) => fn());\n }\n\n if (this.tryAttachBull()) cleanup.push(this.detachBull());\n return () => cleanup.forEach((fn) => fn());\n }\n\n /** Register a queue span correlated with the active request, if any. */\n static recordJobSpan(\n queueName: string,\n jobId: string,\n label: string,\n options?: { source?: SourceLocation; status?: 'ok' | 'error' },\n ): void {\n const requestId = requestContext().requestId() ?? randomId('queue');\n recordSpan(requestId, 'queue', `${queueName}:${label} (${jobId})`, {\n detail: `queue=${queueName} job=${jobId}`,\n source: options?.source,\n status: options?.status,\n } as any);\n }\n\n /** Emit a log for queue events, correlated with the active request if any. */\n static emitJobLog(\n queueName: string,\n jobId: string,\n level: 'debug' | 'info' | 'warn' | 'error' | 'verbose',\n message: string,\n options?: { source?: SourceLocation },\n ): void {\n const requestId = requestContext().requestId();\n emit('log.created', {\n requestId,\n projectId: undefined,\n level,\n message: `[${queueName}] ${message} (${jobId})`,\n source: options?.source,\n context: queueName,\n processId: process.pid,\n timestamp: Date.now(),\n } as any);\n }\n\n private tryAttachBull(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const bull = this.resolveBull(app);\n if (!bull) return false;\n\n const origProcess = bull.prototype?.process ?? bull.process;\n if (typeof origProcess === 'function') {\n const wrapped = this.wrapProcess(origProcess, bull);\n if (bull.prototype) bull.prototype.process = wrapped;\n bull.process = wrapped;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachBull(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const bull = this.resolveBull(app);\n if (!bull) return;\n // Not safe to restore reliably; best-effort no-op.\n } catch {}\n };\n }\n\n private wrapProcess(original: Function, bull: any): Function {\n return async function (this: any, ...args: any[]) {\n const handler = args[0];\n if (!handler || typeof handler !== 'function') return original.apply(this, args);\n\n const wrapped = async (...handlerArgs: any[]) => {\n const job = handlerArgs[0];\n if (!job || typeof job !== 'object') return handler.apply(this, handlerArgs);\n\n const jobId = job.id ?? job.data?.jobId ?? randomId('job');\n const queueName = job.queueName ?? this.estimateQueueName(bull);\n const started = Date.now();\n\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', { status: 'ok' });\n try {\n const result = await Promise.resolve(handler.apply(this, handlerArgs));\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'ok',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'info', 'job completed', {\n source: resolveSourceLocation(new Error(), { skip: 2 }),\n });\n return result;\n } catch (err) {\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'error',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'error', String(err), {\n source: resolveSourceLocation(err instanceof Error ? err : new Error(), { skip: 2 }),\n });\n throw err;\n }\n };\n\n return original.apply(this, [wrapped, ...args.slice(1)]);\n };\n }\n\n private estimateQueueName(bull: any): string {\n try {\n if (bull.name) return bull.name;\n if (typeof bull === 'function') return bull.name;\n return 'queue';\n } catch {\n return 'queue';\n }\n }\n\n private resolveBull(app: any): any {\n try {\n const bull = app.get('BullService') ?? app.get('Bull') ?? app.get('bull') ?? app.get('Queue') ?? null;\n if (bull && (typeof bull.process === 'function' || typeof bull.prototype?.process === 'function')) return bull;\n return null;\n } catch {\n return null;\n }\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctx as any;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import { existsSync, readFileSync } from 'fs';\nimport { resolve } from 'path';\n\nlet cached: string | null | undefined;\n\n/** Best-effort detection of the host app's @nestjs/core version. */\nexport function detectNestJsVersion(): string | null {\n if (cached !== undefined) return cached;\n cached = null;\n try {\n const candidates = [\n resolve(process.cwd(), 'node_modules/@nestjs/core/package.json'),\n // bun/pnpm layouts: walk up a couple of levels\n resolve(process.cwd(), '../../node_modules/@nestjs/core/package.json'),\n ];\n for (const path of candidates) {\n if (!existsSync(path)) continue;\n const pkg = JSON.parse(readFileSync(path, 'utf8')) as { version?: string };\n if (pkg.version) {\n cached = pkg.version;\n break;\n }\n }\n } catch {\n cached = null;\n }\n return cached;\n}\n","/** SDK version reported to the DevTools server. Keep in sync with package.json. */\nexport const SDK_VERSION = '1.0.9';\n","import { writeOriginalConsole } from './instrumentation/console';\n\n/** ANSI escape helpers (kept tiny and dependency-free, mirrors the CLI renderer). */\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst WIDTH = 47;\n\nfunction colorEnabled(): boolean {\n // Respect NO_COLOR / non-TTY output the same way most CLIs do.\n if (process.env['NO_COLOR']) return false;\n return Boolean(process.stdout?.isTTY);\n}\n\nfunction paint(color: string, text: string): string {\n return colorEnabled() ? `${color}${text}${RESET}` : text;\n}\n\nfunction pad(label: string, value: string): string {\n const line = ` ${paint(GRAY, label.padEnd(9))} ${paint(CYAN, value)}`;\n return line;\n}\n\n/** Prints the boxed \"SDK started\" banner once, right after init(). */\nexport function printStartupBanner(info: { endpoint: string; dashboard: string; project: string }): void {\n const top = `${paint(GRAY, '┌' + '─'.repeat(WIDTH) + '┐')}`;\n const bottom = `${paint(GRAY, '└' + '─'.repeat(WIDTH) + '┘')}`;\n const title = ` ${paint(BOLD + CYAN, 'NestJS DevTools')} ${paint(GREEN, '●')} ${paint(DIM, `(${info.project})`)}`;\n\n writeOriginalConsole('log', '');\n writeOriginalConsole('log', top);\n writeOriginalConsole('log', title);\n writeOriginalConsole('log', pad('Endpoint', info.endpoint));\n writeOriginalConsole('log', pad('Dashboard', info.dashboard));\n writeOriginalConsole('log', `${paint(GRAY, ' Estado')} ${paint(YELLOW, '◌ conectando…')}`);\n writeOriginalConsole('log', bottom);\n}\n\n/** Prints a single status line once the transport's connection state is known. */\nexport function printConnectionStatus(state: 'open' | 'offline', dashboard: string): void {\n if (state === 'open') {\n writeOriginalConsole('log', ` ${paint(GREEN, '✓')} Conectado al dashboard ${paint(DIM, `(${dashboard})`)}`);\n return;\n }\n writeOriginalConsole('log', ` ${paint(YELLOW, '⚠')} No se pudo conectar al dashboard todavía.`);\n writeOriginalConsole('log', ` ${paint(DIM, '¿Aún no lo instalaste? →')} ${paint(BOLD, 'bun add -g @angelitosystems/nest-devtools-cli')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Luego, en otra terminal: →')} ${paint(BOLD, 'nest-devtools start')}`);\n writeOriginalConsole('log', ` ${paint(DIM, '(sin instalar, una sola vez: npx -p @angelitosystems/nest-devtools-cli nest-devtools start)')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Reintentando en segundo plano — se conectará solo cuando el dashboard esté arriba.')}`);\n}","import type { INestApplication } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { emit } from './emitter';\n\nexport interface PluginContext {\n readonly config: DevToolsConfig;\n readonly project: ProjectInfo;\n readonly redactor: Redactor;\n emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void;\n custom(name: string, data?: unknown): void;\n}\n\nexport interface DevToolsPlugin {\n readonly name: string;\n onInit?(context: PluginContext): void | Promise<void>;\n onAttach?(app: INestApplication, context: PluginContext): void | (() => void) | Promise<void | (() => void)>;\n onDispose?(): void | Promise<void>;\n}\n\n/** Runs third-party instrumentation without allowing it to affect the app. */\nexport class PluginManager {\n private readonly cleanups: Array<() => void> = [];\n private readonly initialized: DevToolsPlugin[] = [];\n\n constructor(private readonly plugins: DevToolsPlugin[]) {}\n\n attach(app: INestApplication, config: DevToolsConfig, project: ProjectInfo): () => void {\n const redactor = new Redactor({ redact: config.redact, allow: config.allow, maxBytes: config.maxPayloadBytes });\n const context: PluginContext = {\n config,\n project,\n redactor,\n emit: (event, payload) => {\n try { emit(event, redactor.redact(payload) as DevToolsEventMap[typeof event]); } catch { /* plugin isolation */ }\n },\n custom: (name, data) => {\n try {\n emit('plugin.event', {\n projectId: project.projectId,\n plugin: 'custom',\n name,\n data: redactor.redact(data),\n timestamp: Date.now(),\n });\n } catch { /* plugin isolation */ }\n },\n };\n\n for (const plugin of this.plugins) {\n if (!plugin || !plugin.name) continue;\n this.initialized.push(plugin);\n this.run(plugin.name, () => plugin.onInit?.(context));\n this.run(plugin.name, async () => {\n const cleanup = await plugin.onAttach?.(app, context);\n if (typeof cleanup === 'function') this.cleanups.push(cleanup);\n });\n }\n\n return () => {\n for (const cleanup of this.cleanups.splice(0)) {\n try { cleanup(); } catch { /* plugin isolation */ }\n }\n for (const plugin of this.initialized.splice(0)) this.run(plugin.name, () => plugin.onDispose?.());\n };\n }\n\n private run(name: string, operation: () => void | Promise<void>): void {\n try {\n const result = operation();\n if (result && typeof (result as Promise<void>).then === 'function') {\n void (result as Promise<void>).catch((error) => this.reportFailure(name, error));\n }\n } catch (error) {\n this.reportFailure(name, error);\n }\n }\n\n private reportFailure(name: string, error: unknown): void {\n try {\n emit('log.created', {\n projectId: 'plugin-system',\n level: 'error',\n message: `DevTools plugin ${name} failed: ${error instanceof Error ? error.message : String(error)}`,\n processId: process.pid,\n timestamp: Date.now(),\n context: 'plugin',\n });\n } catch { /* plugin isolation */ }\n }\n}\n","/**\n * @angelitosystems/nest-devtools\n *\n * Drop-in real-time debugging and observability for NestJS.\n *\n * Usage:\n * import { NestDevTools } from '@angelitosystems/nest-devtools';\n * const app = await NestFactory.create(AppModule);\n * NestDevTools.init(app);\n */\nexport { NestDevTools, devtools } from './sdk';\nexport type { InitResult, NestDevToolsOptions } from './sdk';\nexport { PluginManager } from './plugins';\nexport type { DevToolsPlugin, PluginContext } from './plugins';\nexport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\nexport { captureError } from './instrumentation/exceptions';\nexport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nexport { requestContext } from '@angelitosystems/devtools-core';\nexport type { RequestContext } from '@angelitosystems/devtools-core';\n"],"mappings":"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","names":["coreDevtools","capture","Redactor","requestContext","Redactor","requestContext","Redactor","requestContext","resolveSourceLocation","Redactor","requestContext","resolveSourceLocation","requestContext","resolveSourceLocation","resolveSourceLocation","requestContext","requestContext","Redactor","randomId","Redactor","requestContext","randomId","requestContext","Redactor","randomId","Redactor","requestContext","randomId","requestContext","Redactor","randomId","resolveSourceLocation","Redactor","requestContext","randomId","Redactor","Redactor","coreDevtools","requestContext"]}
1
+ {"version":3,"sources":["../src/sdk.ts","../src/instrumentation/http.ts","../src/emitter.ts","../src/instrumentation/timeline.ts","../src/instrumentation/console.ts","../src/instrumentation/nest-logger.ts","../src/instrumentation/exceptions.ts","../src/instrumentation/performance.ts","../src/instrumentation/app-explorer.ts","../src/instrumentation/websockets.ts","../src/instrumentation/database.ts","../src/instrumentation/queue.ts","../src/detect.ts","../src/version.ts","../src/banner.ts","../src/plugins.ts","../src/index.ts"],"sourcesContent":["import { hostname } from 'os';\nimport { devtools as coreDevtools, resolveConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { HttpInstrumentation } from './instrumentation/http';\nimport { ConsoleInstrumentation } from './instrumentation/console';\nimport { LoggerInstrumentation } from './instrumentation/nest-logger';\nimport { ExceptionsInstrumentation, captureError } from './instrumentation/exceptions';\nimport { PerformanceInstrumentation } from './instrumentation/performance';\nimport { AppExplorer } from './instrumentation/app-explorer';\nimport { WebsocketInstrumentation } from './instrumentation/websockets';\nimport { DatabaseInstrumentation } from './instrumentation/database';\nimport { QueueEventInstrumentation } from './instrumentation/queue';\nimport { detectNestJsVersion } from './detect';\nimport { SDK_VERSION } from './version';\nimport { printStartupBanner, printConnectionStatus } from './banner';\nimport { PluginManager } from './plugins';\nimport type { DevToolsPlugin } from './plugins';\nimport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\n\n/** Result of calling NestDevTools.init(). */\nexport interface InitResult {\n /** True when instrumentation is live. */\n enabled: boolean;\n /** Reason when partially or fully disabled. */\n reason?: 'disabled-by-config' | 'already-initialized' | 'no-http-adapter';\n projectId: string;\n projectName: string;\n server: string;\n}\n\nexport type NestDevToolsOptions = DevToolsUserConfig & { plugins?: DevToolsPlugin[] };\n\n/**\n * Main entry point: `NestDevTools.init(app, config?)`.\n *\n * Never throws, never blocks startup, and disables itself in production\n * unless explicitly enabled.\n */\nexport class NestDevTools {\n private static readonly cleanups: Array<() => void> = [];\n private static initialized = false;\n\n /** Initialize DevTools for a NestJS application. One active instance per process. */\n static init(app: INestApplication, userConfig?: NestDevToolsOptions): InitResult {\n const config = resolveConfig(userConfig);\n const disabled: InitResult = {\n enabled: false,\n reason: 'disabled-by-config',\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n server: config.server,\n };\n\n if (this.initialized) return { ...disabled, reason: 'already-initialized' };\n if (!config.enabled) return disabled; // zero side effects: no patching, no sockets, no timers\n\n this.initialized = true;\n const registerCleanup = (fn: () => void) => this.cleanups.push(fn);\n\n const projectInfo: ProjectInfo = {\n projectId: config.projectId,\n projectName: config.project ?? config.projectId,\n environment: config.environment,\n hostname: safeHostname(),\n port: null,\n pid: process.pid,\n runtime: detectRuntime(),\n runtimeVersion: detectRuntimeVersion(),\n nodeVersion: process.version,\n nestjsVersion: detectNestJsVersion(),\n sdkVersion: SDK_VERSION,\n };\n\n // transport is fully async: a missing server never affects startup\n let hasWarnedOffline = false;\n coreDevtools.initialize({\n config,\n projectInfo,\n registerCleanup,\n onStateChange: (state: any) => {\n if (state === 'open') {\n printConnectionStatus('open', dashboardUrl(config.server));\n } else if (state === 'retrying' && !hasWarnedOffline) {\n hasWarnedOffline = true;\n printConnectionStatus('offline', dashboardUrl(config.server));\n }\n },\n } as any);\n\n if (userConfig?.plugins && userConfig.plugins.length > 0) {\n registerCleanup(new PluginManager(userConfig.plugins).attach(app, config, projectInfo));\n }\n\n const adapter = app.getHttpAdapter();\n const httpReady = Boolean(adapter && ['http', 'express'].includes(adapter.getType()));\n\n // ---- HTTP instrumentation -------------------------------------------\n const http = new HttpInstrumentation({ config, projectInfo });\n registerCleanup(http.attach(app));\n\n // ---- console + NestJS Logger + global errors ------------------------\n registerCleanup(new ConsoleInstrumentation({ config, projectInfo }).attach());\n registerCleanup(new LoggerInstrumentation({ config, projectInfo }).attach());\n registerCleanup(ExceptionsInstrumentation.attach({ config, projectInfo }));\n\n // ---- performance sampling -------------------------------------------\n registerCleanup(new PerformanceInstrumentation({ config, projectInfo }).attach());\n\n // ---- application graph ----------------------------------------------\n registerCleanup(new AppExplorer({ config, projectInfo }).attach(app));\n\n // ---- websockets + database + queues (best effort) ------------------\n if (config.capture.websockets) {\n registerCleanup(new WebsocketInstrumentation({ config, projectInfo }).attach());\n }\n if (config.capture.database) {\n registerCleanup(new DatabaseInstrumentation({ config, projectInfo }).attach());\n }\n registerCleanup(new QueueEventInstrumentation({ config, projectInfo }).attach());\n\n printStartupBanner({\n endpoint: config.server,\n dashboard: dashboardUrl(config.server),\n project: projectInfo.projectName,\n });\n\n return {\n enabled: true,\n projectId: config.projectId,\n projectName: projectInfo.projectName,\n server: config.server,\n ...(httpReady ? {} : { reason: 'no-http-adapter' as const }),\n };\n }\n\n /** Teardown everything (mostly useful in tests). */\n static destroy(): void {\n for (const cleanup of this.cleanups.splice(0)) {\n try {\n cleanup();\n } catch {\n /* ignore */\n }\n }\n this.initialized = false;\n coreDevtools.shutdown();\n }\n\n /** Whether the SDK is currently active in this process. */\n static isActive(): boolean {\n return this.initialized;\n }\n\n /** Start an explicit CPU or heap profile. */\n static startProfile(kind: ProfileKind): Promise<{ profileId: string; startedAt: number }> {\n return coreDevtools.startProfile(kind);\n }\n\n /** Stop the active profile and return its captured result. */\n static stopProfile(): Promise<ProfileResult> {\n return coreDevtools.stopProfile();\n }\n}\n\n/** Convenience functional alias: devtools.init(app). */\nexport const devtools = {\n init: NestDevTools.init.bind(NestDevTools),\n destroy: NestDevTools.destroy.bind(NestDevTools),\n isActive: NestDevTools.isActive.bind(NestDevTools),\n startProfile: NestDevTools.startProfile.bind(NestDevTools),\n stopProfile: NestDevTools.stopProfile.bind(NestDevTools),\n};\n\nfunction safeHostname(): string {\n try {\n return hostname();\n } catch {\n return 'unknown';\n }\n}\n\nfunction detectRuntime(): string {\n const versions = process.versions as Record<string, string | undefined>;\n if (versions['bun']) return 'bun';\n if (versions['deno']) return 'deno';\n return 'node';\n}\n\nfunction detectRuntimeVersion(): string {\n const versions = process.versions as Record<string, string | undefined>;\n return versions['bun'] ?? versions['deno'] ?? process.version;\n}\n\nfunction dashboardUrl(server: string): string {\n try {\n const url = new URL(server);\n url.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';\n const port = Number(url.port);\n url.port = String(Number.isFinite(port) && port > 0 ? port - 1 : 4317);\n url.pathname = '';\n url.search = '';\n url.hash = '';\n return url.toString().replace(/\\/$/, '');\n } catch {\n return 'http://localhost:4317';\n }\n}\n\nexport { captureError };","import type { IncomingMessage, ServerResponse, Server as HttpServer } from 'http';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport type {\n ProjectInfo,\n RequestCompletedPayload,\n RequestStartedPayload,\n TimelineSpan,\n} from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { recordSpan, trackSpans } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\n/** Shared context every instrumentation module receives. */\nexport interface InstrumentationContext {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n}\n\n/** Request headers captured by default (denylist still applies). */\nconst REQUEST_HEADERS = [\n 'content-type',\n 'content-length',\n 'accept',\n 'origin',\n 'referer',\n 'user-agent',\n 'x-forwarded-for',\n 'x-request-id',\n 'x-forwarded-proto',\n] as const;\n\n/** Response headers captured by default. */\nconst RESPONSE_HEADERS = [\n 'content-type',\n 'content-length',\n 'location',\n 'set-cookie',\n 'x-request-id',\n 'x-response-time',\n] as const;\n\ntype RequestListener = (req: IncomingMessage, res: ServerResponse) => void;\n\nconst WRAPPED = Symbol('nest-devtools.wrapped');\n\n/**\n * Instrument the HTTP server of a NestJS application.\n *\n * Covers both bootstrap orders without touching Node module internals:\n * - `NestDevTools.init(app)` after `app.listen()`: the server already exists\n * and is wrapped immediately.\n * - `NestDevTools.init(app)` before `app.listen()` (recommended): `app.listen`\n * is wrapped so the server is wrapped the moment it exists.\n */\nexport class HttpInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: InstrumentationContext) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Begin capturing HTTP requests. Returns a cleanup function. */\n attach(app: INestApplication): () => void {\n try {\n const adapter = app.getHttpAdapter();\n // 'http' = platform-default adapter, 'express' = @nestjs/platform-express\n if (!adapter || !['http', 'express'].includes(adapter.getType())) return () => {};\n\n const getServer = (): HttpServer | undefined =>\n (adapter as unknown as { getHttpServer?: () => HttpServer }).getHttpServer?.();\n\n // 1) server already exists (init called after listen)\n const existing = getServer();\n if (existing) {\n this.wrapServer(existing);\n return () => {};\n }\n\n // 2) init called before listen: wrap the server once listen() resolves\n const appLike = app as unknown as { listen: (...args: unknown[]) => unknown };\n const originalListen = appLike.listen.bind(app);\n const self = this;\n const patchedListen = (...args: unknown[]) => {\n const result = originalListen(...args);\n Promise.resolve(result)\n .then(() => {\n const server = getServer();\n if (server) self.wrapServer(server);\n })\n .catch(() => {\n /* listen failed — the app will surface its own error */\n });\n return result;\n };\n appLike.listen = patchedListen;\n\n return () => {\n appLike.listen = originalListen;\n };\n } catch {\n return () => {};\n }\n }\n\n /** Wrap the 'request' listeners of a server exactly once. */\n private wrapServer(server: HttpServer): void {\n const target = server as unknown as Record<symbol, unknown>;\n if (target[WRAPPED]) return;\n target[WRAPPED] = true;\n\n const self = this;\n const originalListeners = server.rawListeners('request') as RequestListener[];\n\n server.removeAllListeners('request');\n server.on('request', (req, res) => {\n self.instrumentRequest(req, res, () => {\n for (const listener of originalListeners) {\n listener.call(server, req, res);\n }\n });\n });\n }\n\n /** Wrap a single request lifecycle. */\n private instrumentRequest(req: IncomingMessage, res: ServerResponse, next: () => void): void {\n if (!this.ctx.config.capture.requests) {\n next();\n return;\n }\n\n const startedAt = Date.now();\n const requestId = randomId('req');\n const method = (req.method ?? 'GET').toUpperCase();\n const rawUrl = req.url ?? '/';\n const url = safeUrlPath(rawUrl);\n\n const spans: TimelineSpan[] = [];\n const unregister = trackSpans(requestId, spans);\n res.once('finish', unregister);\n\n const started: RequestStartedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n headers: this.collectRequestHeaders(req),\n query: parseQuery(rawUrl),\n ip: clientIp(req),\n userAgent: asString(req.headers['user-agent']) || undefined,\n startedAt,\n };\n\n const middlewareSpan: TimelineSpan = {\n layer: 'middleware',\n label: `${method} ${url}`,\n duration: 0,\n startedAt,\n status: 'ok',\n };\n spans.push(middlewareSpan);\n\n const capturedBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n const responseCapture = createResponseCapture(res, this.ctx.config.maxPayloadBytes, this.redactor);\n\n const onFinished = () => {\n const finishedAt = Date.now();\n middlewareSpan.duration = Math.max(0, finishedAt - middlewareSpan.startedAt);\n middlewareSpan.status = res.statusCode >= 500 ? 'error' : 'ok';\n\n const responseSpan: TimelineSpan = {\n layer: 'response',\n label: 'response',\n duration: 0,\n startedAt: finishedAt,\n status: res.statusCode >= 400 ? 'error' : 'ok',\n };\n spans.push(responseSpan);\n\n const responseHeaders = this.collectResponseHeaders(res);\n const responsePreview = responseCapture.read();\n const requestBody = this.ctx.config.capture.requests && this.ctx.config.maxPayloadBytes > 0\n ? captureRequestPreview(req, this.redactor)\n : undefined;\n\n const errored = res.statusCode >= 500;\n\n const completed: RequestCompletedPayload = {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n method,\n url,\n route: routeFromReq(req),\n statusCode: res.statusCode,\n duration: finishedAt - startedAt,\n startedAt,\n timeline: spans,\n requestHeaders: started.headers,\n query: parseQuery(rawUrl),\n headers: responseHeaders,\n responsePreview,\n requestBody: requestBody ?? capturedBody,\n errored,\n };\n\n emit('request.completed', completed);\n\n // NestJS exception filters turn controller errors into 5xx responses\n // without any process-level signal — surface them in the Error Explorer.\n if (errored) {\n emit('error.created', {\n requestId,\n projectId: this.ctx.projectInfo.projectId,\n name: 'HttpError',\n message: `${method} ${url} failed with status ${res.statusCode}`,\n fingerprint: httpErrorFingerprint(method, url, res.statusCode),\n request: { method, url: String(url), statusCode: res.statusCode },\n timestamp: finishedAt,\n });\n }\n };\n\n const context = requestContext();\n context.run({ requestId, method, url, startedAt }, () => {\n emit('request.started', started);\n res.once('finish', onFinished);\n next();\n });\n }\n\n private collectRequestHeaders(req: IncomingMessage): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : asString(value).slice(0, 200);\n }\n return out;\n }\n\n private collectResponseHeaders(res: ServerResponse): Record<string, string> {\n const out: Record<string, string> = {};\n const headers = typeof res.getHeaders === 'function' ? res.getHeaders() : {};\n\n for (const rawKey of Object.keys(headers)) {\n const key = rawKey.toLowerCase();\n const raw = headers[rawKey] as string | number | string[] | undefined ?? '';\n const value = String(raw);\n if (value === '') continue;\n out[key] = this.redactor.isSensitive(key) ? '[REDACTED]' : value.slice(0, 200);\n }\n return out;\n }\n}\n\nfunction asString(value: string | string[] | undefined): string {\n if (Array.isArray(value)) return value.join(', ');\n return value ?? '';\n}\n\n/** Stable fingerprint for framework-handled HTTP failures. */\nfunction httpErrorFingerprint(method: string, url: string, statusCode: number): string {\n const route = url.replace(/\\/\\d+(?=\\/|$)/g, '/:id'); // group /users/15 with /users/16\n const raw = `${method}::${route}::${statusCode}`;\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction safeUrlPath(raw: string): string {\n const index = raw.indexOf('?');\n return index === -1 ? raw : raw.slice(0, index);\n}\n\nfunction parseQuery(raw: string): Record<string, unknown> {\n const index = raw.indexOf('?');\n if (index === -1) return {};\n const out: Record<string, unknown> = {};\n for (const [key, value] of new URLSearchParams(raw.slice(index + 1))) {\n out[key] = value;\n }\n return out;\n}\n\nfunction clientIp(req: IncomingMessage): string | undefined {\n const forwarded = req.headers['x-forwarded-for'];\n if (typeof forwarded === 'string') return forwarded.split(',')[0]?.trim();\n return req.socket?.remoteAddress ?? undefined;\n}\n\n/** Best-effort route extraction from Express/Nest request. */\nfunction routeFromReq(req: IncomingMessage): string | undefined {\n try {\n const http = req as unknown as { httpVersion?: string };\n const out: RequestStartedPayload = {\n requestId: '',\n projectId: '',\n method: '',\n url: '',\n route: undefined,\n headers: {},\n query: {},\n ip: undefined,\n userAgent: undefined,\n startedAt: 0,\n };\n const routeRaw: unknown = (req as unknown as Record<string, unknown>).route;\n if (routeRaw && typeof routeRaw === 'object' && routeRaw !== null) {\n const route = routeRaw as { name?: unknown };\n const name = route.name as string | undefined;\n if (typeof name === 'string' && name.length > 0) return name;\n }\n const path = (req as unknown as { baseUrl?: string }).baseUrl\n ?? (req as any).path;\n if (typeof path === 'string' && path.length > 0) return path;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the request body (limited, redacted). */\nfunction captureRequestPreview(req: IncomingMessage, redactor: Redactor): unknown {\n try {\n const body = (req as unknown as Record<string, unknown>).body;\n if (body === undefined || body === null) return undefined;\n return redactor.redact(body);\n } catch {\n return undefined;\n }\n}\n\n/** Capture a safe preview of the response body after the response finishes. */\nfunction captureResponsePreview(res: ServerResponse, redactor: Redactor): string | undefined {\n try {\n const resLike = res as unknown as Record<string, unknown>;\n const body = resLike.body;\n if (body === undefined || body === null) return undefined;\n if (typeof body === 'string') return redactor.redactString(body);\n return redactor.serialize(body);\n } catch {\n return undefined;\n }\n}\n\nfunction createResponseCapture(\n res: ServerResponse,\n maxBytes: number,\n redactor: Redactor,\n): { read: () => string | undefined } {\n if (maxBytes <= 0) return { read: () => undefined };\n const chunks: Buffer[] = [];\n let size = 0;\n const originalWrite = res.write.bind(res);\n const originalEnd = res.end.bind(res);\n const capture = (chunk: unknown): void => {\n if (chunk === undefined || chunk === null || size >= maxBytes) return;\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));\n const remaining = maxBytes - size;\n chunks.push(buffer.subarray(0, remaining));\n size += Math.min(buffer.length, remaining);\n };\n (res as any).write = (chunk: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalWrite(chunk as any, ...(args as any));\n };\n (res as any).end = (chunk?: unknown, ...args: unknown[]) => {\n capture(chunk);\n return originalEnd(chunk as any, ...(args as any));\n };\n res.once('finish', () => {\n (res as any).write = originalWrite;\n (res as any).end = originalEnd;\n });\n return {\n read: () => {\n if (chunks.length === 0) return undefined;\n const raw = Buffer.concat(chunks).toString('utf8');\n return redactor.redactString(raw);\n },\n };\n}\n\nexport { safeUrlPath, parseQuery, clientIp, routeFromReq };\n","import { devtools as coreDevtools } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName } from '@angelitosystems/devtools-protocol';\n\n/** Emit a typed protocol event to the DevTools server (fire-and-forget). */\nexport function emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void {\n try {\n coreDevtools.send(event, payload);\n } catch {\n /* instrumentation must never break the app */\n }\n}\n","import type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\n\n/** Create a started span inside a request's span list. */\nexport function startSpan(\n spans: TimelineSpan[],\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): TimelineSpan {\n const span: TimelineSpan = {\n layer,\n label,\n duration: 0,\n startedAt: Date.now(),\n status: options?.status ?? 'ok',\n ...(options?.detail !== undefined ? { detail: options.detail } : {}),\n ...(options?.source !== undefined ? { source: options.source } : {}),\n };\n spans.push(span);\n return span;\n}\n\n/** Finalize a span, computing its duration. */\nexport function endSpan(span: TimelineSpan, status?: 'ok' | 'error'): void {\n span.duration = Math.max(0, Date.now() - span.startedAt);\n if (status) span.status = status;\n}\n\n/**\n * Registry of active request timelines, keyed by requestId.\n * Lets deeper instrumentation (database, websockets) attach spans to the\n * request that caused them, using the AsyncLocalStorage request id.\n */\nconst recorders = new Map<string, TimelineSpan[]>();\n\n/** Register a request's span list. Returns an unregister callback. */\nexport function trackSpans(requestId: string, spans: TimelineSpan[]): () => void {\n recorders.set(requestId, spans);\n return () => recorders.delete(requestId);\n}\n\n/** Add an auto-ended span to a request if it is still active. */\nexport function recordSpan(\n requestId: string,\n layer: string,\n label: string,\n options?: { detail?: string; source?: SourceLocation; status?: 'ok' | 'error' },\n): void {\n const spans = recorders.get(requestId);\n if (!spans) return;\n const span = startSpan(spans, layer, label, options);\n endSpan(span, options?.status);\n}\n","import { Console } from 'console';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\nconst METHODS = ['log', 'info', 'warn', 'error', 'debug'] as const;\ntype ConsoleMethod = (typeof METHODS)[number];\n\nconst LEVEL_BY_METHOD: Record<ConsoleMethod, LogLevel> = {\n log: 'info',\n info: 'info',\n warn: 'warn',\n error: 'error',\n debug: 'debug',\n};\n\n/** Original console bound directly to the process streams. */\nconst originalConsole = new Console({\n stdout: process.stdout,\n stderr: process.stderr,\n colorMode: 'auto',\n});\n\n/** Write through the untouched console (used by DevTools' own logging). */\nexport function writeOriginalConsole(method: ConsoleMethod, ...args: unknown[]): void {\n const fn = (originalConsole as unknown as Record<string, (...a: unknown[]) => void>)[method];\n if (fn) fn.apply(originalConsole, args);\n}\n\n/** Capture console output and mirror it to DevTools. */\nexport class ConsoleInstrumentation {\n private readonly redactor: Redactor;\n\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n this.redactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n }\n\n /** Patch console methods. Returns a restore function. */\n attach(): () => void {\n const self = this;\n const restores: Array<() => void> = [];\n\n for (const method of METHODS) {\n const original = (console as unknown as Record<string, unknown>)[method];\n if (typeof original !== 'function') continue;\n\n const patched = (...args: unknown[]) => {\n try {\n (original as (...a: unknown[]) => void).apply(console, args);\n } catch {\n /* never break host logging */\n }\n self.capture(method, args);\n };\n\n (console as unknown as Record<string, unknown>)[method] = patched;\n restores.push(() => {\n (console as unknown as Record<string, unknown>)[method] = original;\n });\n }\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n\n private capture(method: ConsoleMethod, args: unknown[]): void {\n if (!this.ctx.config.capture.logs) return;\n try {\n const level = LEVEL_BY_METHOD[method];\n const payload: LogPayload = {\n projectId: this.ctx.projectInfo.projectId,\n level,\n message: formatMessage(args, this.redactor),\n arguments: args.length > 0 ? (this.redactor.redact(args) as unknown[]) : undefined,\n stack: method === 'error' ? captureStack() : undefined,\n source: resolveSourceLocation(captureStack() ?? '', { skip: 0 }),\n context: undefined,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n if (method === 'error') payload.level = 'error';\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n }\n}\n\nfunction formatMessage(args: unknown[], redactor: Redactor): string {\n if (args.length === 0) return '';\n const first = args[0];\n if (typeof first === 'string') {\n return args.length === 1 ? redactor.redactString(first) : `${first} ${redactor.serialize(args.slice(1))}`;\n }\n return redactor.serialize(args);\n}\n\nfunction captureStack(): string | undefined {\n const err = new Error();\n const stack = err.stack;\n if (!stack) return undefined;\n // drop the frames created by this helper\n return stack.split('\\n').slice(3).join('\\n');\n}\n","import { Logger } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { LogPayload, LogLevel, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { requestContext, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\n/**\n * Captures NestJS framework logs (`new Logger('Ctx').log(...)` and the static\n * `Logger.log(...)` variants). Nest's Logger writes through process.stdout\n * internals, not console.*, so it needs its own hook.\n *\n * State is module-scoped on purpose: the patched methods are plain functions\n * and must never depend on class-instance `this` binding.\n */\nlet activeRedactor = new Redactor();\nlet activeConfig: DevToolsConfig | null = null;\nlet activeProjectId = '';\n\nfunction capture(level: LogLevel, message: unknown, context?: string, stack?: string): void {\n try {\n if (!activeConfig?.capture.logs) return;\n const text = typeof message === 'string' ? message : activeRedactor.serialize(message);\n const payload: LogPayload = {\n projectId: activeProjectId,\n level,\n message: activeRedactor.redactString(text),\n source: stack ? undefined : resolveSdkAwareLocation(),\n context,\n stack,\n processId: process.pid,\n requestId: requestContext().requestId(),\n timestamp: Date.now(),\n };\n emit('log.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\n/** Captures NestJS Logger output and mirrors it to DevTools. */\nexport class LoggerInstrumentation {\n constructor(ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {\n activeRedactor = new Redactor({\n redact: ctx.config.redact,\n allow: ctx.config.allow,\n maxBytes: ctx.config.maxPayloadBytes,\n });\n activeConfig = ctx.config;\n activeProjectId = ctx.projectInfo.projectId;\n }\n\n /** Patch Logger.prototype and the static Logger methods. Returns a restore function. */\n attach(): () => void {\n const restores: Array<() => void> = [];\n\n const patch = (owner: Record<string, unknown>, method: string, level: LogLevel, instance: boolean) => {\n const original = owner[method];\n if (typeof original !== 'function') return;\n\n owner[method] = function (this: unknown, message: unknown, ...rest: unknown[]) {\n const context = instance\n ? ((this as { context?: string } | undefined)?.context ?? (rest[0] as string | undefined))\n : (rest[0] as string | undefined);\n const stack = rest[1] as string | undefined;\n try {\n const result = (original as (...a: unknown[]) => unknown).apply(this, [message, ...rest]);\n capture(level, message, context, stack);\n return result;\n } catch (err) {\n capture(level, message, context, stack);\n throw err;\n }\n };\n\n restores.push(() => {\n owner[method] = original;\n });\n };\n\n // instance loggers: `new Logger('Ctx').log(...)` — the common case\n const proto = Logger.prototype as unknown as Record<string, unknown>;\n patch(proto, 'log', 'info', true);\n patch(proto, 'error', 'error', true);\n patch(proto, 'warn', 'warn', true);\n patch(proto, 'debug', 'debug', true);\n patch(proto, 'verbose', 'verbose', true);\n\n // static loggers: `Logger.log(...)`\n const statics = Logger as unknown as Record<string, unknown>;\n patch(statics, 'log', 'info', false);\n patch(statics, 'error', 'error', false);\n patch(statics, 'warn', 'warn', false);\n patch(statics, 'debug', 'debug', false);\n patch(statics, 'verbose', 'verbose', false);\n\n return () => {\n for (const restore of restores.splice(0)) restore();\n };\n }\n}\n\nfunction resolveSdkAwareLocation(): LogPayload['source'] {\n try {\n const err = new Error();\n const stack = err.stack?.split('\\n').slice(3).join('\\n');\n return resolveSourceLocation(stack ?? '', { skip: 0 });\n } catch {\n return undefined;\n }\n}\n","import { basename } from 'path';\nimport type { ErrorPayload, ProjectInfo, SourceLocation } from '@angelitosystems/devtools-protocol';\nimport { requestContext, safeStringify, resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\n\nimport { emit } from '../emitter';\n\ntype InstrumentationCtx = {\n config: DevToolsConfig;\n projectInfo: ProjectInfo;\n};\n\n/**\n * Global error capture via process-level hooks. Errors handled by NestJS\n * filters surface through request.completed; unexpected errors land here.\n */\nexport class ExceptionsInstrumentation {\n /** Attach process-level hooks. Returns a detach function. */\n static attach(ctx: InstrumentationCtx): () => void {\n const onUncaught = (error: unknown): void => {\n reportError(error, ctx, { source: 'uncaughtException' });\n };\n const onRejection = (reason: unknown): void => {\n reportError(reason, ctx, { source: 'unhandledRejection' });\n };\n\n process.on('uncaughtException', onUncaught);\n process.on('unhandledRejection', onRejection);\n\n return () => {\n process.off('uncaughtException', onUncaught);\n process.off('unhandledRejection', onRejection);\n };\n }\n}\n\n/** Public helper: report an error manually from anywhere in the app. */\nexport function captureError(\n error: unknown,\n options?: { context?: string; controller?: string; service?: string },\n): void {\n reportError(error, undefined, options);\n}\n\nfunction reportError(\n error: unknown,\n ctx: InstrumentationCtx | undefined,\n options?: { context?: string; controller?: string; service?: string; source?: string },\n): void {\n try {\n if (ctx && !ctx.config.capture.errors) return;\n\n const normalized = normalizeError(error);\n const location = resolveSourceLocation(normalized.error ?? normalized.message, { skip: 1 });\n const projectId = ctx?.projectInfo.projectId ?? basename(process.cwd());\n\n const payload: ErrorPayload = {\n requestId: requestContext().requestId(),\n projectId,\n name: normalized.name,\n message: normalized.message,\n stack: normalized.error?.stack,\n source: location,\n fingerprint: fingerprint(normalized.name, normalized.message, location),\n context: options?.context ?? options?.source,\n request: currentRequestSummary(),\n controller: options?.controller,\n service: options?.service,\n timestamp: Date.now(),\n };\n\n emit('error.created', payload);\n } catch {\n /* never propagate */\n }\n}\n\nfunction normalizeError(error: unknown): { error: Error | undefined; name: string; message: string } {\n if (error instanceof Error) {\n return { error, name: error.name, message: error.message };\n }\n if (typeof error === 'string') {\n return { error: undefined, name: 'Unknown', message: error };\n }\n if (error !== null && typeof error === 'object' && 'message' in error) {\n const record = error as Record<string, unknown>;\n return {\n error: undefined,\n name: typeof record['name'] === 'string' ? record['name'] : 'Error',\n message: String(record['message']),\n };\n }\n return { error: undefined, name: 'Unknown', message: safeStringify(error) };\n}\n\nfunction fingerprint(name: string, message: string, location?: SourceLocation): string {\n const raw = name + '::' + message + '::' + (location?.file ?? '') + ':' + String(location?.line ?? '');\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n hash = (hash * 31 + raw.charCodeAt(i)) >>> 0;\n }\n return hash.toString(36).padStart(7, '0');\n}\n\nfunction currentRequestSummary(): { method: string; url: string } | undefined {\n const context = requestContext().current();\n if (!context?.method || !context?.url) return undefined;\n return { method: context.method, url: context.url };\n}\n","import type { InstrumentationContext } from './http';\n\n/**\n * Performance instrumentation.\n *\n * Periodic CPU/memory/event-loop/latency sampling lives in core\n * (CoreDevtools.startPerformance) so it works even without an HTTP adapter.\n * This module exists as the capture-toggle boundary and future extension\n * point (gc hooks, histograms, cluster awareness).\n */\nexport class PerformanceInstrumentation {\n constructor(private readonly ctx: InstrumentationContext) {}\n\n /** No-op: sampling is owned by core. Returns a no-op cleanup. */\n attach(): () => void {\n void this.ctx;\n return () => {};\n }\n}\n","import type { AppModuleNode, AppMemberNode, AppSnapshot, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { emit } from '../emitter';\nimport { HttpInstrumentation } from './http';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\nimport { SourceLocation } from '@angelitosystems/devtools-protocol';\n\ninterface ContainerNode {\n id: string;\n name?: string;\n metatype?: Function;\n instance?: object;\n subtype?: 'httpController' | 'gateway';\n controllers?: Map<string, unknown>;\n providers?: Map<string, unknown>;\n}\n\n/**\n * Explore the Nest container to build the module graph (modules, controllers,\n * providers, guards, pipes...). Best effort: any failure keeps the app safe.\n */\nexport class AppExplorer {\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {}\n\n /** Walk the container and emit app.snapshot. Returns a no-op cleanup. */\n attach(app: INestApplication): () => void {\n try {\n const snapshot = this.buildSnapshot(app);\n emit('app.snapshot', snapshot);\n } catch {\n /* best effort */\n }\n return () => {};\n }\n\n private buildSnapshot(app: INestApplication): AppSnapshot {\n const internal = (app as unknown as { container?: unknown }).container as\n | { getModules?: () => Map<string, ContainerNode> }\n | undefined;\n\n const modules: AppModuleNode[] = [];\n const modulesMap = internal?.getModules?.();\n if (modulesMap) {\n for (const [id, node] of modulesMap) {\n const moduleName = node.metatype?.name ?? String(id);\n const members = this.extractMembers(node);\n modules.push({\n name: moduleName,\n imports: [],\n controllers: members.controllers,\n providers: members.providers,\n exports: [],\n });\n }\n }\n\n return {\n projectId: this.ctx.projectInfo.projectId,\n projectName: this.ctx.projectInfo.projectName,\n modules,\n nestjsVersion: this.ctx.projectInfo.nestjsVersion,\n capturedAt: Date.now(),\n };\n }\n\n private extractMembers(node: ContainerNode): { controllers: AppMemberNode[]; providers: AppMemberNode[] } {\n const controllers: AppMemberNode[] = [];\n const providers: AppMemberNode[] = [];\n\n const controllersMap = node.controllers;\n if (controllersMap instanceof Map) {\n for (const [id, wrapper] of controllersMap) {\n const member = this.memberFromWrapper(id, wrapper, 'controller');\n if (member) controllers.push(member);\n }\n }\n\n const providersMap = node.providers;\n if (providersMap instanceof Map) {\n for (const [id, wrapper] of providersMap) {\n const member = this.memberFromWrapper(id, wrapper);\n if (!member) continue;\n if (wrapper && (wrapper as { subtype?: string }).subtype === 'httpController') {\n controllers.push(member);\n } else {\n providers.push(member);\n }\n }\n }\n\n return { controllers, providers };\n }\n\n private memberFromWrapper(id: string, wrapper: unknown, forcedType?: AppMemberNode['type']): AppMemberNode | null {\n const w = wrapper as { name?: string; metatype?: Function; subtype?: string; instance?: Record<string, unknown> } | null;\n const name = w?.metatype?.name ?? (typeof id === 'string' ? id.replace(/^[A-Z_0-9]+:/, '') : 'unknown');\n const type = forcedType ?? classify(name, w?.instance);\n const routes = type === 'controller' ? extractControllerRoutes(w?.metatype) : undefined;\n return { name, type, routes };\n }\n}\n\n/** Heuristic classification of providers into guards/interceptors/pipes/filters. */\nfunction classify(name: string, instance?: Record<string, unknown>): AppMemberNode['type'] {\n if (name.endsWith('Gateway')) return 'gateway';\n if (name.endsWith('Guard')) return 'guard';\n if (name.endsWith('Interceptor')) return 'interceptor';\n if (name.endsWith('Pipe')) return 'pipe';\n if (name.endsWith('Filter')) return 'filter';\n if (instance && typeof instance.canActivate === 'function') return 'guard';\n if (instance && typeof instance.intercept === 'function') return 'interceptor';\n if (instance && typeof instance.transform === 'function') return 'pipe';\n if (instance && typeof instance.catch === 'function') return 'filter';\n return 'provider';\n}\n\n/** Best-effort extraction of controller routes from a controller metatype. */\nfunction extractControllerRoutes(metatype?: Function): string[] {\n if (!metatype) return [];\n try {\n const proto = metatype.prototype;\n if (!proto) return [];\n const props = Object.getOwnPropertyNames(proto).filter((name) => name !== 'constructor');\n const routes: string[] = [];\n for (const key of props) {\n const desc = Object.getOwnPropertyDescriptor(proto, key);\n if (!desc?.value) continue;\n const value = desc.value;\n const routesForMethod = gatherHttpRoutes(value);\n for (const r of routesForMethod) {\n if (typeof r === 'string' && r.length > 0) routes.push(r);\n }\n }\n return routes;\n } catch {\n return [];\n }\n}\n\n/** Attempt to extract HTTP routes from a controller method via NestJS decorators. */\nfunction gatherHttpRoutes(value: Function): (string | undefined)[] {\n try {\n const decorators = (Reflect as any).getMetadata?.('design:http:method', {} as any, undefined, undefined) ?? [];\n const out: (string | undefined)[] = [];\n\n if (decorators.length > 0) {\n for (const d of decorators) {\n if (d && typeof d === 'object' && (d as any).method && (d as any).path) {\n out.push(`${String((d as any).method).toUpperCase()} ${String((d as any).path)}`);\n }\n }\n }\n\n if (typeof value === 'function') {\n const fn = value as any;\n const path = fn.PATH ?? undefined;\n const method = fn.METHOD ?? undefined;\n if (typeof path === 'string' && typeof method === 'string') {\n out.push(`${method.toUpperCase()} ${path}`);\n } else if (typeof path === 'string') {\n out.push(path);\n }\n }\n\n return out;\n } catch {\n return [];\n }\n}\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo, GatewayConnectionPayload, GatewayMessagePayload } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/**\n * WebSocket gateway instrumentation, best-effort.\n *\n * Detects @WebSocketGateway classes via the Nest container and reports\n * connection counts and message flow (received/sent) with redaction.\n * Does not intercept raw sockets unless the gateway exposes them.\n */\nexport class WebsocketInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach gateway hooks. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.websockets) return () => cleanup.forEach((fn) => fn());\n\n const gateways = this.detectGateways();\n for (const gw of gateways) {\n cleanup.push(this.wrapGateway(gw));\n }\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private detectGateways(): Array<{ name: string; instance: any }> {\n try {\n const app = this.getApp();\n if (!app) return [];\n const container = (app as any).container;\n if (!container) return [];\n const modules = container.getModules?.() ?? new Map();\n const out: Array<{ name: string; instance: any }> = [];\n for (const [id, node] of modules) {\n const providers = (node as any).providers;\n if (!providers || !(providers instanceof Map)) continue;\n for (const [key, wrapper] of providers) {\n const w = wrapper as any;\n if (!w || !w.instance) continue;\n const subtype = w.subtype ?? (node.subtype ?? null);\n if (subtype === 'gateway' || (w.instance && w.instance.constructor?.name?.endsWith('Gateway'))) {\n out.push({ name: w.name ?? key, instance: w.instance });\n }\n }\n }\n return out;\n } catch {\n return [];\n }\n }\n\n private wrapGateway(gw: { name: string; instance: any }): () => void {\n const instance = gw.instance;\n if (!instance || typeof instance !== 'object') return () => {};\n\n const hooks: Array<() => void> = [];\n const methods = [\n 'handleConnection',\n 'handleDisconnect',\n 'handleEvent',\n 'handleMessage',\n 'afterInit',\n 'beforeHandle',\n ];\n\n for (const method of methods) {\n if (typeof (instance as any)[method] !== 'function') continue;\n const orig = (instance as any)[method];\n const wrapped = this.buildGatewayWrapper(instance, method, orig);\n (instance as any)[method] = wrapped;\n hooks.push(() => {\n (instance as any)[method] = orig;\n });\n }\n\n return () => hooks.forEach((fn) => fn());\n }\n\n private buildGatewayWrapper(\n instance: any,\n method: string,\n original: (...args: any[]) => any,\n ): (...args: any[]) => any {\n return async (...args: any[]) => {\n const started = Date.now();\n const requestId = requestContext().requestId() ?? randomId('ws');\n\n if (method === 'handleConnection' || method === 'afterInit') {\n emit('websocket.connected', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n namespace: this.estimateNamespace(args),\n connections: this.countConnections(instance),\n timestamp: Date.now(),\n } as GatewayConnectionPayload);\n }\n\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('received', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.receive:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n });\n }\n\n try {\n const result = await Promise.resolve(original.call(instance, ...args));\n if (method === 'handleMessage' || method === 'handleEvent') {\n const payload = this.extractPayload(args);\n this.emitMessage('sent', instance, args, payload, requestId, started);\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} payload=${this.redactor.serialize(payload)}`,\n status: 'ok',\n });\n }\n return result;\n } catch (err) {\n if (method === 'handleMessage' || method === 'handleEvent') {\n recordSpan(requestId, 'websocket', `ws.send:${this.estimateEvent(args)}`, {\n detail: `gateway=${instance.constructor?.name} error=${this.redactor.serialize(err)}`,\n status: 'error',\n });\n }\n throw err;\n }\n };\n }\n\n private emitMessage(\n direction: 'received' | 'sent',\n instance: any,\n args: any[],\n payload: unknown,\n requestId: string,\n startedAt: number,\n ): void {\n const preview = this.redactor.redact(payload);\n const serialized = this.redactor.serialize(payload);\n emit('websocket.message', {\n projectId: this.projectId,\n gateway: instance.constructor?.name ?? this.estimateGatewayName(instance),\n event: this.estimateEvent(args),\n direction,\n payloadSize: Buffer.byteLength(serialized, 'utf8'),\n payloadPreview: preview,\n requestId,\n duration: Date.now() - startedAt,\n timestamp: Date.now(),\n } as GatewayMessagePayload);\n }\n\n private extractPayload(args: any[]): any {\n for (const arg of args) {\n if (arg && typeof arg === 'object' && !Buffer.isBuffer(arg) && !ArrayBuffer.isView(arg)) {\n return arg;\n }\n }\n return args[0];\n }\n\n private estimateEvent(args: any[]): string {\n const payload = this.extractPayload(args);\n if (!payload || typeof payload !== 'object') return 'message';\n return (payload.event as string) ?? (payload.type as string) ?? 'message';\n }\n\n private estimateNamespace(args: any[]): string {\n if (args.length > 0) {\n const first = args[0];\n if (first && typeof first === 'object' && first.namespace) return first.namespace;\n }\n return '/';\n }\n\n private countConnections(instance: any): number {\n try {\n if (instance.connections && typeof instance.connections === 'function') return instance.connections();\n if (instance.clients && typeof instance.clients === 'function') return instance.clients().size ?? 0;\n return 0;\n } catch {\n return 0;\n }\n }\n\n private estimateGatewayName(instance: any): string {\n return instance.constructor?.name ?? 'Gateway';\n }\n\n private getApp(): any {\n try {\n const ctx: any = this.ctxRaw;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\n\n/** Database instrumentation, best-effort provider detection. */\nexport class DatabaseInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctxRaw: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctxRaw = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach database hooks for detected clients. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n\n if (!this.config.capture.database) return () => cleanup.forEach((fn) => fn());\n\n if (this.tryAttachTypeOrm()) cleanup.push(this.detachTypeOrm());\n if (this.tryAttachPrisma()) cleanup.push(this.detachPrisma());\n if (this.tryAttachMongoose()) cleanup.push(this.detachMongoose());\n\n return () => cleanup.forEach((fn) => fn());\n }\n\n private tryAttachTypeOrm(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const dataSource = this.resolveTypeOrmDataSource(app);\n if (!dataSource) return false;\n\n if (typeof dataSource.query === 'function') {\n const originalQuery = dataSource.query.bind(dataSource);\n dataSource.__nestDevToolsOriginalQuery = originalQuery;\n dataSource.query = async (query: unknown, parameters?: unknown[]) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ?? []);\n try {\n const result = await originalQuery(query, parameters);\n this.endQuery(String(query), parameters ?? [], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(String(query), parameters ?? [], Date.now() - started, error);\n throw error;\n }\n };\n return true;\n }\n\n const listener = {\n beforeQuery: (query: string, parameters: unknown[]) => {\n this.startQuery(query, parameters);\n },\n afterQuery: (query: string, parameters: unknown[], durationMs: number) => {\n this.endQuery(query, parameters, durationMs);\n },\n };\n\n const sub = dataSource.subscriber;\n if (sub) {\n const before = sub.beforeQuery as ((q: string, p: unknown[]) => void) | undefined;\n const after = sub.afterQuery as ((q: string, p: unknown[], d: number) => void) | undefined;\n sub.beforeQuery = (q: string, p: unknown[]) => {\n try { before?.(q, p); } catch {}\n listener.beforeQuery(q, p);\n };\n sub.afterQuery = (q: string, p: unknown[], d: number) => {\n try { after?.(q, p, d); } catch {}\n listener.afterQuery(q, p, d);\n };\n } else {\n dataSource.subscriber = listener;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachTypeOrm(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const ds = this.resolveTypeOrmDataSource(app);\n if (!ds || !ds.subscriber) return;\n ds.subscriber = null;\n } catch {}\n };\n }\n\n private tryAttachPrisma(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return false;\n\n if (typeof prisma.$use === 'function') {\n prisma.$use(async (params: any, next: (args: any) => Promise<unknown>) => {\n const label = `${params.model ?? 'prisma'}.${params.action ?? 'query'}`;\n const started = Date.now();\n this.startQuery(label, [params.args]);\n try {\n const result = await next(params);\n this.endQuery(label, [params.args], Date.now() - started);\n return result;\n } catch (error) {\n this.endQuery(label, [params.args], Date.now() - started, error);\n throw error;\n }\n });\n return true;\n }\n\n const original = prisma.$queryRaw ?? prisma.$executeRaw ?? null;\n if (!original) return false;\n\n const wrapped = (query: unknown, parameters?: unknown) => {\n const started = Date.now();\n this.startQuery(String(query), parameters ? [parameters] : []);\n try {\n const result = original.call(prisma, query, parameters);\n if (result instanceof Promise) {\n return result.then((r) => {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return r;\n });\n }\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started);\n return result;\n } catch (err) {\n this.endQuery(String(query), parameters ? [parameters] : [], Date.now() - started, err);\n throw err;\n }\n };\n\n prisma.$queryRaw = wrapped;\n prisma.$executeRaw = wrapped;\n return true;\n } catch {\n return false;\n }\n }\n\n private detachPrisma(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const prisma = this.resolvePrismaClient(app);\n if (!prisma) return;\n // restore original by removing wrapper and re-assigning? Not safe here.\n // We attempt a soft reset by clearing extension if possible.\n if (typeof prisma.$extends === 'function') prisma.$extends(prisma);\n } catch {}\n };\n }\n\n private tryAttachMongoose(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose) return false;\n\n const instrumentation = this;\n const hook = mongoose.plugin((schema: any, _name: string) => {\n if (!schema || typeof schema !== 'object') return;\n const hooks = schema.pre ?? null;\n if (typeof hooks !== 'function') return;\n const bound = hooks.bind(schema);\n if (!bound) return;\n const originalPre = bound as (method: string, fn: unknown) => void;\n schema.pre = function (method: string, fn: unknown) {\n if (method === 'find' || method === 'findOne' || method === 'findById' || method === 'aggregate' || method === 'countDocuments' || method === 'count') {\n const wrapped = async function (this: unknown, ...args: unknown[]) {\n const started = Date.now();\n const sql = `[Mongoose:${method}]`;\n instrumentation.startQuery(sql, args);\n try {\n const handler = fn as ((...args: unknown[]) => unknown) | null;\n if (!handler) return;\n const result = await handler.apply(this, args);\n instrumentation.endQuery(sql, args, Date.now() - started);\n return result;\n } catch (err) {\n instrumentation.endQuery(sql, args, Date.now() - started, err);\n throw err;\n }\n };\n originalPre(method, wrapped as unknown);\n } else {\n originalPre(method, fn as unknown);\n }\n };\n });\n\n if (typeof mongoose.plugin === 'function') mongoose.plugin(hook);\n return true;\n } catch {\n return false;\n }\n }\n\n private detachMongoose(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const mongoose = this.resolveMongoose(app);\n if (!mongoose || typeof mongoose.plugin !== 'function') return;\n // Soft reset: re-plugin empty to override previous plugin?\n // Not safe to undo; we leave best-effort.\n } catch {}\n };\n }\n\n private startQuery(sql: string, parameters: unknown[]): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n recordSpan(requestId, 'database', sql.slice(0, 120), {\n detail: `provider=${this.providerLabel()} parameters=${this.redactor.serialize(parameters)}`,\n });\n }\n\n private endQuery(\n sql: string,\n parameters: unknown[],\n durationMs: number,\n error?: unknown,\n ): void {\n if (!this.config.capture.database) return;\n const requestId = requestContext().requestId() ?? randomId('db');\n const payload = {\n requestId,\n projectId: this.projectId,\n provider: this.providerLabel() as any,\n sql: sql.slice(0, 2000),\n duration: durationMs,\n parameters: this.redactor.redact(parameters),\n timestamp: Date.now(),\n };\n emit('query.executed', payload as any);\n }\n\n private providerLabel(): string {\n if (this.isTypeOrm()) return 'typeorm';\n if (this.isPrisma()) return 'prisma';\n if (this.isMongoose()) return 'mongoose';\n return 'other';\n }\n\n private isTypeOrm(): boolean {\n return !!this.resolveTypeOrmDataSource(this.getApp());\n }\n\n private isPrisma(): boolean {\n return !!this.resolvePrismaClient(this.getApp());\n }\n\n private isMongoose(): boolean {\n return !!this.resolveMongoose(this.getApp());\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctxRaw as any;\n if (ctx && typeof ctx === 'object' && (ctx as any).app) return (ctx as any).app;\n if (ctx && typeof ctx === 'object' && (ctx as any).getHttpAdapter) {\n return ctx as any;\n }\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveTypeOrmDataSource(app: any): any {\n try {\n const dataSource = this.findProvider(app, (value) => typeof value?.query === 'function' && typeof value?.manager === 'object');\n if (dataSource) return dataSource;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolvePrismaClient(app: any): any {\n try {\n const prisma = this.safeGet(app, 'PrismaService')\n ?? this.safeGet(app, 'PrismaClient')\n ?? this.safeGet(app, 'prisma')\n ?? this.findProvider(app, (value) => typeof value?.$queryRaw === 'function');\n if (prisma && typeof prisma.$queryRaw === 'function') return prisma;\n return null;\n } catch {\n return null;\n }\n }\n\n private resolveMongoose(app: any): any {\n try {\n const mongoose = this.safeGet(app, 'MongooseService')\n ?? this.safeGet(app, 'Mongoose')\n ?? this.safeGet(app, 'mongoose')\n ?? this.findProvider(app, (value) => typeof value?.plugin === 'function');\n if (mongoose && typeof mongoose.plugin === 'function') return mongoose;\n return null;\n } catch {\n return null;\n }\n }\n\n private safeGet(app: any, token: string): any {\n try {\n return app?.get?.(token, { strict: false }) ?? null;\n } catch {\n return null;\n }\n }\n\n private findProvider(app: any, predicate: (value: any) => boolean): any {\n try {\n const modules = app?.container?.getModules?.() ?? new Map();\n for (const module of modules.values()) {\n for (const wrapper of (module.providers?.values?.() ?? [])) {\n const instance = wrapper?.instance;\n if (instance && predicate(instance)) return instance;\n }\n }\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import type { InstrumentationContext } from './http';\nimport type { SourceLocation, TimelineSpan } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport { requestContext } from '@angelitosystems/devtools-core';\nimport { Redactor, randomId } from '@angelitosystems/devtools-protocol';\nimport { emit } from '../emitter';\nimport { recordSpan } from './timeline';\nimport { resolveSourceLocation } from '@angelitosystems/devtools-core';\n\n/** Queue/event instrumentation, best-effort and opt-in. */\nexport class QueueEventInstrumentation {\n private readonly redactor: Redactor;\n private readonly config: DevToolsConfig;\n private readonly projectId: string;\n private readonly ctx: InstrumentationContext;\n\n constructor(ctx: InstrumentationContext) {\n this.ctx = ctx;\n this.config = ctx.config;\n this.projectId = ctx.projectInfo.projectId;\n this.redactor = new Redactor({\n redact: this.config.redact,\n allow: this.config.allow,\n maxBytes: this.config.maxPayloadBytes,\n });\n }\n\n /** Attach queue hooks if a supported client is detected. Returns cleanup. */\n attach(): () => void {\n const cleanup: Array<() => void> = [];\n if (!this.config.capture.requests && !this.config.capture.logs && !this.config.capture.errors) {\n return () => cleanup.forEach((fn) => fn());\n }\n\n if (this.tryAttachBull()) cleanup.push(this.detachBull());\n return () => cleanup.forEach((fn) => fn());\n }\n\n /** Register a queue span correlated with the active request, if any. */\n static recordJobSpan(\n queueName: string,\n jobId: string,\n label: string,\n options?: { source?: SourceLocation; status?: 'ok' | 'error' },\n ): void {\n const requestId = requestContext().requestId() ?? randomId('queue');\n recordSpan(requestId, 'queue', `${queueName}:${label} (${jobId})`, {\n detail: `queue=${queueName} job=${jobId}`,\n source: options?.source,\n status: options?.status,\n } as any);\n }\n\n /** Emit a log for queue events, correlated with the active request if any. */\n static emitJobLog(\n queueName: string,\n jobId: string,\n level: 'debug' | 'info' | 'warn' | 'error' | 'verbose',\n message: string,\n options?: { source?: SourceLocation },\n ): void {\n const requestId = requestContext().requestId();\n emit('log.created', {\n requestId,\n projectId: undefined,\n level,\n message: `[${queueName}] ${message} (${jobId})`,\n source: options?.source,\n context: queueName,\n processId: process.pid,\n timestamp: Date.now(),\n } as any);\n }\n\n private tryAttachBull(): boolean {\n try {\n const app = this.getApp();\n if (!app) return false;\n const bull = this.resolveBull(app);\n if (!bull) return false;\n\n const origProcess = bull.prototype?.process ?? bull.process;\n if (typeof origProcess === 'function') {\n const wrapped = this.wrapProcess(origProcess, bull);\n if (bull.prototype) bull.prototype.process = wrapped;\n bull.process = wrapped;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n private detachBull(): () => void {\n return () => {\n try {\n const app = this.getApp();\n if (!app) return;\n const bull = this.resolveBull(app);\n if (!bull) return;\n // Not safe to restore reliably; best-effort no-op.\n } catch {}\n };\n }\n\n private wrapProcess(original: Function, bull: any): Function {\n return async function (this: any, ...args: any[]) {\n const handler = args[0];\n if (!handler || typeof handler !== 'function') return original.apply(this, args);\n\n const wrapped = async (...handlerArgs: any[]) => {\n const job = handlerArgs[0];\n if (!job || typeof job !== 'object') return handler.apply(this, handlerArgs);\n\n const jobId = job.id ?? job.data?.jobId ?? randomId('job');\n const queueName = job.queueName ?? this.estimateQueueName(bull);\n const started = Date.now();\n\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', { status: 'ok' });\n try {\n const result = await Promise.resolve(handler.apply(this, handlerArgs));\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'ok',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'info', 'job completed', {\n source: resolveSourceLocation(new Error(), { skip: 2 }),\n });\n return result;\n } catch (err) {\n QueueEventInstrumentation.recordJobSpan(queueName, jobId, 'process', {\n status: 'error',\n });\n QueueEventInstrumentation.emitJobLog(queueName, jobId, 'error', String(err), {\n source: resolveSourceLocation(err instanceof Error ? err : new Error(), { skip: 2 }),\n });\n throw err;\n }\n };\n\n return original.apply(this, [wrapped, ...args.slice(1)]);\n };\n }\n\n private estimateQueueName(bull: any): string {\n try {\n if (bull.name) return bull.name;\n if (typeof bull === 'function') return bull.name;\n return 'queue';\n } catch {\n return 'queue';\n }\n }\n\n private resolveBull(app: any): any {\n try {\n const bull = app.get('BullService') ?? app.get('Bull') ?? app.get('bull') ?? app.get('Queue') ?? null;\n if (bull && (typeof bull.process === 'function' || typeof bull.prototype?.process === 'function')) return bull;\n return null;\n } catch {\n return null;\n }\n }\n\n private getApp(): any {\n try {\n const ctx = this.ctx as any;\n if (ctx.getHttpAdapter) return ctx;\n if (ctx.app) return ctx.app;\n return null;\n } catch {\n return null;\n }\n }\n}\n\n","import { existsSync, readFileSync } from 'fs';\nimport { resolve } from 'path';\n\nlet cached: string | null | undefined;\n\n/** Best-effort detection of the host app's @nestjs/core version. */\nexport function detectNestJsVersion(): string | null {\n if (cached !== undefined) return cached;\n cached = null;\n try {\n const candidates = [\n resolve(process.cwd(), 'node_modules/@nestjs/core/package.json'),\n // bun/pnpm layouts: walk up a couple of levels\n resolve(process.cwd(), '../../node_modules/@nestjs/core/package.json'),\n ];\n for (const path of candidates) {\n if (!existsSync(path)) continue;\n const pkg = JSON.parse(readFileSync(path, 'utf8')) as { version?: string };\n if (pkg.version) {\n cached = pkg.version;\n break;\n }\n }\n } catch {\n cached = null;\n }\n return cached;\n}\n","/** SDK version reported to the DevTools server. Keep in sync with package.json. */\nexport const SDK_VERSION = '1.0.10';\n","import { writeOriginalConsole } from './instrumentation/console';\n\n/** ANSI escape helpers (kept tiny and dependency-free, mirrors the CLI renderer). */\nconst RESET = '\\x1b[0m';\nconst DIM = '\\x1b[2m';\nconst BOLD = '\\x1b[1m';\nconst GREEN = '\\x1b[32m';\nconst YELLOW = '\\x1b[33m';\nconst CYAN = '\\x1b[36m';\nconst GRAY = '\\x1b[90m';\n\nconst WIDTH = 47;\n\nfunction colorEnabled(): boolean {\n // Respect NO_COLOR / non-TTY output the same way most CLIs do.\n if (process.env['NO_COLOR']) return false;\n return Boolean(process.stdout?.isTTY);\n}\n\nfunction paint(color: string, text: string): string {\n return colorEnabled() ? `${color}${text}${RESET}` : text;\n}\n\nfunction pad(label: string, value: string): string {\n const line = ` ${paint(GRAY, label.padEnd(9))} ${paint(CYAN, value)}`;\n return line;\n}\n\n/** Prints the boxed \"SDK started\" banner once, right after init(). */\nexport function printStartupBanner(info: { endpoint: string; dashboard: string; project: string }): void {\n const top = `${paint(GRAY, '┌' + '─'.repeat(WIDTH) + '┐')}`;\n const bottom = `${paint(GRAY, '└' + '─'.repeat(WIDTH) + '┘')}`;\n const title = ` ${paint(BOLD + CYAN, 'NestJS DevTools')} ${paint(GREEN, '●')} ${paint(DIM, `(${info.project})`)}`;\n\n writeOriginalConsole('log', '');\n writeOriginalConsole('log', top);\n writeOriginalConsole('log', title);\n writeOriginalConsole('log', pad('Endpoint', info.endpoint));\n writeOriginalConsole('log', pad('Dashboard', info.dashboard));\n writeOriginalConsole('log', `${paint(GRAY, ' Estado')} ${paint(YELLOW, '◌ conectando…')}`);\n writeOriginalConsole('log', bottom);\n}\n\n/** Prints a single status line once the transport's connection state is known. */\nexport function printConnectionStatus(state: 'open' | 'offline', dashboard: string): void {\n if (state === 'open') {\n writeOriginalConsole('log', ` ${paint(GREEN, '✓')} Conectado al dashboard ${paint(DIM, `(${dashboard})`)}`);\n return;\n }\n writeOriginalConsole('log', ` ${paint(YELLOW, '⚠')} No se pudo conectar al dashboard todavía.`);\n writeOriginalConsole('log', ` ${paint(DIM, '¿Aún no lo instalaste? →')} ${paint(BOLD, 'bun add -g @angelitosystems/nest-devtools-cli')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Luego, en otra terminal: →')} ${paint(BOLD, 'nest-devtools start')}`);\n writeOriginalConsole('log', ` ${paint(DIM, '(sin instalar, una sola vez: npx -p @angelitosystems/nest-devtools-cli nest-devtools start)')}`);\n writeOriginalConsole('log', ` ${paint(DIM, 'Reintentando en segundo plano — se conectará solo cuando el dashboard esté arriba.')}`);\n}","import type { INestApplication } from '@nestjs/common';\nimport { Redactor } from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { DevToolsEventMap, DevToolsEventName, ProjectInfo } from '@angelitosystems/devtools-protocol';\nimport { emit } from './emitter';\n\nexport interface PluginContext {\n readonly config: DevToolsConfig;\n readonly project: ProjectInfo;\n readonly redactor: Redactor;\n emit<K extends DevToolsEventName>(event: K, payload: DevToolsEventMap[K]): void;\n custom(name: string, data?: unknown): void;\n}\n\nexport interface DevToolsPlugin {\n readonly name: string;\n onInit?(context: PluginContext): void | Promise<void>;\n onAttach?(app: INestApplication, context: PluginContext): void | (() => void) | Promise<void | (() => void)>;\n onDispose?(): void | Promise<void>;\n}\n\n/** Runs third-party instrumentation without allowing it to affect the app. */\nexport class PluginManager {\n private readonly cleanups: Array<() => void> = [];\n private readonly initialized: DevToolsPlugin[] = [];\n\n constructor(private readonly plugins: DevToolsPlugin[]) {}\n\n attach(app: INestApplication, config: DevToolsConfig, project: ProjectInfo): () => void {\n const redactor = new Redactor({ redact: config.redact, allow: config.allow, maxBytes: config.maxPayloadBytes });\n const context: PluginContext = {\n config,\n project,\n redactor,\n emit: (event, payload) => {\n try { emit(event, redactor.redact(payload) as DevToolsEventMap[typeof event]); } catch { /* plugin isolation */ }\n },\n custom: (name, data) => {\n try {\n emit('plugin.event', {\n projectId: project.projectId,\n plugin: 'custom',\n name,\n data: redactor.redact(data),\n timestamp: Date.now(),\n });\n } catch { /* plugin isolation */ }\n },\n };\n\n for (const plugin of this.plugins) {\n if (!plugin || !plugin.name) continue;\n this.initialized.push(plugin);\n this.run(plugin.name, () => plugin.onInit?.(context));\n this.run(plugin.name, async () => {\n const cleanup = await plugin.onAttach?.(app, context);\n if (typeof cleanup === 'function') this.cleanups.push(cleanup);\n });\n }\n\n return () => {\n for (const cleanup of this.cleanups.splice(0)) {\n try { cleanup(); } catch { /* plugin isolation */ }\n }\n for (const plugin of this.initialized.splice(0)) this.run(plugin.name, () => plugin.onDispose?.());\n };\n }\n\n private run(name: string, operation: () => void | Promise<void>): void {\n try {\n const result = operation();\n if (result && typeof (result as Promise<void>).then === 'function') {\n void (result as Promise<void>).catch((error) => this.reportFailure(name, error));\n }\n } catch (error) {\n this.reportFailure(name, error);\n }\n }\n\n private reportFailure(name: string, error: unknown): void {\n try {\n emit('log.created', {\n projectId: 'plugin-system',\n level: 'error',\n message: `DevTools plugin ${name} failed: ${error instanceof Error ? error.message : String(error)}`,\n processId: process.pid,\n timestamp: Date.now(),\n context: 'plugin',\n });\n } catch { /* plugin isolation */ }\n }\n}\n","/**\n * @angelitosystems/nest-devtools\n *\n * Drop-in real-time debugging and observability for NestJS.\n *\n * Usage:\n * import { NestDevTools } from '@angelitosystems/nest-devtools';\n * const app = await NestFactory.create(AppModule);\n * NestDevTools.init(app);\n */\nexport { NestDevTools, devtools } from './sdk';\nexport type { InitResult, NestDevToolsOptions } from './sdk';\nexport { PluginManager } from './plugins';\nexport type { DevToolsPlugin, PluginContext } from './plugins';\nexport type { ProfileKind, ProfileResult } from '@angelitosystems/devtools-core';\nexport { captureError } from './instrumentation/exceptions';\nexport type { DevToolsUserConfig } from '@angelitosystems/devtools-core';\nexport { requestContext } from '@angelitosystems/devtools-core';\nexport type { RequestContext } from '@angelitosystems/devtools-core';\n"],"mappings":"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","names":["coreDevtools","capture","Redactor","requestContext","Redactor","requestContext","Redactor","requestContext","resolveSourceLocation","Redactor","requestContext","resolveSourceLocation","requestContext","resolveSourceLocation","resolveSourceLocation","requestContext","requestContext","Redactor","randomId","Redactor","requestContext","randomId","requestContext","Redactor","randomId","Redactor","requestContext","randomId","requestContext","Redactor","randomId","resolveSourceLocation","Redactor","requestContext","randomId","Redactor","Redactor","coreDevtools","requestContext"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@angelitosystems/nest-devtools",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "One-line real-time debugging and observability for NestJS applications.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -32,8 +32,8 @@
32
32
  "websocket"
33
33
  ],
34
34
  "dependencies": {
35
- "@angelitosystems/devtools-core": "1.0.9",
36
- "@angelitosystems/devtools-protocol": "1.0.9"
35
+ "@angelitosystems/devtools-core": "1.0.10",
36
+ "@angelitosystems/devtools-protocol": "1.0.10"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0",