@angelitosystems/nest-devtools 1.0.13 → 1.0.15
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 +178 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +177 -57
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -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, app }).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 app?: INestApplication;\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 let disposed = false;\n queueMicrotask(() => {\n if (disposed) return;\n try {\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 } catch {\n /* database discovery must never affect NestJS startup */\n }\n });\n\n return () => {\n disposed = true;\n cleanup.splice(0).forEach((fn) => fn());\n };\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 if (typeof prisma.$on === 'function') {\n prisma.$on('query', (event: { query?: string; params?: string; duration?: number; target?: string }) => {\n this.endQuery(event.query ?? 'prisma.query', event.params ? [event.params] : [], event.duration ?? 0);\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, /data.?source|typeorm/i, (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.findProvider(app, /prisma/i, (value) =>\n typeof value?.$queryRaw === 'function'\n && typeof value?.$connect === 'function'\n && typeof value?.$disconnect === 'function',\n );\n if (prisma && typeof prisma.$queryRaw === 'function' && typeof prisma.$connect === '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.findProvider(app, /mongoose/i, (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 findProvider(app: any, namePattern: RegExp, 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 [token, wrapper] of (module.providers?.entries?.() ?? [])) {\n const name = String(wrapper?.name ?? wrapper?.metatype?.name ?? token ?? '');\n if (!namePattern.test(name)) continue;\n try {\n const instance = wrapper?.instance;\n if (instance && predicate(instance)) return instance;\n } catch {\n /* providers may expose getters that are unsafe before init */\n }\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.13';\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, app }).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 app?: INestApplication;\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 {\n AppModuleNode,\n AppMemberNode,\n AppSnapshot,\n AppGlobals,\n RouteNode,\n DtoShape,\n ProjectInfo,\n} from '@angelitosystems/devtools-protocol';\nimport type { DevToolsConfig } from '@angelitosystems/devtools-core';\nimport type { INestApplication } from '@nestjs/common';\n\nimport { createRequire } from 'module';\nimport { emit } from '../emitter';\n\n// This package is published dual CJS/ESM (\"type\": \"module\" + a .cjs build).\n// `require` isn't defined in the ESM build, so we build one lazily via\n// createRequire — this still resolves against the HOST app's node_modules.\nconst safeRequire = (() => {\n try {\n return createRequire(import.meta.url);\n } catch {\n return null;\n }\n})();\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// Stable, long-lived NestJS metadata keys (re-implemented here so this file\n// has zero runtime dependency on @nestjs/common's internal export surface).\nconst PATH_METADATA = 'path';\nconst METHOD_METADATA = 'method';\nconst GUARDS_METADATA = '__guards__';\nconst INTERCEPTORS_METADATA = '__interceptors__';\nconst PIPES_METADATA = '__pipes__';\nconst EXCEPTION_FILTERS_METADATA = '__exceptionFilters__';\nconst ROUTE_ARGS_METADATA = '__routeArguments__';\n\n// From @nestjs/common's RouteParamtypes enum (stable since Nest 6).\nconst BODY_PARAM_TYPE = 3;\n\nconst HTTP_METHOD_NAMES = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'ALL', 'OPTIONS', 'HEAD'];\n\n/**\n * Explore the Nest container to build the module graph AND a full route\n * catalog (method, path, guards/interceptors/pipes/filters, DTO shape).\n * Best effort: any failure keeps the app safe, nothing here can throw up\n * into user code.\n */\nexport class AppExplorer {\n constructor(private readonly ctx: { config: DevToolsConfig; projectInfo: ProjectInfo }) {}\n\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 globals = this.extractGlobals(app);\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, globals);\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 globals,\n };\n }\n\n /** Global prefix, versioning, and APP_GUARD/APP_INTERCEPTOR/APP_FILTER/APP_PIPE providers (from AppModule's `providers` array). */\n private extractGlobals(app: INestApplication): AppGlobals {\n const result: AppGlobals = { prefix: null, versioning: null, guards: [], interceptors: [], filters: [], pipes: [] };\n try {\n // Internal but long-stable: ApplicationConfig instance Nest attaches to every app.\n const config = (app as unknown as { config?: any }).config;\n result.prefix = typeof config?.getGlobalPrefix === 'function' ? config.getGlobalPrefix() || null : null;\n const versioning = typeof config?.getVersioning === 'function' ? config.getVersioning() : null;\n if (versioning) result.versioning = { type: String(versioning.type), defaultVersion: versioning.defaultVersion };\n\n // Global enhancers registered via APP_GUARD / APP_INTERCEPTOR / APP_FILTER / APP_PIPE\n // show up as regular providers whose instance is the enhancer itself; we can't see the\n // DI token from the instance side, so we classify by shape (canActivate/intercept/catch/transform)\n // as a best-effort global list.\n const internal = (app as unknown as { container?: unknown }).container as\n | { getModules?: () => Map<string, ContainerNode> }\n | undefined;\n const modulesMap = internal?.getModules?.();\n if (modulesMap) {\n for (const node of modulesMap.values()) {\n const providersMap = node.providers;\n if (!(providersMap instanceof Map)) continue;\n for (const wrapper of providersMap.values()) {\n const w = wrapper as { name?: string; metatype?: Function; instance?: any } | null;\n const name = w?.metatype?.name ?? w?.name;\n if (!name || typeof name !== 'string') continue;\n const instance = w?.instance;\n if (!instance) continue;\n if (typeof instance.canActivate === 'function' && name.endsWith('Guard')) pushUnique(result.guards, name);\n else if (typeof instance.intercept === 'function' && name.endsWith('Interceptor')) pushUnique(result.interceptors, name);\n else if (typeof instance.catch === 'function' && name.endsWith('Filter')) pushUnique(result.filters, name);\n else if (typeof instance.transform === 'function' && name.endsWith('Pipe')) pushUnique(result.pipes, name);\n }\n }\n }\n } catch {\n /* best effort */\n }\n return result;\n }\n\n private extractMembers(node: ContainerNode, globals: AppGlobals): { 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, globals, '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, globals);\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(\n id: string,\n wrapper: unknown,\n globals: AppGlobals,\n forcedType?: AppMemberNode['type'],\n ): 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\n if (type !== 'controller' || !w?.metatype) {\n return { name, type };\n }\n\n const { basePath, routes } = this.extractRoutes(w.metatype, globals);\n return {\n name,\n type,\n basePath,\n routeDetails: routes,\n routes: routes.map((r) => `${r.method} ${r.path}`), // legacy field, kept for old dashboards\n };\n }\n\n /** Extract every HTTP route of a controller class, with method/path/guards/interceptors/pipes/filters/dto. */\n private extractRoutes(controller: Function, globals: AppGlobals): { basePath: string; routes: RouteNode[] } {\n const routes: RouteNode[] = [];\n let basePath = '';\n try {\n const R = Reflect as any;\n basePath = normalizeSegment(R.getMetadata?.(PATH_METADATA, controller) ?? '');\n const classGuards = readMetaNames(R, GUARDS_METADATA, controller);\n const classInterceptors = readMetaNames(R, INTERCEPTORS_METADATA, controller);\n const classPipes = readMetaNames(R, PIPES_METADATA, controller);\n const classFilters = readMetaNames(R, EXCEPTION_FILTERS_METADATA, controller);\n\n const proto = controller.prototype;\n if (!proto) return { basePath, routes };\n\n const version = globals.versioning?.defaultVersion;\n const versionSegment =\n globals.versioning?.type === 'URI' && version && version !== '-1' ? `v${Array.isArray(version) ? version[0] : version}` : '';\n\n for (const key of Object.getOwnPropertyNames(proto)) {\n if (key === 'constructor') continue;\n const handler = (proto as any)[key];\n if (typeof handler !== 'function') continue;\n\n const httpMethod = R.getMetadata?.(METHOD_METADATA, handler);\n if (httpMethod === undefined) continue; // not an @Get/@Post/... handler\n\n const methodPath = normalizeSegment(R.getMetadata?.(PATH_METADATA, handler) ?? '');\n const fullPath = ['/', globals.prefix, versionSegment, basePath, methodPath]\n .filter((segment) => segment && segment !== '/')\n .join('/')\n .replace(/\\/+/g, '/');\n\n const methodGuards = readMetaNames(R, GUARDS_METADATA, handler);\n const methodInterceptors = readMetaNames(R, INTERCEPTORS_METADATA, handler);\n const methodPipes = readMetaNames(R, PIPES_METADATA, handler);\n const methodFilters = readMetaNames(R, EXCEPTION_FILTERS_METADATA, handler);\n\n routes.push({\n method: HTTP_METHOD_NAMES[httpMethod] ?? 'GET',\n path: fullPath.startsWith('/') ? fullPath : `/${fullPath}`,\n handlerName: key,\n guards: dedupe([...classGuards, ...methodGuards]),\n interceptors: dedupe([...classInterceptors, ...methodInterceptors]),\n pipes: dedupe([...classPipes, ...methodPipes]),\n filters: dedupe([...classFilters, ...methodFilters]),\n dto: this.extractBodyDto(R, controller, proto, key),\n });\n }\n } catch {\n /* best effort */\n }\n return { basePath, routes };\n }\n\n /** Best-effort: find the @Body() parameter's class and describe its fields via class-validator, if present. */\n private extractBodyDto(R: any, controller: Function, proto: object, methodName: string): DtoShape | null {\n try {\n const paramTypes: Function[] = R.getMetadata?.('design:paramtypes', proto, methodName) ?? [];\n const routeArgs = R.getMetadata?.(ROUTE_ARGS_METADATA, controller, methodName) ?? {};\n let bodyIndex = -1;\n for (const key of Object.keys(routeArgs)) {\n const [paramType] = key.split(':');\n if (Number(paramType) === BODY_PARAM_TYPE) {\n bodyIndex = routeArgs[key]?.index ?? -1;\n break;\n }\n }\n if (bodyIndex === -1) return null;\n const dtoClass = paramTypes[bodyIndex];\n if (!dtoClass || !dtoClass.name || ['Object', 'String', 'Number', 'Boolean', 'Array'].includes(dtoClass.name)) {\n return null;\n }\n return { name: dtoClass.name, fields: this.describeDtoFields(dtoClass) };\n } catch {\n return null;\n }\n }\n\n /** Reads class-validator's metadata storage if the package is installed in the host app. Falls back to []. */\n private describeDtoFields(dtoClass: Function): DtoShape['fields'] {\n try {\n // Resolved from the HOST application's node_modules (createRequire walks\n // up from this file's real location), not bundled with DevTools.\n if (!safeRequire) return [];\n const cv = safeRequire('class-validator');\n const storage = cv.getMetadataStorage?.();\n const metas = storage?.getTargetValidationMetadatas?.(dtoClass, '', true, false) ?? [];\n const byProperty = new Map<string, { types: string[]; optional: boolean }>();\n for (const meta of metas) {\n const entry = byProperty.get(meta.propertyName) ?? { types: [], optional: false };\n if (meta.name === 'isOptional') entry.optional = true;\n if (meta.name) entry.types.push(meta.name);\n byProperty.set(meta.propertyName, entry);\n }\n return [...byProperty.entries()].map(([name, info]) => ({\n name,\n type: info.types.find((t) => /^is[A-Z]/.test(t))?.replace(/^is/, '') ?? 'unknown',\n optional: info.optional,\n rules: dedupe(info.types),\n }));\n } catch {\n return [];\n }\n }\n}\n\nfunction readMetaNames(R: any, key: string, target: Function): string[] {\n try {\n const value = R.getMetadata?.(key, target) as Function[] | undefined;\n if (!Array.isArray(value)) return [];\n return value.map((fn) => fn?.name).filter((name): name is string => Boolean(name));\n } catch {\n return [];\n }\n}\n\nfunction normalizeSegment(segment: string | string[]): string {\n const s = Array.isArray(segment) ? segment[0] ?? '' : segment;\n return String(s ?? '').replace(/^\\/+|\\/+$/g, '');\n}\n\nfunction dedupe(items: string[]): string[] {\n return [...new Set(items)];\n}\n\nfunction pushUnique(list: string[], value: string): void {\n if (!list.includes(value)) list.push(value);\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","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 let disposed = false;\n queueMicrotask(() => {\n if (disposed) return;\n try {\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 } catch {\n /* database discovery must never affect NestJS startup */\n }\n });\n\n return () => {\n disposed = true;\n cleanup.splice(0).forEach((fn) => fn());\n };\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 if (typeof prisma.$on === 'function') {\n prisma.$on('query', (event: { query?: string; params?: string; duration?: number; target?: string }) => {\n this.endQuery(event.query ?? 'prisma.query', event.params ? [event.params] : [], event.duration ?? 0);\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, /data.?source|typeorm/i, (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.findProvider(app, /prisma/i, (value) =>\n typeof value?.$queryRaw === 'function'\n && typeof value?.$connect === 'function'\n && typeof value?.$disconnect === 'function',\n );\n if (prisma && typeof prisma.$queryRaw === 'function' && typeof prisma.$connect === '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.findProvider(app, /mongoose/i, (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 findProvider(app: any, namePattern: RegExp, 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 [token, wrapper] of (module.providers?.entries?.() ?? [])) {\n const name = String(wrapper?.name ?? wrapper?.metatype?.name ?? token ?? '');\n if (!namePattern.test(name)) continue;\n try {\n const instance = wrapper?.instance;\n if (instance && predicate(instance)) return instance;\n } catch {\n /* providers may expose getters that are unsafe before init */\n }\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.15';\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"]}
|