2g 0.4.2 → 0.4.3
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/CHANGELOG.md +7 -0
- package/README.md +3 -3
- package/dist/2g.d.ts +1 -0
- package/dist/2g.js +385 -327
- package/dist/2g.js.map +1 -1
- package/dist/2g.mjs +327 -269
- package/dist/2g.mjs.map +1 -1
- package/dist/chunks/api-chunk.js +8 -4
- package/dist/chunks/api-chunk.js.map +1 -1
- package/dist/chunks/api-chunk.mjs +9 -5
- package/dist/chunks/api-chunk.mjs.map +1 -1
- package/dist/chunks/cli-chunk.js +1 -1
- package/dist/chunks/cli-chunk.js.map +1 -1
- package/dist/chunks/cli-chunk.mjs +7 -7
- package/dist/chunks/cli-chunk.mjs.map +1 -1
- package/dist/chunks/sessionSockets-chunk.js +2 -0
- package/dist/chunks/sessionSockets-chunk.js.map +1 -1
- package/dist/chunks/sessionSockets-chunk.mjs +16 -14
- package/dist/chunks/sessionSockets-chunk.mjs.map +1 -1
- package/package.json +1 -1
package/dist/2g.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"2g.mjs","sources":["../src/state.ts","../src/utils/serializeEvent.ts","../src/events.ts","../src/debug.ts","../src/utils/logStream.ts","../src/utils/broadcastChannel.ts","../src/utils/ipc.ts","../src/utils/processOrigin.ts","../src/utils/processExit.ts","../src/session.ts","../src/install.ts","../src/index.ts"],"sourcesContent":["import { EVENT_LOG_STATE_VERSION } from './constants';\nimport type { EventSink } from './utils/logStream';\nimport type { EventMeta } from './utils/serializeEvent';\n\nexport interface EventLoggerInfo {\n destination: 'file' | 'stdout' | 'stderr' | 'fd' | 'session' | 'ipc';\n isUserVisibleOutput: boolean;\n file?: string;\n fd?: number;\n sessionDir?: string;\n}\n\nexport interface EventLogState {\n logPath: string;\n primarySink?: EventSink;\n eventMeta?: EventMeta;\n eventLoggerInfo: EventLoggerInfo | null;\n debug: boolean;\n}\n\nconst STATE_SYMBOL = Symbol.for(`2g/state-${EVENT_LOG_STATE_VERSION}`);\n\ninterface EventLogGlobal {\n [STATE_SYMBOL]?: EventLogState;\n}\n\nexport const eventLogState = getEventLogState();\n\nexport function _resetEventLogState() {\n eventLogState.primarySink?.destroy();\n eventLogState.logPath = process.cwd();\n eventLogState.primarySink = undefined;\n eventLogState.eventMeta = undefined;\n eventLogState.eventLoggerInfo = null;\n eventLogState.debug = false;\n}\n\nfunction getEventLogState() {\n const globalScope = globalThis as EventLogGlobal;\n return (globalScope[STATE_SYMBOL] ??= {\n logPath: process.cwd(),\n eventLoggerInfo: null,\n debug: false,\n });\n}\n","import { performance } from 'node:perf_hooks';\n\nimport type { EventSink } from './logStream';\n\nconst TIME_ORIGIN = performance.timeOrigin;\n\nconst TIMESTAMP_FRACTIONS = Array.from(\n { length: 1000 },\n (_, us) => `.${`${us}`.padStart(3, '0')}`\n);\n\nlet cachedMs = -1;\nlet cachedMsJson = '';\nlet cachedWorkerId: string | undefined;\nlet cachedWorkerIdJson = '';\n\nexport interface EventMeta {\n _w?: string;\n}\n\nexport function serializeEvent(\n category: string,\n kind: string,\n payload: Record<string, unknown> | undefined,\n meta?: EventMeta,\n duration?: number,\n level?: number\n) {\n const timestamp = stringifyTimestamp();\n if (duration == null && !meta?._w && !level) {\n const rest = payload ? JSON.stringify(payload).slice(1) : '';\n return rest.length > 1\n ? `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp},${rest}\\n`\n : `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp}}\\n`;\n }\n\n let line = `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp}`;\n if (duration != null) line += `,\"_d\":${duration}`;\n if (level) line += `,\"_l\":${level}`;\n if (meta?._w) line += `,\"_w\":${stringifyWorkerId(meta._w)}`;\n return `${appendPayload(line, payload)}}\\n`;\n}\n\nexport function writeEvent(\n dest: EventSink,\n category: string,\n kind: string,\n payload: Record<string, unknown> | undefined,\n meta?: EventMeta,\n level?: number\n) {\n // Unserializable payloads (circular, BigInt) drop the event, never throw into the host\n try {\n dest._writeln(\n serializeEvent(category, kind, payload, meta, undefined, level)\n );\n } catch {}\n}\n\nexport function writeCompleteEvent(\n dest: EventSink,\n category: string,\n kind: string,\n startPayload: Record<string, unknown> | undefined,\n endPayload: Record<string, unknown> | undefined,\n delta: number,\n meta?: EventMeta,\n level?: number\n) {\n try {\n let line = `{\"_e\":\"${category}:${kind}\",\"_t\":${stringifyTimestamp()},\"_d\":${delta}`;\n if (level) line += `,\"_l\":${level}`;\n if (meta?._w) line += `,\"_w\":${stringifyWorkerId(meta._w)}`;\n dest._writeln(`${appendMergedPayload(line, startPayload, endPayload)}}\\n`);\n } catch {}\n}\n\nexport function getEventTimestamp() {\n return TIME_ORIGIN + performance.now();\n}\n\nfunction stringifyTimestamp() {\n const timestamp = TIME_ORIGIN + performance.now();\n const ms = Math.floor(timestamp);\n if (ms !== cachedMs) {\n cachedMs = ms;\n cachedMsJson = `${ms}`;\n }\n return cachedMsJson + TIMESTAMP_FRACTIONS[((timestamp - ms) * 1000) | 0];\n}\n\nfunction stringifyWorkerId(workerId: string) {\n if (workerId !== cachedWorkerId) {\n cachedWorkerId = workerId;\n cachedWorkerIdJson = JSON.stringify(workerId);\n }\n return cachedWorkerIdJson;\n}\n\nfunction appendPayload(line: string, payload?: Record<string, unknown>) {\n if (!payload) return line;\n const rest = JSON.stringify(payload);\n return rest && rest.length > 2 ? `${line},${rest.slice(1, -1)}` : line;\n}\n\nfunction appendMergedPayload(\n line: string,\n startPayload?: Record<string, unknown>,\n endPayload?: Record<string, unknown>\n) {\n if (!startPayload) return appendPayload(line, endPayload);\n if (!endPayload) return appendPayload(line, startPayload);\n return appendPayload(line, Object.assign(startPayload, endPayload));\n}\n","import path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { EVENT_LEVEL_DEBUG } from './constants';\nimport { eventLogState } from './state';\nimport { writeCompleteEvent, writeEvent } from './utils/serializeEvent';\nimport type { EventLogger, SerializedError, SpanEnd } from './types';\n\nconst NOOP_DONE: SpanEnd<any> = () => {};\n\nfunction serializeError(\n error: unknown,\n depth = 0\n): SerializedError | string | null {\n if (error == null) return null;\n if (!(error instanceof Error)) return String(error);\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n const code = (error as NodeJS.ErrnoException).code;\n if (typeof code === 'string') serialized.code = code;\n const stack = error.stack;\n if (stack) serialized.stack = stack;\n // The depth cap guards cyclic causes\n if (error.cause != null && depth < 4)\n serialized.cause = serializeError(error.cause, depth + 1)!;\n return serialized;\n}\n\nfunction createEventLogger<const Category extends string>(\n category: Category,\n level: number | undefined\n): EventLogger<Category> {\n function log(event: string, data?: Record<string, unknown>) {\n if (eventLogState.primarySink && (!level || eventLogState.debug))\n writeEvent(\n eventLogState.primarySink,\n category,\n event,\n data,\n eventLogState.eventMeta,\n level\n );\n }\n\n log.span = function span() {\n if (!eventLogState.primarySink || (level && !eventLogState.debug))\n return NOOP_DONE;\n const start = performance.now();\n return function done(event: string, data?: Record<string, unknown>) {\n if (!eventLogState.primarySink) return;\n writeCompleteEvent(\n eventLogState.primarySink,\n category,\n event,\n data,\n undefined,\n performance.now() - start,\n eventLogState.eventMeta,\n level\n );\n };\n };\n\n log.path = function relativePath(target: string | undefined | null) {\n return {\n toJSON(): string | null {\n try {\n return target != null && path.isAbsolute(target)\n ? path\n .relative(eventLogState.logPath, target)\n .replace(/\\\\/g, '/') || '.'\n : (target ?? null);\n } catch {\n return target || null;\n }\n },\n };\n };\n\n log.error = function error(error: unknown) {\n return {\n toJSON: () => serializeError(error),\n };\n };\n log.category = category;\n return log as EventLogger<Category>;\n}\n\nexport function events<const Category extends string>(\n category: Category\n): EventLogger<Category> {\n return createEventLogger(category, undefined);\n}\n\nevents.debug = function debug<const Category extends string>(\n category: Category\n): EventLogger<Category> {\n return createEventLogger(category, EVENT_LEVEL_DEBUG);\n};\n","import { LOG_DEBUG_ENV } from './constants';\nimport {\n compileEventFilter,\n matchesTapOptions,\n parseEventLine,\n} from './utils/eventFilter';\nimport type { EventSink } from './utils/logStream';\nimport { formatPrettyEvent, shouldColorizeStream } from './utils/pretty';\n\nexport function createDebugSink(\n value = process.env[LOG_DEBUG_ENV]\n): EventSink | null {\n const filter = compileLogDebugFilter(value);\n if (!filter) return null;\n\n const colorize = shouldColorizeStream(process.stderr);\n return {\n get writable() {\n return true;\n },\n _writeln(data: string) {\n // Ingested worker blocks can carry multiple lines per write\n let start = 0;\n let end: number;\n while ((end = data.indexOf('\\n', start)) !== -1) {\n const line = data.slice(start, end);\n start = end + 1;\n if (!line) continue;\n // LOG_DEBUG is itself the debug opt-in\n const event = parseEventLine(line, { debug: true });\n if (!event || !matchesTapOptions(event, { debug: true }, filter))\n continue;\n process.stderr.write(\n `${formatPrettyEvent(event, {\n colorize,\n stream: process.stderr,\n })}\\n`\n );\n }\n return true;\n },\n end(cb?: () => void) {\n cb?.();\n return this;\n },\n destroy() {},\n };\n}\n\nfunction compileLogDebugFilter(value: string | undefined) {\n const patterns = value\n ?.split(/[\\s,]+/)\n .map(pattern => pattern.trim())\n .filter(Boolean);\n if (!patterns?.length) return null;\n return compileEventFilter(patterns);\n}\n","import { Buffer } from 'node:buffer';\nimport { EventEmitter } from 'node:events';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst BUSY_WRITE_TIMEOUT = 100;\nconst HIGH_WATER_MARK = 16_384;\nconst WRITE_BATCH_SIZE = 65_536;\n\nexport interface EventSink {\n readonly writable: boolean;\n readonly file?: string | null;\n readonly buffered?: number;\n _writeln(data: string): boolean;\n flush?(cb: (error?: Error | null) => void): void;\n end(cb?: () => void): this;\n destroy(): void;\n}\n\nexport interface LogStreamOptions {\n closeFd?: boolean;\n}\n\nexport type LogStreamDrain = (\n data: string,\n cb: (error?: Error | null) => void\n) => void;\n\nexport type LogStreamOpener = (\n onOpened: (\n error: Error | null,\n fd?: number | null,\n drain?: LogStreamDrain\n ) => void,\n stream: LogStream\n) => void;\n\nexport class LogStream\n extends EventEmitter\n implements NodeJS.WritableStream, EventSink\n{\n #fd = -1;\n #file: string | null = null;\n #oldFd: number | null = null;\n #closeFd = true;\n\n #writing = false;\n #ending = false;\n #closing = false;\n #flushPending = false;\n #destroyed = false;\n #opening = false;\n #reopening = false;\n\n #output = '';\n #len = 0;\n #lines: string[] = [];\n #head = 0;\n #partialLine = 0;\n #busyRetries = 0;\n #draining = false;\n #scheduled = false;\n #drain?: LogStreamDrain;\n\n #onRelease = (err: NodeJS.ErrnoException | null, written: number) => {\n this.#release(err, written);\n };\n\n #onDrained = (error?: Error | null) => {\n if (error != null) {\n this.#fail(error as NodeJS.ErrnoException);\n } else {\n this.#release(null, Buffer.byteLength(this.#output));\n }\n };\n\n #onScheduledWrite = () => {\n this.#scheduled = false;\n if (\n !this.#writing &&\n !this.#destroyed &&\n (this.#lines.length - this.#head > this.#partialLine || this.#output)\n ) {\n this.#writeLine();\n }\n };\n\n constructor(\n dest: string | number | LogStreamOpener,\n options: LogStreamOptions = {}\n ) {\n super();\n this.#closeFd = options.closeFd !== false;\n if (typeof dest === 'number') {\n try {\n fs.fsyncSync(dest);\n } catch {}\n this.#fd = dest;\n process.nextTick(() => this.emit('ready'));\n } else if (typeof dest === 'string') {\n this.#openFile(dest);\n } else {\n this.#open(dest, null);\n }\n }\n\n get file(): string | null {\n return this.#file;\n }\n\n get fd(): number {\n return this.#fd;\n }\n\n get writing(): boolean {\n return this.#writing;\n }\n\n get buffered(): number {\n return this.#len;\n }\n\n get writable(): boolean {\n return !this.#destroyed && !this.#ending;\n }\n\n reopen(file = this.#file) {\n if (this.#file == null)\n throw new Error('Cannot reopen an fd-only LogStream');\n if (this.#destroyed || this.#ending) return;\n if (file) this.#file = file;\n if (this.#opening) {\n this.once('ready', () => this.reopen(file));\n return;\n }\n this.#reopening = true;\n if (!this.#writing) this.#reopen();\n }\n\n #reopen() {\n if (this.#file == null) return;\n this.#reopening = false;\n this.#oldFd = this.#fd;\n this.#openFile(this.#file);\n }\n\n #retryLine(error: NodeJS.ErrnoException) {\n if (error.code === 'EAGAIN' && this.#drain != null) {\n this.#draining = true;\n this.#drain(this.#output, this.#onDrained);\n } else if (this.#busyRetries === 0) {\n this.#busyRetries = 1;\n setImmediate(() => this.#writeLine());\n } else {\n this.#busyRetries = Math.min(this.#busyRetries * 2, BUSY_WRITE_TIMEOUT);\n setTimeout(() => this.#writeLine(), this.#busyRetries);\n }\n }\n\n #release(error: NodeJS.ErrnoException | null, written: number) {\n if (error) {\n if (error.code === 'EAGAIN' || error.code === 'EBUSY') {\n this.#retryLine(error);\n } else {\n this.#fail(error);\n }\n return;\n }\n\n this.#busyRetries = 0;\n this.emit('write', written);\n\n if (written === this.#output.length) {\n // Complete write; exact for ASCII, the common case for JSONL\n this.#len -= this.#output.length;\n this.#output = '';\n } else {\n const outputLength = Buffer.byteLength(this.#output);\n if (outputLength > written) {\n const output = Buffer.from(this.#output).toString('utf8', written);\n this.#len -= this.#output.length - output.length;\n this.#output = output;\n } else {\n this.#len -= this.#output.length;\n this.#output = '';\n }\n }\n\n if (this.#output) {\n this.#writeLine();\n } else if (this.#closing && !this.#ending) {\n this.#writing = false;\n this.#close();\n } else if (this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n } else if (this.#reopening) {\n this.#writing = false;\n this.#reopen();\n } else if (this.#ending) {\n this.#writing = false;\n this.#close();\n } else {\n this.#writing = false;\n this.#draining = false;\n if (this.#flushPending) {\n this.emit('drain');\n }\n }\n }\n\n #openFile(file: string) {\n this.#open(onOpened => {\n fs.mkdir(path.dirname(file), { recursive: true }, () => {\n fs.open(file, 'a', 0o600, (error, fd) => {\n if (error || fd == null) {\n onOpened(error);\n return;\n }\n fs.fchmod(fd, 0o600, () => {\n onOpened(null, fd);\n });\n });\n });\n }, file);\n }\n\n #open(open: LogStreamOpener, file: string | null) {\n this.#opening = true;\n this.#writing = true;\n\n const onOpened = (\n error: Error | null,\n fd?: number | null,\n drain?: LogStreamDrain\n ) => {\n const oldFd = this.#oldFd;\n this.#oldFd = null;\n if (error) {\n this.#opening = false;\n this.#fail(error as NodeJS.ErrnoException);\n } else {\n this.#fd = fd ?? -1;\n this.#file = file;\n this.#drain = drain;\n this.#opening = false;\n this.#writing = false;\n this.emit('ready');\n if (oldFd != null && oldFd !== this.#fd && !isStdFd(oldFd)) {\n fsFsync(oldFd, () => fs.close(oldFd, () => {}));\n }\n if (this.#destroyed) return;\n if (this.#closing) {\n this.#close();\n } else if (\n (!this.#writing &&\n this.#lines.length - this.#head > this.#partialLine) ||\n this.#flushPending\n ) {\n this.#writeLine();\n }\n }\n };\n\n open(onOpened, this);\n }\n\n #close() {\n if (this.#fd === -1 && this.#opening) {\n this.once('ready', () => this.#close());\n return;\n }\n\n this.#destroyed = true;\n this.#partialLine = 0;\n this.#lines.length = 0;\n this.#head = 0;\n\n const onClose = (error?: NodeJS.ErrnoException | null) => {\n if (error) {\n this.emit('error', error);\n this.emit('close', error);\n } else {\n if (this.#ending && !this.#writing) this.emit('finish');\n this.emit('close');\n }\n };\n\n if (this.#fd < 0) {\n onClose();\n return;\n }\n\n fsFsync(this.#fd, error => {\n if (!error && this.#closeFd && !isStdFd(this.#fd)) {\n fs.close(this.#fd, onClose);\n } else {\n onClose(); // Error intentionally ignored, assume closed\n }\n });\n }\n\n #fail(error: NodeJS.ErrnoException) {\n this.#writing = false;\n if (this.listenerCount('error')) this.emit('error', error);\n this.#close();\n }\n\n #scheduleWrite() {\n if (!this.#scheduled) {\n this.#scheduled = true;\n setImmediate(this.#onScheduledWrite);\n }\n }\n\n #writeLine() {\n this.#writing = true;\n if (!this.#output) {\n const end = this.#lines.length - this.#partialLine;\n if (end > this.#head) {\n this.#output = this.#lines[this.#head++] || '';\n // Batch accumulated lines into one write to avoid per-line syscalls\n while (this.#head < end && this.#output.length < WRITE_BATCH_SIZE) {\n this.#output += this.#lines[this.#head++];\n }\n if (this.#head === this.#lines.length) {\n this.#lines.length = 0;\n this.#head = 0;\n }\n }\n }\n // A deep queue under backpressure stays writability-paced until it empties\n if (this.#drain != null && (this.#draining || this.#fd < 0)) {\n this.#drain(this.#output, this.#onDrained);\n } else {\n fs.write(this.#fd, this.#output, this.#onRelease);\n }\n }\n\n _end() {\n if (!this.#destroyed && !this.#ending) {\n this.#ending = true;\n if (this.#opening) {\n this.once('ready', () => this._end());\n } else if (!this.#writing && this.#fd >= 0) {\n if (this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n } else {\n this.#close();\n }\n }\n }\n return this;\n }\n\n end(cb?: () => void): this;\n end(data: string | Uint8Array, cb?: () => void): this;\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this;\n\n end(\n arg1?: Uint8Array | string | (() => void),\n arg2?: BufferEncoding | (() => void),\n arg3?: () => void\n ) {\n const maybeCb = arg3 || arg2 || arg1;\n const input = typeof arg1 !== 'function' ? arg1 : undefined;\n const encoding = typeof arg2 === 'string' ? arg2 : 'utf8';\n const cb = typeof maybeCb === 'function' ? maybeCb : undefined;\n if (typeof input === 'string') {\n this.write(input, encoding);\n } else if (input != null) {\n this.write(input);\n }\n if (cb) this.once('close', cb);\n return this._end();\n }\n\n destroy() {\n if (this.#destroyed || this.#closing) return;\n if (this.#writing || this.#opening) {\n this.#closing = true;\n } else if (this.#lines.length - this.#head > this.#partialLine) {\n // A scheduled write counts as pending: complete it before closing\n this.#closing = true;\n this.#writeLine();\n } else {\n this.#close();\n }\n }\n\n flush(cb?: (error?: Error | null) => void) {\n if (this.#destroyed) {\n cb?.();\n } else {\n const onDrain = () => {\n if (!this.#destroyed) {\n fsFsync(this.#fd, error => {\n this.#flushPending = false;\n if (error?.code === 'EBADF') {\n cb?.(); // If fd is closed, ignore the error\n } else {\n cb?.(error);\n }\n });\n } else {\n this.#flushPending = false;\n cb?.();\n }\n this.off('error', onError);\n };\n\n const onError = (err: Error) => {\n this.#flushPending = false;\n this.off('drain', onDrain);\n cb?.(err);\n };\n\n this.#flushPending = true;\n this.once('drain', onDrain);\n this.once('error', onError);\n\n if (!this.#writing) {\n if (\n this.#lines.length - this.#head > this.#partialLine ||\n this.#output\n ) {\n this.#writeLine();\n } else {\n process.nextTick(() => this.emit('drain'));\n }\n }\n }\n }\n\n _writeln(data: string): boolean {\n if (this.#destroyed) return false;\n this.#len += data.length;\n this.#lines.push(data);\n if (!this.#writing) this.#scheduleWrite();\n return this.#len < HIGH_WATER_MARK;\n }\n\n _write(data: string): boolean {\n if (this.#destroyed) {\n return false;\n }\n\n if (\n this.#partialLine === 0 &&\n data.charCodeAt(data.length - 1) === 10 /*'\\n'*/\n ) {\n return this._writeln(data);\n }\n\n this.#len += data.length;\n\n let startIdx = 0;\n let endIdx = -1;\n while ((endIdx = data.indexOf('\\n', startIdx)) > -1) {\n const line = data.slice(startIdx, endIdx + 1);\n if (this.#partialLine > 0) {\n this.#lines[this.#lines.length - 1] += line;\n } else {\n this.#lines.push(line);\n }\n this.#partialLine = 0;\n startIdx = ++endIdx;\n }\n\n if (startIdx < data.length) {\n const line = data.slice(startIdx);\n if (this.#partialLine > 0) {\n this.#lines[this.#lines.length - 1] += line;\n } else {\n this.#lines.push(data.slice(startIdx));\n }\n this.#partialLine = 1;\n }\n\n if (!this.#writing && this.#lines.length - this.#head > this.#partialLine) {\n this.#scheduleWrite();\n }\n\n return this.#len < HIGH_WATER_MARK;\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void\n ): boolean;\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void\n ): boolean;\n\n write(\n input: Uint8Array | string,\n arg2?: BufferEncoding | ((err?: Error | null) => void),\n arg3?: (err?: Error | null) => void\n ): boolean {\n const maybeCb = arg3 || arg2;\n const encoding = typeof arg2 === 'string' ? arg2 : 'utf8';\n const data =\n typeof input === 'string' ? input : Buffer.from(input).toString(encoding);\n const cb = typeof maybeCb === 'function' ? maybeCb : undefined;\n try {\n return this._write(data);\n } finally {\n cb?.();\n }\n }\n\n [Symbol.dispose]() {\n this.destroy();\n }\n}\n\nconst isStdFd = (fd: number) => {\n switch (fd) {\n case 1:\n case 2:\n case process.stdout.fd:\n case process.stderr.fd:\n return true;\n default:\n return false;\n }\n};\n\nconst fsFsync = (\n fd: number,\n cb: (error?: NodeJS.ErrnoException | null) => void\n) => {\n try {\n fs.fsync(fd, cb);\n } catch (error: any) {\n cb(error);\n }\n};\n","import type net from 'node:net';\n\nimport { LogStream, type EventSink } from './logStream';\n\nconst MAX_SUBSCRIBER_BUFFERED = 4 * 1024 * 1024;\n\ninterface BroadcastSink {\n sink: EventSink;\n dropOnBackpressure: boolean;\n destroy(): void;\n}\n\n// Fallback for Windows named pipes, which expose no fd for LogStream to write to\nclass SocketSink implements EventSink {\n readonly #socket: net.Socket;\n\n constructor(socket: net.Socket) {\n this.#socket = socket;\n // A socket write error without an 'error' listener would crash the host\n socket.on('error', () => {});\n }\n\n get writable() {\n return this.#socket.writable;\n }\n\n get buffered() {\n return this.#socket.writableLength;\n }\n\n _writeln(data: string): boolean {\n return this.#socket.write(data);\n }\n\n end(cb?: () => void): this {\n this.#socket.end(cb);\n return this;\n }\n\n destroy() {\n this.#socket.destroy();\n }\n}\n\nconst createSocketSink = (socket: net.Socket): EventSink => {\n const fd = (socket as any)._handle?.fd;\n if (typeof fd === 'number' && fd >= 0) {\n return new LogStream(\n onOpened =>\n onOpened(null, fd, (data, cb) => {\n socket.write(data, cb);\n }),\n { closeFd: false }\n );\n }\n return new SocketSink(socket);\n};\n\n// Fans every line out to all sinks uniformly; only flush stays pinned to the\n// primary sink so a stalled live socket cannot delay a durability barrier\nexport class BroadcastChannel implements EventSink {\n readonly #primary: EventSink;\n readonly #sinks: BroadcastSink[] = [];\n #destroyed = false;\n\n constructor(primary: EventSink) {\n this.#primary = primary;\n this.#sinks.push({\n sink: primary,\n dropOnBackpressure: false,\n destroy: () => primary.destroy(),\n });\n }\n\n get writable() {\n if (this.#destroyed) return false;\n for (let i = 0; i < this.#sinks.length; i++) {\n if (this.#sinks[i].sink.writable) return true;\n }\n return false;\n }\n\n add(sink: EventSink | null) {\n if (!sink) return;\n if (this.#destroyed) sink.destroy();\n else\n this.#sinks.push({\n sink,\n dropOnBackpressure: false,\n destroy: () => sink.destroy(),\n });\n }\n\n attach(socket: net.Socket) {\n if (this.#destroyed) {\n socket.destroy();\n return;\n }\n socket.unref();\n const sink = createSocketSink(socket);\n const entry = {\n sink,\n dropOnBackpressure: true,\n destroy: () => {\n sink.destroy();\n socket.destroy();\n },\n };\n this.#sinks.push(entry);\n const detach = () => {\n const index = this.#sinks.indexOf(entry);\n if (index > -1) this.#sinks.splice(index, 1);\n entry.destroy();\n };\n socket.on('close', detach);\n socket.on('error', detach);\n }\n\n ingest(socket: net.Socket) {\n // Forward complete lines as one block; hold back only the partial tail\n let pending = '';\n socket.unref();\n socket.setEncoding('utf8');\n socket.on('data', (chunk: string) => {\n const data = pending ? pending + chunk : chunk;\n const end = data.lastIndexOf('\\n');\n if (end === data.length - 1) {\n pending = '';\n this._writeln(data);\n } else if (end === -1) {\n pending = data;\n } else {\n pending = data.slice(end + 1);\n this._writeln(data.slice(0, end + 1));\n }\n });\n socket.on('error', () => {});\n }\n\n _writeln(line: string): boolean {\n const sinks = this.#sinks;\n let writable = false;\n for (let i = sinks.length - 1; i >= 0; i--) {\n const entry = sinks[i];\n const accepted = entry.sink._writeln(line);\n if (\n !accepted &&\n entry.dropOnBackpressure &&\n (entry.sink.buffered ?? Infinity) > MAX_SUBSCRIBER_BUFFERED\n ) {\n sinks.splice(i, 1);\n entry.destroy();\n }\n writable = accepted || writable;\n }\n return writable;\n }\n\n flush(cb: (error?: Error | null) => void) {\n if (this.#primary.flush) this.#primary.flush(cb);\n else cb();\n }\n\n end(cb?: () => void): this {\n for (const entry of this.#sinks) {\n entry.sink.end(entry.sink === this.#primary ? cb : undefined);\n }\n return this;\n }\n\n destroy() {\n this.#destroyed = true;\n for (const entry of this.#sinks) entry.destroy();\n this.#sinks.length = 0;\n }\n}\n","import net from 'node:net';\n\nimport { INTERNAL_IPC_ENV } from '../constants';\nimport type { LogStreamOpener } from './logStream';\n\nconst CONNECT_RETRY_MS = 50;\nconst MAX_CONNECT_RETRY_MS = 750;\n\nexport function getParentIpcPath() {\n return process.env[INTERNAL_IPC_ENV];\n}\n\nexport function publishIpcPath(socketPath: string) {\n process.env[INTERNAL_IPC_ENV] = socketPath;\n return () => {\n if (process.env[INTERNAL_IPC_ENV] === socketPath)\n delete process.env[INTERNAL_IPC_ENV];\n };\n}\n\nexport interface OpenIpcOptions {\n retryMs?: number;\n maxRetryMs?: number;\n}\n\nexport function openIpc(\n socketPath: string,\n options: OpenIpcOptions = {}\n): LogStreamOpener {\n const retryMs = options.retryMs ?? CONNECT_RETRY_MS;\n const maxRetryMs = options.maxRetryMs ?? MAX_CONNECT_RETRY_MS;\n\n return (onOpened, stream) => {\n const startedAt = Date.now();\n const retry = (error: Error, attempt: () => void) => {\n if (Date.now() - startedAt > maxRetryMs) onOpened(error);\n else setTimeout(attempt, retryMs);\n };\n\n const attempt = () => {\n const socket = net.connect(socketPath);\n let opened = false;\n socket.once('connect', () => {\n const fd = (socket as any)._handle?.fd;\n opened = true;\n socket.unref();\n // The socket owns the borrowed fd; its close must stop the stream\n socket.once('close', () => stream.destroy());\n // A pending drain must keep the process alive until it flushes\n const drain = (data: string, cb: (error?: Error | null) => void) => {\n socket.ref();\n socket.write(data, error => {\n socket.unref();\n cb(error);\n });\n };\n if (typeof fd === 'number' && fd >= 0) {\n onOpened(null, fd, drain);\n } else {\n onOpened(null, null, drain);\n }\n });\n socket.once('error', error => {\n if (opened) return;\n socket.destroy();\n retry(error, attempt);\n });\n };\n attempt();\n };\n}\n","import { isMainThread, threadId } from 'node:worker_threads';\n\nimport { INTERNAL_PROCESS_ORIGIN_ENV } from '../constants';\n\nconst LOCAL_PROCESS_ORIGIN = Symbol.for('2g/process-origin');\n\ninterface EventLogGlobal {\n [LOCAL_PROCESS_ORIGIN]?: string;\n}\n\nexport interface ProcessOrigin {\n kind: 'worker_thread' | 'event_log_child' | 'child_process';\n id: string;\n}\n\nexport function setLocalProcessOrigin(id: string | undefined) {\n const globalScope = globalThis as EventLogGlobal;\n if (id) globalScope[LOCAL_PROCESS_ORIGIN] = id;\n else delete globalScope[LOCAL_PROCESS_ORIGIN];\n}\n\nexport function getProcessOrigin(): ProcessOrigin | null {\n if (!isMainThread) {\n return { kind: 'worker_thread', id: String(threadId) };\n }\n\n const localOrigin = (globalThis as EventLogGlobal)[LOCAL_PROCESS_ORIGIN];\n const inheritedOrigin = process.env[INTERNAL_PROCESS_ORIGIN_ENV];\n if (inheritedOrigin && inheritedOrigin !== localOrigin) {\n return {\n kind: 'event_log_child',\n id: String(process.pid),\n };\n }\n\n if (process.env.NODE_UNIQUE_ID) {\n return { kind: 'child_process', id: process.env.NODE_UNIQUE_ID };\n }\n\n return null;\n}\n\nexport function getProcessWorkerId() {\n const origin = getProcessOrigin();\n return origin ? `${origin.kind}:${origin.id}` : undefined;\n}\n\nexport function publishProcessOrigin() {\n const origin = String(process.pid);\n process.env[INTERNAL_PROCESS_ORIGIN_ENV] = origin;\n setLocalProcessOrigin(origin);\n return () => {\n if (process.env[INTERNAL_PROCESS_ORIGIN_ENV] === origin)\n delete process.env[INTERNAL_PROCESS_ORIGIN_ENV];\n setLocalProcessOrigin(undefined);\n };\n}\n","const PROCESS_CLEANUP = Symbol.for('2g/process-cleanup');\n\ninterface EventLogGlobal {\n [PROCESS_CLEANUP]?: ProcessCleanupState;\n}\n\ninterface ProcessCleanupState {\n registered: boolean;\n callbacks: Set<() => void>;\n}\n\nexport function registerProcessCleanup(callback: () => void) {\n const cleanup = getProcessCleanupState();\n cleanup.callbacks.add(callback);\n if (cleanup.registered) return;\n cleanup.registered = true;\n\n process.once('exit', runProcessCleanup);\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP'] as const) {\n process.once(signal, () => {\n if (process.listenerCount(signal) > 0) return;\n runProcessCleanup();\n process.kill(process.pid, signal);\n });\n }\n}\n\nfunction getProcessCleanupState() {\n const globalScope = globalThis as EventLogGlobal;\n return (globalScope[PROCESS_CLEANUP] ??= {\n registered: false,\n callbacks: new Set(),\n });\n}\n\nfunction runProcessCleanup() {\n for (const callback of getProcessCleanupState().callbacks) {\n try {\n callback();\n } catch {}\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport net from 'node:net';\n\nimport {\n DEBUG_SEGMENTS,\n DEBUG_SEGMENT_SIZE,\n DEFAULT_SEGMENTS,\n DEFAULT_SEGMENT_SIZE,\n EVENT_LOG_FORMAT_VERSION,\n SESSION_FILES,\n} from './constants';\nimport { cleanStaleSessionsSync, getSessionBaseDir } from './clean';\nimport { createDebugSink } from './debug';\nimport { eventLogState } from './state';\nimport { BroadcastChannel } from './utils/broadcastChannel';\nimport { LogStream, type EventSink } from './utils/logStream';\nimport { publishIpcPath } from './utils/ipc';\nimport { publishProcessOrigin } from './utils/processOrigin';\nimport { registerProcessCleanup } from './utils/processExit';\nimport {\n createSocketAddress,\n listenSocket,\n removeSocket,\n} from './utils/sessionSockets';\n\nexport interface SessionOptions {\n command?: string;\n version?: string;\n maxSegments?: number;\n maxSegmentSize?: number;\n}\n\nexport interface SessionMeta {\n pid: number;\n formatVersion: number;\n startedAt: number;\n command: string;\n cwd: string;\n maxSegments: number;\n version?: string;\n // Relative to meta.json, or a Windows named-pipe name\n socket: string;\n ipcSocket: string;\n origin: {\n argv: string[];\n execPath: string;\n cwd: string;\n ppid?: number;\n env?: {\n npmLifecycleEvent?: string;\n npmExecPath?: string;\n npmPackageName?: string;\n };\n };\n}\n\nexport interface SessionContext {\n sessionDir: string;\n meta: SessionMeta;\n sink: EventSink;\n destroy(): void;\n}\n\nexport function createSession(options: SessionOptions): SessionContext {\n const baseDir = getSessionBaseDir();\n const startedAt = Date.now();\n // The name is collision-free across PID reuse and never parsed by readers\n const sessionId = `${process.pid}-${startedAt.toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)\n .padEnd(6, '0')}`;\n const sessionDir = path.join(baseDir, sessionId);\n // An unwritable tmpdir must not crash the host\n try {\n fs.mkdirSync(sessionDir, { recursive: true, mode: 0o700 });\n // A base dir created before permissions were restricted stays 0755\n fs.chmodSync(baseDir, 0o700);\n } catch {}\n\n const maxSegments =\n options.maxSegments ??\n (eventLogState.debug ? DEBUG_SEGMENTS : DEFAULT_SEGMENTS);\n const maxSegmentSize =\n options.maxSegmentSize ??\n (eventLogState.debug ? DEBUG_SEGMENT_SIZE : DEFAULT_SEGMENT_SIZE);\n const liveSocket = createSocketAddress(sessionDir, sessionId, 'live');\n const ipcSocket = createSocketAddress(sessionDir, sessionId, 'ipc');\n\n const fileStream = new LogStream(path.join(sessionDir, '0.jsonl'));\n const sink = new BroadcastChannel(fileStream);\n sink.add(createDebugSink());\n trackSegmentRotation(fileStream, sessionDir, maxSegments, maxSegmentSize);\n\n const liveServer = net.createServer(socket => sink.attach(socket));\n const ipcServer = net.createServer(socket => sink.ingest(socket));\n const closeLiveServer = listenSocket(liveServer, liveSocket.path);\n const closeIpcServer = listenSocket(ipcServer, ipcSocket.path);\n const restoreIpcPath = publishIpcPath(ipcSocket.path);\n const restoreProcessOrigin = publishProcessOrigin();\n\n const meta: SessionMeta = {\n pid: process.pid,\n formatVersion: EVENT_LOG_FORMAT_VERSION,\n startedAt,\n command: options.command ?? process.argv.slice(1).join(' '),\n cwd: process.cwd(),\n maxSegments,\n version: options.version,\n socket: liveSocket.name,\n ipcSocket: ipcSocket.name,\n origin: createSessionOrigin(),\n };\n // Without meta.json the session is invisible to tooling; logging still works\n try {\n writeJsonAtomic(path.join(sessionDir, SESSION_FILES.meta), meta);\n } catch {}\n\n let destroyed = false;\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n sink.destroy();\n closeLiveServer();\n closeIpcServer();\n restoreIpcPath();\n restoreProcessOrigin();\n // rmSync can throw EPERM/EBUSY and must not skip the restoration above\n removeSocket(liveSocket.path);\n removeSocket(ipcSocket.path);\n };\n\n registerProcessCleanup(destroy);\n\n // Stale-session cleanup stays off the install hot path\n setImmediate(() => {\n try {\n cleanStaleSessionsSync();\n } catch {}\n });\n\n return { sessionDir, meta, sink, destroy };\n}\n\nfunction trackSegmentRotation(\n stream: LogStream,\n sessionDir: string,\n maxSegments: number,\n maxSegmentSize: number\n) {\n let bytesWritten = 0;\n stream.on('write', written => {\n bytesWritten += written;\n if (bytesWritten < maxSegmentSize) return;\n bytesWritten = 0;\n rotateSegments(sessionDir, maxSegments);\n stream.reopen();\n });\n}\n\nfunction rotateSegments(sessionDir: string, maxSegments: number) {\n fs.rmSync(path.join(sessionDir, `${maxSegments - 1}.jsonl`), { force: true });\n for (let i = maxSegments - 1; i >= 1; i--) {\n const from = path.join(sessionDir, `${i - 1}.jsonl`);\n const to = path.join(sessionDir, `${i}.jsonl`);\n try {\n fs.renameSync(from, to);\n } catch {}\n }\n}\n\nfunction writeJsonAtomic(file: string, data: unknown) {\n const tmp = `${file}.${process.pid}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });\n fs.renameSync(tmp, file);\n}\n\nfunction createSessionOrigin(): SessionMeta['origin'] {\n const env = {\n npmLifecycleEvent: process.env.npm_lifecycle_event,\n npmExecPath: process.env.npm_execpath,\n npmPackageName: process.env.npm_package_name,\n };\n return {\n argv: process.argv.slice(1),\n execPath: process.execPath,\n cwd: process.cwd(),\n ppid: process.ppid || undefined,\n env: Object.values(env).some(Boolean) ? env : undefined,\n };\n}\n","import path from 'node:path';\n\nimport { events } from './events';\nimport {\n EVENT_LOG_FORMAT_VERSION,\n LOG_DEBUG_ENV,\n LOG_EVENTS_ENV,\n} from './constants';\nimport { eventLogState, type EventLoggerInfo } from './state';\nimport { createSession, type SessionOptions } from './session';\nimport {\n LogStream,\n type EventSink,\n type LogStreamOpener,\n type LogStreamOptions,\n} from './utils/logStream';\nimport { getParentIpcPath, openIpc } from './utils/ipc';\nimport { getProcessOrigin, getProcessWorkerId } from './utils/processOrigin';\nimport { redirectConsoleForFd } from './utils/redirectConsole';\n\nexport type { EventLoggerInfo } from './state';\n\nexport interface InstallEventLoggerOptions extends SessionOptions {\n session?: boolean;\n debug?: boolean;\n}\n\nconst rootEvent = events('root');\n\nexport function installChildEventLogger(\n options?: InstallEventLoggerOptions\n): boolean {\n if (eventLogState.primarySink) {\n return true;\n }\n\n const workerId = getProcessWorkerId();\n if (workerId) {\n eventLogState.eventMeta = { _w: workerId };\n }\n\n const ipcPath = getParentIpcPath();\n if (ipcPath) {\n eventLogState.debug = options?.debug ?? !!process.env[LOG_DEBUG_ENV];\n connectToParent(ipcPath);\n return true;\n } else {\n return false;\n }\n}\n\nexport function installEventLogger(\n targetOrOptions?: string | number | InstallEventLoggerOptions\n): void {\n const options =\n targetOrOptions && typeof targetOrOptions === 'object'\n ? targetOrOptions\n : undefined;\n\n if (installChildEventLogger(options)) {\n return;\n }\n\n const explicitTarget =\n parseLogTarget(process.env[LOG_EVENTS_ENV]) ??\n parseLogTarget(\n typeof targetOrOptions === 'string' || typeof targetOrOptions === 'number'\n ? targetOrOptions\n : undefined\n );\n\n if (explicitTarget != null) {\n if (typeof explicitTarget === 'number')\n redirectConsoleForFd(explicitTarget);\n eventLogState.debug = options?.debug ?? true;\n eventLogState.eventLoggerInfo = getExplicitTargetInfo(explicitTarget);\n activateSink(createPrimarySink(explicitTarget));\n return;\n }\n\n if (options && options.session !== false) {\n eventLogState.debug = options.debug ?? !!process.env[LOG_DEBUG_ENV];\n const session = createSession(options);\n eventLogState.logPath = session.sessionDir;\n eventLogState.eventLoggerInfo = {\n destination: 'session',\n isUserVisibleOutput: false,\n sessionDir: session.sessionDir,\n };\n activateSink(session.sink, options.version);\n return;\n }\n}\n\nexport const getEventLoggerInfo = (): EventLoggerInfo | null =>\n eventLogState.primarySink?.writable ? eventLogState.eventLoggerInfo : null;\n\nexport function flushEventLogger(): Promise<void> {\n return new Promise(resolve => {\n const sink = eventLogState.primarySink;\n if (sink?.flush) sink.flush(() => resolve());\n else resolve();\n });\n}\n\nfunction parseLogTarget(target: string | number | undefined) {\n if (typeof target === 'number') {\n return Number.isSafeInteger(target) && target > 0 ? target : undefined;\n }\n\n if (!target) return undefined;\n\n const fd = parseInt(target, 10);\n if (`${fd}` === target && fd > 0 && Number.isSafeInteger(fd)) return fd;\n\n try {\n const parsedPath = path.parse(target);\n const destination = path.format(parsedPath);\n eventLogState.logPath = parsedPath.dir || process.cwd();\n return destination;\n } catch {\n return undefined;\n }\n}\n\nfunction createPrimarySink(\n dest: string | number | LogStreamOpener,\n options?: LogStreamOptions\n) {\n const stream = new LogStream(dest, options);\n // A dead target restores the no-op hot path\n stream.once('error', () => {\n eventLogState.primarySink = undefined;\n eventLogState.eventLoggerInfo = null;\n });\n return stream;\n}\n\nfunction getExplicitTargetInfo(target: string | number): EventLoggerInfo {\n if (typeof target === 'number') {\n return {\n destination: target === 1 ? 'stdout' : target === 2 ? 'stderr' : 'fd',\n isUserVisibleOutput: target === 1 || target === 2,\n fd: target,\n };\n }\n\n return {\n destination: 'file',\n isUserVisibleOutput: false,\n file: target,\n };\n}\n\nfunction getInitMetadata(version?: string) {\n return {\n format: 'v0-jsonl',\n formatVersion: EVENT_LOG_FORMAT_VERSION,\n version: version ?? 'UNVERSIONED',\n processOrigin: getProcessOrigin() ?? undefined,\n };\n}\n\nfunction activateSink(sink: EventSink, version?: string) {\n eventLogState.primarySink = sink;\n rootEvent('init', getInitMetadata(version));\n}\n\nfunction connectToParent(ipcPath: string) {\n eventLogState.primarySink = createPrimarySink(openIpc(ipcPath), {\n closeFd: false,\n });\n eventLogState.eventLoggerInfo = {\n destination: 'ipc',\n isUserVisibleOutput: false,\n };\n rootEvent('init', getInitMetadata());\n}\n","import { installChildEventLogger } from './install';\n\nexport { events } from './events';\n\nexport {\n installEventLogger,\n installChildEventLogger,\n flushEventLogger,\n getEventLoggerInfo,\n type EventLoggerInfo,\n type InstallEventLoggerOptions,\n} from './install';\n\nexport type {\n AllEvents,\n EventByKey,\n EventKeys,\n EventLogger,\n EventRegistry,\n ParsedEvent,\n Serialized,\n SerializedError,\n SpanEnd,\n} from './types';\n\ninstallChildEventLogger();\n"],"names":["STATE_SYMBOL","Symbol","for","EVENT_LOG_STATE_VERSION","eventLogState","getEventLogState","globalScope","globalThis","logPath","process","cwd","eventLoggerInfo","debug","TIME_ORIGIN","performance","timeOrigin","TIMESTAMP_FRACTIONS","Array","from","length","_","us","padStart","cachedMs","cachedMsJson","cachedWorkerId","cachedWorkerIdJson","writeEvent","dest","category","kind","payload","meta","level","_writeln","serializeEvent","duration","timestamp","stringifyTimestamp","_w","rest","JSON","stringify","slice","line","stringifyWorkerId","appendPayload","undefined","writeCompleteEvent","startPayload","endPayload","delta","appendMergedPayload","now","ms","Math","floor","workerId","NOOP_DONE","serializeError","error","depth","Error","String","serialized","name","message","code","stack","cause","createEventLogger","log","event","data","primarySink","eventMeta","span","start","done","path","relativePath","target","toJSON","isAbsolute","relative","replace","events","EVENT_LEVEL_DEBUG","createDebugSink","value","env","LOG_DEBUG_ENV","filter","compileLogDebugFilter","patterns","split","map","pattern","trim","Boolean","compileEventFilter","colorize","shouldColorizeStream","stderr","writable","end","indexOf","parseEventLine","matchesTapOptions","write","formatPrettyEvent","stream","cb","this","destroy","LogStream","EventEmitter","fd","file","oldFd","closeFd","writing","ending","closing","flushPending","destroyed","opening","reopening","output","len","lines","head","partialLine","busyRetries","draining","scheduled","drain","onRelease","#onRelease","err","written","release","onDrained","fail","Buffer","byteLength","onScheduledWrite","#onScheduledWrite","writeLine","constructor","options","super","fs","fsyncSync","nextTick","emit","openFile","open","buffered","reopen","once","retryLine","setImmediate","min","setTimeout","toString","close","onOpened","mkdir","dirname","recursive","fchmod","isStdFd","fsFsync","onClose","listenerCount","scheduleWrite","_end","arg1","arg2","arg3","maybeCb","input","flush","onDrain","off","onError","push","_write","charCodeAt","startIdx","endIdx","encoding","dispose","stdout","fsync","SocketSink","socket","on","writableLength","BroadcastChannel","primary","sinks","sink","dropOnBackpressure","i","add","attach","unref","_handle","createSocketSink","entry","detach","index","splice","ingest","pending","setEncoding","chunk","lastIndexOf","accepted","Infinity","openIpc","socketPath","retryMs","maxRetryMs","startedAt","Date","attempt","net","connect","opened","ref","retry","LOCAL_PROCESS_ORIGIN","setLocalProcessOrigin","id","getProcessOrigin","isMainThread","threadId","localOrigin","inheritedOrigin","INTERNAL_PROCESS_ORIGIN_ENV","pid","NODE_UNIQUE_ID","PROCESS_CLEANUP","getProcessCleanupState","registered","callbacks","Set","runProcessCleanup","callback","createSession","baseDir","getSessionBaseDir","sessionId","random","padEnd","sessionDir","join","mkdirSync","mode","chmodSync","maxSegments","DEBUG_SEGMENTS","DEFAULT_SEGMENTS","maxSegmentSize","DEBUG_SEGMENT_SIZE","DEFAULT_SEGMENT_SIZE","liveSocket","createSocketAddress","ipcSocket","fileStream","trackSegmentRotation","bytesWritten","rotateSegments","rmSync","force","to","renameSync","liveServer","createServer","ipcServer","closeLiveServer","listenSocket","closeIpcServer","restoreIpcPath","publishIpcPath","INTERNAL_IPC_ENV","restoreProcessOrigin","publishProcessOrigin","origin","formatVersion","EVENT_LOG_FORMAT_VERSION","command","argv","version","createSessionOrigin","writeJsonAtomic","tmp","writeFileSync","SESSION_FILES","removeSocket","registerProcessCleanup","cleanup","signal","kill","cleanStaleSessionsSync","npmLifecycleEvent","npm_lifecycle_event","npmExecPath","npm_execpath","npmPackageName","npm_package_name","execPath","ppid","Object","values","some","rootEvent","installChildEventLogger","getProcessWorkerId","ipcPath","getParentIpcPath","connectToParent","createPrimarySink","destination","isUserVisibleOutput","getInitMetadata","installEventLogger","targetOrOptions","explicitTarget","parseLogTarget","LOG_EVENTS_ENV","redirectConsoleForFd","getExplicitTargetInfo","activateSink","session","getEventLoggerInfo","flushEventLogger","Promise","resolve","Number","isSafeInteger","parseInt","parsedPath","parse","format","dir","processOrigin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"2g.mjs","sources":["../src/state.ts","../src/utils/serializeEvent.ts","../src/events.ts","../src/debug.ts","../src/utils/processExit.ts","../src/utils/ipc.ts","../src/utils/logStream.ts","../src/utils/broadcastChannel.ts","../src/utils/processOrigin.ts","../src/session.ts","../src/install.ts","../src/index.ts"],"sourcesContent":["import { EVENT_LOG_STATE_VERSION } from './constants';\nimport type { EventSink } from './utils/logStream';\nimport type { EventMeta } from './utils/serializeEvent';\n\nexport interface EventLoggerInfo {\n destination: 'file' | 'stdout' | 'stderr' | 'fd' | 'session' | 'ipc';\n isUserVisibleOutput: boolean;\n debug: boolean;\n file?: string;\n fd?: number;\n sessionDir?: string;\n}\n\nexport interface EventLogState {\n logPath: string;\n primarySink?: EventSink;\n eventMeta?: EventMeta;\n eventLoggerInfo: EventLoggerInfo | null;\n debug: boolean;\n}\n\nconst STATE_SYMBOL = Symbol.for(`2g/state-${EVENT_LOG_STATE_VERSION}`);\n\ninterface EventLogGlobal {\n [STATE_SYMBOL]?: EventLogState;\n}\n\nexport const eventLogState = getEventLogState();\n\nexport function _resetEventLogState() {\n eventLogState.primarySink?.destroy();\n eventLogState.logPath = process.cwd();\n eventLogState.primarySink = undefined;\n eventLogState.eventMeta = undefined;\n eventLogState.eventLoggerInfo = null;\n eventLogState.debug = false;\n}\n\nfunction getEventLogState() {\n const globalScope = globalThis as EventLogGlobal;\n return (globalScope[STATE_SYMBOL] ??= {\n logPath: process.cwd(),\n eventLoggerInfo: null,\n debug: false,\n });\n}\n","import { performance } from 'node:perf_hooks';\n\nimport type { EventSink } from './logStream';\n\nconst TIME_ORIGIN = performance.timeOrigin;\n\nconst TIMESTAMP_FRACTIONS = Array.from(\n { length: 1000 },\n (_, us) => `.${`${us}`.padStart(3, '0')}`\n);\n\nlet cachedMs = -1;\nlet cachedMsJson = '';\nlet cachedWorkerId: string | undefined;\nlet cachedWorkerIdJson = '';\n\nexport interface EventMeta {\n _w?: string;\n}\n\nexport function serializeEvent(\n category: string,\n kind: string,\n payload: Record<string, unknown> | undefined,\n meta?: EventMeta,\n duration?: number,\n level?: number\n) {\n const timestamp = stringifyTimestamp();\n if (duration == null && !meta?._w && !level) {\n const rest = payload ? JSON.stringify(payload).slice(1) : '';\n return rest.length > 1\n ? `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp},${rest}\\n`\n : `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp}}\\n`;\n }\n\n let line = `{\"_e\":\"${category}:${kind}\",\"_t\":${timestamp}`;\n if (duration != null) line += `,\"_d\":${duration}`;\n if (level) line += `,\"_l\":${level}`;\n if (meta?._w) line += `,\"_w\":${stringifyWorkerId(meta._w)}`;\n return `${appendPayload(line, payload)}}\\n`;\n}\n\nexport function writeEvent(\n dest: EventSink,\n category: string,\n kind: string,\n payload: Record<string, unknown> | undefined,\n meta?: EventMeta,\n level?: number\n) {\n // Unserializable payloads (circular, BigInt) drop the event, never throw into the host\n try {\n dest._writeln(\n serializeEvent(category, kind, payload, meta, undefined, level)\n );\n } catch {}\n}\n\nexport function writeCompleteEvent(\n dest: EventSink,\n category: string,\n kind: string,\n startPayload: Record<string, unknown> | undefined,\n endPayload: Record<string, unknown> | undefined,\n delta: number,\n meta?: EventMeta,\n level?: number\n) {\n try {\n let line = `{\"_e\":\"${category}:${kind}\",\"_t\":${stringifyTimestamp()},\"_d\":${delta}`;\n if (level) line += `,\"_l\":${level}`;\n if (meta?._w) line += `,\"_w\":${stringifyWorkerId(meta._w)}`;\n dest._writeln(`${appendMergedPayload(line, startPayload, endPayload)}}\\n`);\n } catch {}\n}\n\nexport function getEventTimestamp() {\n return TIME_ORIGIN + performance.now();\n}\n\nfunction stringifyTimestamp() {\n const timestamp = TIME_ORIGIN + performance.now();\n const ms = Math.floor(timestamp);\n if (ms !== cachedMs) {\n cachedMs = ms;\n cachedMsJson = `${ms}`;\n }\n return cachedMsJson + TIMESTAMP_FRACTIONS[((timestamp - ms) * 1000) | 0];\n}\n\nfunction stringifyWorkerId(workerId: string) {\n if (workerId !== cachedWorkerId) {\n cachedWorkerId = workerId;\n cachedWorkerIdJson = JSON.stringify(workerId);\n }\n return cachedWorkerIdJson;\n}\n\nfunction appendPayload(line: string, payload?: Record<string, unknown>) {\n if (!payload) return line;\n const rest = JSON.stringify(payload);\n return rest && rest.length > 2 ? `${line},${rest.slice(1, -1)}` : line;\n}\n\nfunction appendMergedPayload(\n line: string,\n startPayload?: Record<string, unknown>,\n endPayload?: Record<string, unknown>\n) {\n if (!startPayload) return appendPayload(line, endPayload);\n if (!endPayload) return appendPayload(line, startPayload);\n return appendPayload(line, Object.assign(startPayload, endPayload));\n}\n","import path from 'node:path';\nimport { performance } from 'node:perf_hooks';\n\nimport { EVENT_LEVEL_DEBUG } from './constants';\nimport { eventLogState } from './state';\nimport { writeCompleteEvent, writeEvent } from './utils/serializeEvent';\nimport type { EventLogger, SerializedError, SpanEnd } from './types';\n\nconst NOOP_DONE: SpanEnd<any> = () => {};\n\nfunction serializeError(\n error: unknown,\n depth = 0\n): SerializedError | string | null {\n if (error == null) return null;\n if (!(error instanceof Error)) return String(error);\n const serialized: SerializedError = {\n name: error.name,\n message: error.message,\n };\n const code = (error as NodeJS.ErrnoException).code;\n if (typeof code === 'string') serialized.code = code;\n const stack = error.stack;\n if (stack) serialized.stack = stack;\n // The depth cap guards cyclic causes\n if (error.cause != null && depth < 4)\n serialized.cause = serializeError(error.cause, depth + 1)!;\n return serialized;\n}\n\nfunction createEventLogger<const Category extends string>(\n category: Category,\n level: number | undefined\n): EventLogger<Category> {\n function log(event: string, data?: Record<string, unknown>) {\n if (eventLogState.primarySink && (!level || eventLogState.debug))\n writeEvent(\n eventLogState.primarySink,\n category,\n event,\n data,\n eventLogState.eventMeta,\n level\n );\n }\n\n log.span = function span() {\n if (!eventLogState.primarySink || (level && !eventLogState.debug))\n return NOOP_DONE;\n const start = performance.now();\n return function done(event: string, data?: Record<string, unknown>) {\n if (!eventLogState.primarySink) return;\n writeCompleteEvent(\n eventLogState.primarySink,\n category,\n event,\n data,\n undefined,\n performance.now() - start,\n eventLogState.eventMeta,\n level\n );\n };\n };\n\n log.path = function relativePath(target: string | undefined | null) {\n return {\n toJSON(): string | null {\n try {\n return target != null && path.isAbsolute(target)\n ? path\n .relative(eventLogState.logPath, target)\n .replace(/\\\\/g, '/') || '.'\n : (target ?? null);\n } catch {\n return target || null;\n }\n },\n };\n };\n\n log.error = function error(error: unknown) {\n return {\n toJSON: () => serializeError(error),\n };\n };\n log.category = category;\n return log as EventLogger<Category>;\n}\n\nexport function events<const Category extends string>(\n category: Category\n): EventLogger<Category> {\n return createEventLogger(category, undefined);\n}\n\nevents.debug = function debug<const Category extends string>(\n category: Category\n): EventLogger<Category> {\n return createEventLogger(category, EVENT_LEVEL_DEBUG);\n};\n","import { LOG_DEBUG_ENV } from './constants';\nimport {\n compileEventFilter,\n matchesTapOptions,\n parseEventLine,\n} from './utils/eventFilter';\nimport type { EventSink } from './utils/logStream';\nimport { formatPrettyEvent, shouldColorizeStream } from './utils/pretty';\n\nexport function createDebugSink(\n value = process.env[LOG_DEBUG_ENV]\n): EventSink | null {\n const filter = compileLogDebugFilter(value);\n if (!filter) return null;\n\n const colorize = shouldColorizeStream(process.stderr);\n return {\n get writable() {\n return true;\n },\n _writeln(data: string) {\n // Ingested worker blocks can carry multiple lines per write\n let start = 0;\n let end: number;\n while ((end = data.indexOf('\\n', start)) !== -1) {\n const line = data.slice(start, end);\n start = end + 1;\n if (!line) continue;\n // LOG_DEBUG is itself the debug opt-in\n const event = parseEventLine(line, { debug: true });\n if (!event || !matchesTapOptions(event, { debug: true }, filter))\n continue;\n process.stderr.write(\n `${formatPrettyEvent(event, {\n colorize,\n stream: process.stderr,\n })}\\n`\n );\n }\n return true;\n },\n end(cb?: () => void) {\n cb?.();\n return this;\n },\n destroy() {},\n };\n}\n\nfunction compileLogDebugFilter(value: string | undefined) {\n const patterns = value\n ?.split(/[\\s,]+/)\n .map(pattern => pattern.trim())\n .filter(Boolean);\n if (!patterns?.length) return null;\n return compileEventFilter(patterns);\n}\n","const PROCESS_CLEANUP = Symbol.for('2g/process-cleanup');\n\ninterface EventLogGlobal {\n [PROCESS_CLEANUP]?: ProcessCleanupState;\n}\n\ninterface ProcessCleanupState {\n registered: boolean;\n callbacks: Set<() => void>;\n}\n\nexport function registerProcessCleanup(callback: () => void) {\n const cleanup = getProcessCleanupState();\n cleanup.callbacks.add(callback);\n if (cleanup.registered) return;\n cleanup.registered = true;\n\n process.once('exit', runProcessCleanup);\n for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP'] as const) {\n process.once(signal, () => {\n if (process.listenerCount(signal) > 0) return;\n runProcessCleanup();\n process.kill(process.pid, signal);\n });\n }\n}\n\nfunction getProcessCleanupState() {\n const globalScope = globalThis as EventLogGlobal;\n return (globalScope[PROCESS_CLEANUP] ??= {\n registered: false,\n callbacks: new Set(),\n });\n}\n\nfunction runProcessCleanup() {\n for (const callback of getProcessCleanupState().callbacks) {\n try {\n callback();\n } catch {}\n }\n}\n","import net from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport {\n INTERNAL_DEBUG_ENV,\n INTERNAL_IPC_ENV,\n LOG_DEBUG_ENV,\n LOG_EVENTS_ENV,\n} from '../constants';\nimport { eventLogState } from '../state';\nimport type { EventSink, LogStream, LogStreamOpener } from './logStream';\nimport { registerProcessCleanup } from './processExit';\nimport { listenSocket, removeSocket } from './sessionSockets';\n\nconst CONNECT_RETRY_MS = 50;\nconst MAX_CONNECT_RETRY_MS = 750;\n\nexport function getParentIpcPath() {\n return process.env[INTERNAL_IPC_ENV];\n}\n\nexport function isParentDebugEnabled() {\n return process.env[INTERNAL_DEBUG_ENV] === '1';\n}\n\nfunction publishIpcPath(socketPath: string) {\n process.env[INTERNAL_IPC_ENV] = socketPath;\n return () => {\n if (process.env[INTERNAL_IPC_ENV] === socketPath)\n delete process.env[INTERNAL_IPC_ENV];\n };\n}\n\nexport function listenIpcSink(sink: EventSink, socketPath: string) {\n const server = net.createServer(socket => ingestIpcSocket(socket, sink));\n const closeServer = listenSocket(server, socketPath);\n const restoreIpcPath = publishIpcPath(socketPath);\n const isDebug = eventLogState.debug;\n if (isDebug) {\n process.env[INTERNAL_DEBUG_ENV] = '1';\n }\n\n delete process.env[LOG_DEBUG_ENV];\n delete process.env[LOG_EVENTS_ENV];\n\n return () => {\n closeServer();\n restoreIpcPath();\n if (isDebug) {\n delete process.env[INTERNAL_DEBUG_ENV];\n }\n };\n}\n\nfunction createTempIpcPath() {\n const now = Date.now().toString(36);\n const rand = Math.random().toString(36).slice(2, 10);\n const id = `${process.pid}-${now}-${rand}`;\n return process.platform === 'win32'\n ? `\\\\\\\\.\\\\pipe\\\\event-log-${id}-ipc`\n : path.join(os.tmpdir(), `event-log-${id}.sock`);\n}\n\nexport function publishTempIpcSink(sink: LogStream) {\n const socketPath = createTempIpcPath();\n const closeIpc = listenIpcSink(sink, socketPath);\n let cleanedUp = false;\n\n const cleanup = () => {\n if (cleanedUp) return;\n cleanedUp = true;\n closeIpc();\n removeSocket(socketPath);\n };\n\n const destroy = sink.destroy.bind(sink);\n sink.destroy = () => {\n cleanup();\n destroy();\n };\n sink.once('close', cleanup);\n registerProcessCleanup(cleanup);\n}\n\nexport interface OpenIpcOptions {\n retryMs?: number;\n maxRetryMs?: number;\n}\n\nexport function openIpc(\n socketPath: string,\n options: OpenIpcOptions = {}\n): LogStreamOpener {\n const retryMs = options.retryMs ?? CONNECT_RETRY_MS;\n const maxRetryMs = options.maxRetryMs ?? MAX_CONNECT_RETRY_MS;\n\n return (onOpened, stream) => {\n const startedAt = Date.now();\n const retry = (error: Error, attempt: () => void) => {\n if (Date.now() - startedAt > maxRetryMs) onOpened(error);\n else setTimeout(attempt, retryMs);\n };\n\n const attempt = () => {\n const socket = net.connect(socketPath);\n let opened = false;\n socket.once('connect', () => {\n const fd = (socket as any)._handle?.fd;\n opened = true;\n socket.unref();\n // The socket owns the borrowed fd; its close must stop the stream\n socket.once('close', () => stream.destroy());\n // A pending drain must keep the process alive until it flushes\n const drain = (data: string, cb: (error?: Error | null) => void) => {\n socket.ref();\n socket.write(data, error => {\n socket.unref();\n cb(error);\n });\n };\n if (typeof fd === 'number' && fd >= 0) {\n onOpened(null, fd, drain);\n } else {\n onOpened(null, null, drain);\n }\n });\n socket.once('error', error => {\n if (opened) return;\n socket.destroy();\n retry(error, attempt);\n });\n };\n attempt();\n };\n}\n\nexport function ingestIpcSocket(socket: net.Socket, sink: EventSink) {\n // Forward complete lines as one block; hold back only the partial tail.\n let pending = '';\n socket.unref();\n socket.setEncoding('utf8');\n socket.on('data', (chunk: string) => {\n const data = pending ? pending + chunk : chunk;\n const end = data.lastIndexOf('\\n');\n if (end === data.length - 1) {\n pending = '';\n sink._writeln(data);\n } else if (end === -1) {\n pending = data;\n } else {\n pending = data.slice(end + 1);\n sink._writeln(data.slice(0, end + 1));\n }\n });\n socket.on('error', () => {});\n}\n","import { Buffer } from 'node:buffer';\nimport { EventEmitter } from 'node:events';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nconst BUSY_WRITE_TIMEOUT = 100;\nconst HIGH_WATER_MARK = 16_384;\nconst WRITE_BATCH_SIZE = 65_536;\n\nexport interface EventSink {\n readonly writable: boolean;\n readonly file?: string | null;\n readonly buffered?: number;\n _writeln(data: string): boolean;\n flush?(cb: (error?: Error | null) => void): void;\n end(cb?: () => void): this;\n destroy(): void;\n}\n\nexport interface LogStreamOptions {\n closeFd?: boolean;\n}\n\nexport type LogStreamDrain = (\n data: string,\n cb: (error?: Error | null) => void\n) => void;\n\nexport type LogStreamOpener = (\n onOpened: (\n error: Error | null,\n fd?: number | null,\n drain?: LogStreamDrain\n ) => void,\n stream: LogStream\n) => void;\n\nexport class LogStream\n extends EventEmitter\n implements NodeJS.WritableStream, EventSink\n{\n #fd = -1;\n #file: string | null = null;\n #oldFd: number | null = null;\n #closeFd = true;\n\n #writing = false;\n #ending = false;\n #closing = false;\n #flushPending = false;\n #destroyed = false;\n #opening = false;\n #reopening = false;\n\n #output = '';\n #len = 0;\n #lines: string[] = [];\n #head = 0;\n #partialLine = 0;\n #busyRetries = 0;\n #draining = false;\n #scheduled = false;\n #drain?: LogStreamDrain;\n\n #onRelease = (err: NodeJS.ErrnoException | null, written: number) => {\n this.#release(err, written);\n };\n\n #onDrained = (error?: Error | null) => {\n if (error != null) {\n this.#fail(error as NodeJS.ErrnoException);\n } else {\n this.#release(null, Buffer.byteLength(this.#output));\n }\n };\n\n #onScheduledWrite = () => {\n this.#scheduled = false;\n if (\n !this.#writing &&\n !this.#destroyed &&\n (this.#lines.length - this.#head > this.#partialLine || this.#output)\n ) {\n this.#writeLine();\n }\n };\n\n constructor(\n dest: string | number | LogStreamOpener,\n options: LogStreamOptions = {}\n ) {\n super();\n this.#closeFd = options.closeFd !== false;\n if (typeof dest === 'number') {\n try {\n fs.fsyncSync(dest);\n } catch {}\n this.#fd = dest;\n process.nextTick(() => this.emit('ready'));\n } else if (typeof dest === 'string') {\n this.#openFile(dest);\n } else {\n this.#open(dest, null);\n }\n }\n\n get file(): string | null {\n return this.#file;\n }\n\n get fd(): number {\n return this.#fd;\n }\n\n get writing(): boolean {\n return this.#writing;\n }\n\n get buffered(): number {\n return this.#len;\n }\n\n get writable(): boolean {\n return !this.#destroyed && !this.#ending;\n }\n\n reopen(file = this.#file) {\n if (this.#file == null)\n throw new Error('Cannot reopen an fd-only LogStream');\n if (this.#destroyed || this.#ending) return;\n if (file) this.#file = file;\n if (this.#opening) {\n this.once('ready', () => this.reopen(file));\n return;\n }\n this.#reopening = true;\n if (!this.#writing) this.#reopen();\n }\n\n #reopen() {\n if (this.#file == null) return;\n this.#reopening = false;\n this.#oldFd = this.#fd;\n this.#openFile(this.#file);\n }\n\n #retryLine(error: NodeJS.ErrnoException) {\n if (error.code === 'EAGAIN' && this.#drain != null) {\n this.#draining = true;\n this.#drain(this.#output, this.#onDrained);\n } else if (this.#busyRetries === 0) {\n this.#busyRetries = 1;\n setImmediate(() => this.#writeLine());\n } else {\n this.#busyRetries = Math.min(this.#busyRetries * 2, BUSY_WRITE_TIMEOUT);\n setTimeout(() => this.#writeLine(), this.#busyRetries);\n }\n }\n\n #release(error: NodeJS.ErrnoException | null, written: number) {\n if (error) {\n if (error.code === 'EAGAIN' || error.code === 'EBUSY') {\n this.#retryLine(error);\n } else {\n this.#fail(error);\n }\n return;\n }\n\n this.#busyRetries = 0;\n this.emit('write', written);\n\n if (written === this.#output.length) {\n // Complete write; exact for ASCII, the common case for JSONL\n this.#len -= this.#output.length;\n this.#output = '';\n } else {\n const outputLength = Buffer.byteLength(this.#output);\n if (outputLength > written) {\n const output = Buffer.from(this.#output).toString('utf8', written);\n this.#len -= this.#output.length - output.length;\n this.#output = output;\n } else {\n this.#len -= this.#output.length;\n this.#output = '';\n }\n }\n\n if (this.#output) {\n this.#writeLine();\n } else if (this.#closing && !this.#ending) {\n this.#writing = false;\n this.#close();\n } else if (this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n } else if (this.#reopening) {\n this.#writing = false;\n this.#reopen();\n } else if (this.#ending) {\n this.#writing = false;\n this.#close();\n } else {\n this.#writing = false;\n this.#draining = false;\n if (this.#flushPending) {\n this.emit('drain');\n }\n }\n }\n\n #openFile(file: string) {\n this.#open(onOpened => {\n fs.mkdir(path.dirname(file), { recursive: true }, () => {\n fs.open(file, 'a', 0o600, (error, fd) => {\n if (error || fd == null) {\n onOpened(error);\n return;\n }\n fs.fchmod(fd, 0o600, () => {\n onOpened(null, fd);\n });\n });\n });\n }, file);\n }\n\n #open(open: LogStreamOpener, file: string | null) {\n this.#opening = true;\n this.#writing = true;\n\n const onOpened = (\n error: Error | null,\n fd?: number | null,\n drain?: LogStreamDrain\n ) => {\n const oldFd = this.#oldFd;\n this.#oldFd = null;\n if (error) {\n this.#opening = false;\n this.#fail(error as NodeJS.ErrnoException);\n } else {\n this.#fd = fd ?? -1;\n this.#file = file;\n this.#drain = drain;\n this.#opening = false;\n this.#writing = false;\n this.emit('ready');\n if (oldFd != null && oldFd !== this.#fd && !isStdFd(oldFd)) {\n fsFsync(oldFd, () => fs.close(oldFd, () => {}));\n }\n if (this.#destroyed) return;\n if (this.#closing) {\n this.#close();\n } else if (\n (!this.#writing &&\n this.#lines.length - this.#head > this.#partialLine) ||\n this.#flushPending\n ) {\n this.#writeLine();\n }\n }\n };\n\n open(onOpened, this);\n }\n\n #close() {\n if (this.#fd === -1 && this.#opening) {\n this.once('ready', () => this.#close());\n return;\n }\n\n this.#destroyed = true;\n this.#partialLine = 0;\n this.#lines.length = 0;\n this.#head = 0;\n\n const onClose = (error?: NodeJS.ErrnoException | null) => {\n if (error) {\n this.emit('error', error);\n this.emit('close', error);\n } else {\n if (this.#ending && !this.#writing) this.emit('finish');\n this.emit('close');\n }\n };\n\n if (this.#fd < 0) {\n onClose();\n return;\n }\n\n fsFsync(this.#fd, error => {\n if (!error && this.#closeFd && !isStdFd(this.#fd)) {\n fs.close(this.#fd, onClose);\n } else {\n onClose(); // Error intentionally ignored, assume closed\n }\n });\n }\n\n #fail(error: NodeJS.ErrnoException) {\n this.#writing = false;\n if (this.listenerCount('error')) this.emit('error', error);\n this.#close();\n }\n\n #scheduleWrite() {\n if (!this.#scheduled) {\n this.#scheduled = true;\n setImmediate(this.#onScheduledWrite);\n }\n }\n\n #writeLine() {\n this.#writing = true;\n if (!this.#output) {\n const end = this.#lines.length - this.#partialLine;\n if (end > this.#head) {\n this.#output = this.#lines[this.#head++] || '';\n // Batch accumulated lines into one write to avoid per-line syscalls\n while (this.#head < end && this.#output.length < WRITE_BATCH_SIZE) {\n this.#output += this.#lines[this.#head++];\n }\n if (this.#head === this.#lines.length) {\n this.#lines.length = 0;\n this.#head = 0;\n }\n }\n }\n // A deep queue under backpressure stays writability-paced until it empties\n if (this.#drain != null && (this.#draining || this.#fd < 0)) {\n this.#drain(this.#output, this.#onDrained);\n } else {\n fs.write(this.#fd, this.#output, this.#onRelease);\n }\n }\n\n _end() {\n if (!this.#destroyed && !this.#ending) {\n this.#ending = true;\n if (this.#opening) {\n this.once('ready', () => this._end());\n } else if (!this.#writing && this.#fd >= 0) {\n if (this.#lines.length - this.#head > this.#partialLine) {\n this.#writeLine();\n } else {\n this.#close();\n }\n }\n }\n return this;\n }\n\n end(cb?: () => void): this;\n end(data: string | Uint8Array, cb?: () => void): this;\n end(str: string, encoding?: BufferEncoding, cb?: () => void): this;\n\n end(\n arg1?: Uint8Array | string | (() => void),\n arg2?: BufferEncoding | (() => void),\n arg3?: () => void\n ) {\n const maybeCb = arg3 || arg2 || arg1;\n const input = typeof arg1 !== 'function' ? arg1 : undefined;\n const encoding = typeof arg2 === 'string' ? arg2 : 'utf8';\n const cb = typeof maybeCb === 'function' ? maybeCb : undefined;\n if (typeof input === 'string') {\n this.write(input, encoding);\n } else if (input != null) {\n this.write(input);\n }\n if (cb) this.once('close', cb);\n return this._end();\n }\n\n destroy() {\n if (this.#destroyed || this.#closing) return;\n if (this.#writing || this.#opening) {\n this.#closing = true;\n } else if (this.#lines.length - this.#head > this.#partialLine) {\n // A scheduled write counts as pending: complete it before closing\n this.#closing = true;\n this.#writeLine();\n } else {\n this.#close();\n }\n }\n\n flush(cb?: (error?: Error | null) => void) {\n if (this.#destroyed) {\n cb?.();\n } else {\n const onDrain = () => {\n if (!this.#destroyed) {\n fsFsync(this.#fd, error => {\n this.#flushPending = false;\n if (error?.code === 'EBADF') {\n cb?.(); // If fd is closed, ignore the error\n } else {\n cb?.(error);\n }\n });\n } else {\n this.#flushPending = false;\n cb?.();\n }\n this.off('error', onError);\n };\n\n const onError = (err: Error) => {\n this.#flushPending = false;\n this.off('drain', onDrain);\n cb?.(err);\n };\n\n this.#flushPending = true;\n this.once('drain', onDrain);\n this.once('error', onError);\n\n if (!this.#writing) {\n if (\n this.#lines.length - this.#head > this.#partialLine ||\n this.#output\n ) {\n this.#writeLine();\n } else {\n process.nextTick(() => this.emit('drain'));\n }\n }\n }\n }\n\n _writeln(data: string): boolean {\n if (this.#destroyed) return false;\n this.#len += data.length;\n this.#lines.push(data);\n if (!this.#writing) this.#scheduleWrite();\n return this.#len < HIGH_WATER_MARK;\n }\n\n _write(data: string): boolean {\n if (this.#destroyed) {\n return false;\n }\n\n if (\n this.#partialLine === 0 &&\n data.charCodeAt(data.length - 1) === 10 /*'\\n'*/\n ) {\n return this._writeln(data);\n }\n\n this.#len += data.length;\n\n let startIdx = 0;\n let endIdx = -1;\n while ((endIdx = data.indexOf('\\n', startIdx)) > -1) {\n const line = data.slice(startIdx, endIdx + 1);\n if (this.#partialLine > 0) {\n this.#lines[this.#lines.length - 1] += line;\n } else {\n this.#lines.push(line);\n }\n this.#partialLine = 0;\n startIdx = ++endIdx;\n }\n\n if (startIdx < data.length) {\n const line = data.slice(startIdx);\n if (this.#partialLine > 0) {\n this.#lines[this.#lines.length - 1] += line;\n } else {\n this.#lines.push(data.slice(startIdx));\n }\n this.#partialLine = 1;\n }\n\n if (!this.#writing && this.#lines.length - this.#head > this.#partialLine) {\n this.#scheduleWrite();\n }\n\n return this.#len < HIGH_WATER_MARK;\n }\n\n write(\n buffer: Uint8Array | string,\n cb?: (err?: Error | null) => void\n ): boolean;\n write(\n str: string,\n encoding?: BufferEncoding,\n cb?: (err?: Error | null) => void\n ): boolean;\n\n write(\n input: Uint8Array | string,\n arg2?: BufferEncoding | ((err?: Error | null) => void),\n arg3?: (err?: Error | null) => void\n ): boolean {\n const maybeCb = arg3 || arg2;\n const encoding = typeof arg2 === 'string' ? arg2 : 'utf8';\n const data =\n typeof input === 'string' ? input : Buffer.from(input).toString(encoding);\n const cb = typeof maybeCb === 'function' ? maybeCb : undefined;\n try {\n return this._write(data);\n } finally {\n cb?.();\n }\n }\n\n [Symbol.dispose]() {\n this.destroy();\n }\n}\n\nconst isStdFd = (fd: number) => {\n switch (fd) {\n case 1:\n case 2:\n case process.stdout.fd:\n case process.stderr.fd:\n return true;\n default:\n return false;\n }\n};\n\nconst fsFsync = (\n fd: number,\n cb: (error?: NodeJS.ErrnoException | null) => void\n) => {\n try {\n fs.fsync(fd, cb);\n } catch (error: any) {\n cb(error);\n }\n};\n","import type net from 'node:net';\n\nimport { ingestIpcSocket } from './ipc';\nimport { LogStream, type EventSink } from './logStream';\n\nconst MAX_SUBSCRIBER_BUFFERED = 4 * 1024 * 1024;\n\ninterface BroadcastSink {\n sink: EventSink;\n dropOnBackpressure: boolean;\n destroy(): void;\n}\n\n// Fallback for Windows named pipes, which expose no fd for LogStream to write to\nclass SocketSink implements EventSink {\n readonly #socket: net.Socket;\n\n constructor(socket: net.Socket) {\n this.#socket = socket;\n // A socket write error without an 'error' listener would crash the host\n socket.on('error', () => {});\n }\n\n get writable() {\n return this.#socket.writable;\n }\n\n get buffered() {\n return this.#socket.writableLength;\n }\n\n _writeln(data: string): boolean {\n return this.#socket.write(data);\n }\n\n end(cb?: () => void): this {\n this.#socket.end(cb);\n return this;\n }\n\n destroy() {\n this.#socket.destroy();\n }\n}\n\nconst createSocketSink = (socket: net.Socket): EventSink => {\n const fd = (socket as any)._handle?.fd;\n if (typeof fd === 'number' && fd >= 0) {\n return new LogStream(\n onOpened =>\n onOpened(null, fd, (data, cb) => {\n socket.write(data, cb);\n }),\n { closeFd: false }\n );\n }\n return new SocketSink(socket);\n};\n\n// Fans every line out to all sinks uniformly; only flush stays pinned to the\n// primary sink so a stalled live socket cannot delay a durability barrier\nexport class BroadcastChannel implements EventSink {\n readonly #primary: EventSink;\n readonly #sinks: BroadcastSink[] = [];\n #destroyed = false;\n\n constructor(primary: EventSink) {\n this.#primary = primary;\n this.#sinks.push({\n sink: primary,\n dropOnBackpressure: false,\n destroy: () => primary.destroy(),\n });\n }\n\n get writable() {\n if (this.#destroyed) return false;\n for (let i = 0; i < this.#sinks.length; i++) {\n if (this.#sinks[i].sink.writable) return true;\n }\n return false;\n }\n\n add(sink: EventSink | null) {\n if (!sink) return;\n if (this.#destroyed) sink.destroy();\n else\n this.#sinks.push({\n sink,\n dropOnBackpressure: false,\n destroy: () => sink.destroy(),\n });\n }\n\n attach(socket: net.Socket) {\n if (this.#destroyed) {\n socket.destroy();\n return;\n }\n socket.unref();\n const sink = createSocketSink(socket);\n const entry = {\n sink,\n dropOnBackpressure: true,\n destroy: () => {\n sink.destroy();\n socket.destroy();\n },\n };\n this.#sinks.push(entry);\n const detach = () => {\n const index = this.#sinks.indexOf(entry);\n if (index > -1) this.#sinks.splice(index, 1);\n entry.destroy();\n };\n socket.on('close', detach);\n socket.on('error', detach);\n }\n\n ingest(socket: net.Socket) {\n ingestIpcSocket(socket, this);\n }\n\n _writeln(line: string): boolean {\n const sinks = this.#sinks;\n let writable = false;\n for (let i = sinks.length - 1; i >= 0; i--) {\n const entry = sinks[i];\n const accepted = entry.sink._writeln(line);\n if (\n !accepted &&\n entry.dropOnBackpressure &&\n (entry.sink.buffered ?? Infinity) > MAX_SUBSCRIBER_BUFFERED\n ) {\n sinks.splice(i, 1);\n entry.destroy();\n }\n writable = accepted || writable;\n }\n return writable;\n }\n\n flush(cb: (error?: Error | null) => void) {\n if (this.#primary.flush) this.#primary.flush(cb);\n else cb();\n }\n\n end(cb?: () => void): this {\n for (const entry of this.#sinks) {\n entry.sink.end(entry.sink === this.#primary ? cb : undefined);\n }\n return this;\n }\n\n destroy() {\n this.#destroyed = true;\n for (const entry of this.#sinks) entry.destroy();\n this.#sinks.length = 0;\n }\n}\n","import { isMainThread, threadId } from 'node:worker_threads';\n\nimport { INTERNAL_PROCESS_ORIGIN_ENV } from '../constants';\n\nconst LOCAL_PROCESS_ORIGIN = Symbol.for('2g/process-origin');\n\ninterface EventLogGlobal {\n [LOCAL_PROCESS_ORIGIN]?: string;\n}\n\nexport interface ProcessOrigin {\n kind: 'worker_thread' | 'event_log_child' | 'child_process';\n id: string;\n}\n\nexport function setLocalProcessOrigin(id: string | undefined) {\n const globalScope = globalThis as EventLogGlobal;\n if (id) globalScope[LOCAL_PROCESS_ORIGIN] = id;\n else delete globalScope[LOCAL_PROCESS_ORIGIN];\n}\n\nexport function getProcessOrigin(): ProcessOrigin | null {\n if (!isMainThread) {\n return { kind: 'worker_thread', id: String(threadId) };\n }\n\n const localOrigin = (globalThis as EventLogGlobal)[LOCAL_PROCESS_ORIGIN];\n const inheritedOrigin = process.env[INTERNAL_PROCESS_ORIGIN_ENV];\n if (inheritedOrigin && inheritedOrigin !== localOrigin) {\n return {\n kind: 'event_log_child',\n id: String(process.pid),\n };\n }\n\n if (process.env.NODE_UNIQUE_ID) {\n return { kind: 'child_process', id: process.env.NODE_UNIQUE_ID };\n }\n\n return null;\n}\n\nexport function getProcessWorkerId() {\n const origin = getProcessOrigin();\n return origin ? `${origin.kind}:${origin.id}` : undefined;\n}\n\nexport function publishProcessOrigin() {\n const origin = String(process.pid);\n process.env[INTERNAL_PROCESS_ORIGIN_ENV] = origin;\n setLocalProcessOrigin(origin);\n return () => {\n if (process.env[INTERNAL_PROCESS_ORIGIN_ENV] === origin)\n delete process.env[INTERNAL_PROCESS_ORIGIN_ENV];\n setLocalProcessOrigin(undefined);\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport net from 'node:net';\n\nimport {\n DEBUG_SEGMENTS,\n DEBUG_SEGMENT_SIZE,\n DEFAULT_SEGMENTS,\n DEFAULT_SEGMENT_SIZE,\n EVENT_LOG_FORMAT_VERSION,\n SESSION_FILES,\n} from './constants';\nimport { cleanStaleSessionsSync, getSessionBaseDir } from './clean';\nimport { createDebugSink } from './debug';\nimport { eventLogState } from './state';\nimport { BroadcastChannel } from './utils/broadcastChannel';\nimport { LogStream, type EventSink } from './utils/logStream';\nimport { listenIpcSink } from './utils/ipc';\nimport { publishProcessOrigin } from './utils/processOrigin';\nimport { registerProcessCleanup } from './utils/processExit';\nimport {\n createSocketAddress,\n listenSocket,\n removeSocket,\n} from './utils/sessionSockets';\n\nexport interface SessionOptions {\n command?: string;\n version?: string;\n maxSegments?: number;\n maxSegmentSize?: number;\n}\n\nexport interface SessionMeta {\n pid: number;\n formatVersion: number;\n startedAt: number;\n command: string;\n cwd: string;\n maxSegments: number;\n version?: string;\n // Relative to meta.json, or a Windows named-pipe name\n socket: string;\n ipcSocket: string;\n origin: {\n argv: string[];\n execPath: string;\n cwd: string;\n ppid?: number;\n env?: {\n npmLifecycleEvent?: string;\n npmExecPath?: string;\n npmPackageName?: string;\n };\n };\n}\n\nexport interface SessionContext {\n sessionDir: string;\n meta: SessionMeta;\n sink: EventSink;\n destroy(): void;\n}\n\nexport function createSession(options: SessionOptions): SessionContext {\n const baseDir = getSessionBaseDir();\n const startedAt = Date.now();\n // The name is collision-free across PID reuse and never parsed by readers\n const sessionId = `${process.pid}-${startedAt.toString(36)}-${Math.random()\n .toString(36)\n .slice(2, 8)\n .padEnd(6, '0')}`;\n const sessionDir = path.join(baseDir, sessionId);\n // An unwritable tmpdir must not crash the host\n try {\n fs.mkdirSync(sessionDir, { recursive: true, mode: 0o700 });\n // A base dir created before permissions were restricted stays 0755\n fs.chmodSync(baseDir, 0o700);\n } catch {}\n\n const maxSegments =\n options.maxSegments ??\n (eventLogState.debug ? DEBUG_SEGMENTS : DEFAULT_SEGMENTS);\n const maxSegmentSize =\n options.maxSegmentSize ??\n (eventLogState.debug ? DEBUG_SEGMENT_SIZE : DEFAULT_SEGMENT_SIZE);\n const liveSocket = createSocketAddress(sessionDir, sessionId, 'live');\n const ipcSocket = createSocketAddress(sessionDir, sessionId, 'ipc');\n\n const fileStream = new LogStream(path.join(sessionDir, '0.jsonl'));\n const sink = new BroadcastChannel(fileStream);\n sink.add(createDebugSink());\n trackSegmentRotation(fileStream, sessionDir, maxSegments, maxSegmentSize);\n\n const liveServer = net.createServer(socket => sink.attach(socket));\n const closeLiveServer = listenSocket(liveServer, liveSocket.path);\n const closeIpcServer = listenIpcSink(sink, ipcSocket.path);\n const restoreProcessOrigin = publishProcessOrigin();\n\n const meta: SessionMeta = {\n pid: process.pid,\n formatVersion: EVENT_LOG_FORMAT_VERSION,\n startedAt,\n command: options.command ?? process.argv.slice(1).join(' '),\n cwd: process.cwd(),\n maxSegments,\n version: options.version,\n socket: liveSocket.name,\n ipcSocket: ipcSocket.name,\n origin: createSessionOrigin(),\n };\n // Without meta.json the session is invisible to tooling; logging still works\n try {\n writeJsonAtomic(path.join(sessionDir, SESSION_FILES.meta), meta);\n } catch {}\n\n let destroyed = false;\n const destroy = () => {\n if (destroyed) return;\n destroyed = true;\n sink.destroy();\n closeLiveServer();\n closeIpcServer();\n restoreProcessOrigin();\n // rmSync can throw EPERM/EBUSY and must not skip the restoration above\n removeSocket(liveSocket.path);\n removeSocket(ipcSocket.path);\n };\n\n registerProcessCleanup(destroy);\n\n // Stale-session cleanup stays off the install hot path\n setImmediate(() => {\n try {\n cleanStaleSessionsSync();\n } catch {}\n });\n\n return { sessionDir, meta, sink, destroy };\n}\n\nfunction trackSegmentRotation(\n stream: LogStream,\n sessionDir: string,\n maxSegments: number,\n maxSegmentSize: number\n) {\n let bytesWritten = 0;\n stream.on('write', written => {\n bytesWritten += written;\n if (bytesWritten < maxSegmentSize) return;\n bytesWritten = 0;\n rotateSegments(sessionDir, maxSegments);\n stream.reopen();\n });\n}\n\nfunction rotateSegments(sessionDir: string, maxSegments: number) {\n fs.rmSync(path.join(sessionDir, `${maxSegments - 1}.jsonl`), { force: true });\n for (let i = maxSegments - 1; i >= 1; i--) {\n const from = path.join(sessionDir, `${i - 1}.jsonl`);\n const to = path.join(sessionDir, `${i}.jsonl`);\n try {\n fs.renameSync(from, to);\n } catch {}\n }\n}\n\nfunction writeJsonAtomic(file: string, data: unknown) {\n const tmp = `${file}.${process.pid}.tmp`;\n fs.writeFileSync(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });\n fs.renameSync(tmp, file);\n}\n\nfunction createSessionOrigin(): SessionMeta['origin'] {\n const env = {\n npmLifecycleEvent: process.env.npm_lifecycle_event,\n npmExecPath: process.env.npm_execpath,\n npmPackageName: process.env.npm_package_name,\n };\n return {\n argv: process.argv.slice(1),\n execPath: process.execPath,\n cwd: process.cwd(),\n ppid: process.ppid || undefined,\n env: Object.values(env).some(Boolean) ? env : undefined,\n };\n}\n","import path from 'node:path';\n\nimport { events } from './events';\nimport {\n EVENT_LOG_FORMAT_VERSION,\n LOG_DEBUG_ENV,\n LOG_EVENTS_ENV,\n} from './constants';\nimport { eventLogState, type EventLoggerInfo } from './state';\nimport { createSession, type SessionOptions } from './session';\nimport {\n LogStream,\n type EventSink,\n type LogStreamOpener,\n type LogStreamOptions,\n} from './utils/logStream';\nimport {\n getParentIpcPath,\n isParentDebugEnabled,\n openIpc,\n publishTempIpcSink,\n} from './utils/ipc';\nimport { getProcessOrigin, getProcessWorkerId } from './utils/processOrigin';\nimport { redirectConsoleForFd } from './utils/redirectConsole';\n\nexport type { EventLoggerInfo } from './state';\n\nexport interface InstallEventLoggerOptions extends SessionOptions {\n session?: boolean;\n debug?: boolean;\n}\n\nconst rootEvent = events('root');\n\nexport function installChildEventLogger(\n options?: InstallEventLoggerOptions\n): boolean {\n if (eventLogState.primarySink) {\n return true;\n }\n\n const workerId = getProcessWorkerId();\n if (workerId) {\n eventLogState.eventMeta = { _w: workerId };\n }\n\n const ipcPath = getParentIpcPath();\n if (ipcPath) {\n eventLogState.debug =\n options?.debug ??\n (isParentDebugEnabled() || !!process.env[LOG_DEBUG_ENV]);\n connectToParent(ipcPath);\n return true;\n } else {\n return false;\n }\n}\n\nexport function installEventLogger(\n targetOrOptions?: string | number | InstallEventLoggerOptions\n): void {\n const options =\n targetOrOptions && typeof targetOrOptions === 'object'\n ? targetOrOptions\n : undefined;\n\n if (installChildEventLogger(options)) {\n return;\n }\n\n const explicitTarget =\n parseLogTarget(process.env[LOG_EVENTS_ENV]) ??\n parseLogTarget(\n typeof targetOrOptions === 'string' || typeof targetOrOptions === 'number'\n ? targetOrOptions\n : undefined\n );\n\n if (explicitTarget != null) {\n if (typeof explicitTarget === 'number')\n redirectConsoleForFd(explicitTarget);\n eventLogState.debug = options?.debug ?? true;\n eventLogState.eventLoggerInfo = getExplicitTargetInfo(explicitTarget);\n const sink = createPrimarySink(explicitTarget);\n publishTempIpcSink(sink);\n activateSink(sink);\n return;\n }\n\n if (options && options.session !== false) {\n eventLogState.debug = options.debug ?? !!process.env[LOG_DEBUG_ENV];\n const session = createSession(options);\n eventLogState.logPath = session.sessionDir;\n eventLogState.eventLoggerInfo = {\n destination: 'session',\n isUserVisibleOutput: false,\n debug: eventLogState.debug,\n sessionDir: session.sessionDir,\n };\n activateSink(session.sink, options.version);\n return;\n }\n}\n\nexport const getEventLoggerInfo = (): EventLoggerInfo | null =>\n eventLogState.primarySink?.writable ? eventLogState.eventLoggerInfo : null;\n\nexport function flushEventLogger(): Promise<void> {\n return new Promise(resolve => {\n const sink = eventLogState.primarySink;\n if (sink?.flush) sink.flush(() => resolve());\n else resolve();\n });\n}\n\nfunction parseLogTarget(target: string | number | undefined) {\n if (typeof target === 'number') {\n return Number.isSafeInteger(target) && target > 0 ? target : undefined;\n }\n\n if (!target) return undefined;\n\n const fd = parseInt(target, 10);\n if (`${fd}` === target && fd > 0 && Number.isSafeInteger(fd)) return fd;\n\n try {\n const parsedPath = path.parse(target);\n const destination = path.format(parsedPath);\n eventLogState.logPath = parsedPath.dir || process.cwd();\n return destination;\n } catch {\n return undefined;\n }\n}\n\nfunction createPrimarySink(\n dest: string | number | LogStreamOpener,\n options?: LogStreamOptions\n) {\n const stream = new LogStream(dest, options);\n // A dead target restores the no-op hot path\n stream.once('error', () => {\n eventLogState.primarySink = undefined;\n eventLogState.eventLoggerInfo = null;\n });\n return stream;\n}\n\nfunction getExplicitTargetInfo(target: string | number): EventLoggerInfo {\n if (typeof target === 'number') {\n return {\n destination: target === 1 ? 'stdout' : target === 2 ? 'stderr' : 'fd',\n isUserVisibleOutput: target === 1 || target === 2,\n debug: eventLogState.debug,\n fd: target,\n };\n }\n\n return {\n destination: 'file',\n isUserVisibleOutput: false,\n debug: eventLogState.debug,\n file: target,\n };\n}\n\nfunction getInitMetadata(version?: string) {\n return {\n format: 'v0-jsonl',\n formatVersion: EVENT_LOG_FORMAT_VERSION,\n version: version ?? 'UNVERSIONED',\n processOrigin: getProcessOrigin() ?? undefined,\n };\n}\n\nfunction activateSink(sink: EventSink, version?: string) {\n eventLogState.primarySink = sink;\n rootEvent('init', getInitMetadata(version));\n}\n\nfunction connectToParent(ipcPath: string) {\n eventLogState.primarySink = createPrimarySink(openIpc(ipcPath), {\n closeFd: false,\n });\n eventLogState.eventLoggerInfo = {\n destination: 'ipc',\n isUserVisibleOutput: false,\n debug: eventLogState.debug,\n };\n rootEvent('init', getInitMetadata());\n}\n","import { installChildEventLogger } from './install';\n\nexport { events } from './events';\n\nexport {\n installEventLogger,\n installChildEventLogger,\n flushEventLogger,\n getEventLoggerInfo,\n type EventLoggerInfo,\n type InstallEventLoggerOptions,\n} from './install';\n\nexport type {\n AllEvents,\n EventByKey,\n EventKeys,\n EventLogger,\n EventRegistry,\n ParsedEvent,\n Serialized,\n SerializedError,\n SpanEnd,\n} from './types';\n\ninstallChildEventLogger();\n"],"names":["STATE_SYMBOL","Symbol","for","EVENT_LOG_STATE_VERSION","eventLogState","getEventLogState","globalScope","globalThis","logPath","process","cwd","eventLoggerInfo","debug","TIME_ORIGIN","performance","timeOrigin","TIMESTAMP_FRACTIONS","Array","from","length","_","us","padStart","cachedMs","cachedMsJson","cachedWorkerId","cachedWorkerIdJson","writeEvent","dest","category","kind","payload","meta","level","_writeln","serializeEvent","duration","timestamp","stringifyTimestamp","_w","rest","JSON","stringify","slice","line","stringifyWorkerId","appendPayload","undefined","writeCompleteEvent","startPayload","endPayload","delta","appendMergedPayload","now","ms","Math","floor","workerId","NOOP_DONE","serializeError","error","depth","Error","String","serialized","name","message","code","stack","cause","createEventLogger","log","event","data","primarySink","eventMeta","span","start","done","path","relativePath","target","toJSON","isAbsolute","relative","replace","events","EVENT_LEVEL_DEBUG","createDebugSink","value","env","LOG_DEBUG_ENV","filter","compileLogDebugFilter","patterns","split","map","pattern","trim","Boolean","compileEventFilter","colorize","shouldColorizeStream","stderr","writable","end","indexOf","parseEventLine","matchesTapOptions","write","formatPrettyEvent","stream","cb","this","destroy","PROCESS_CLEANUP","registerProcessCleanup","callback","cleanup","getProcessCleanupState","callbacks","add","registered","once","runProcessCleanup","signal","listenerCount","kill","pid","Set","listenIpcSink","sink","socketPath","server","net","createServer","socket","ingestIpcSocket","closeServer","listenSocket","restoreIpcPath","publishIpcPath","INTERNAL_IPC_ENV","isDebug","INTERNAL_DEBUG_ENV","LOG_EVENTS_ENV","publishTempIpcSink","createTempIpcPath","Date","toString","rand","random","id","platform","join","os","tmpdir","closeIpc","cleanedUp","removeSocket","bind","openIpc","options","retryMs","maxRetryMs","onOpened","startedAt","attempt","connect","opened","fd","_handle","unref","drain","ref","retry","setTimeout","pending","setEncoding","on","chunk","lastIndexOf","LogStream","EventEmitter","file","oldFd","closeFd","writing","ending","closing","flushPending","destroyed","opening","reopening","output","len","lines","head","partialLine","busyRetries","draining","scheduled","onRelease","#onRelease","err","written","release","onDrained","fail","Buffer","byteLength","onScheduledWrite","#onScheduledWrite","writeLine","constructor","super","fs","fsyncSync","nextTick","emit","openFile","open","buffered","reopen","retryLine","setImmediate","min","close","mkdir","dirname","recursive","fchmod","isStdFd","fsFsync","onClose","scheduleWrite","_end","arg1","arg2","arg3","maybeCb","input","flush","onDrain","off","onError","push","_write","charCodeAt","startIdx","endIdx","encoding","dispose","stdout","fsync","SocketSink","writableLength","BroadcastChannel","primary","sinks","dropOnBackpressure","i","attach","createSocketSink","entry","detach","index","splice","ingest","accepted","Infinity","LOCAL_PROCESS_ORIGIN","setLocalProcessOrigin","getProcessOrigin","isMainThread","threadId","localOrigin","inheritedOrigin","INTERNAL_PROCESS_ORIGIN_ENV","NODE_UNIQUE_ID","createSession","baseDir","getSessionBaseDir","sessionId","padEnd","sessionDir","mkdirSync","mode","chmodSync","maxSegments","DEBUG_SEGMENTS","DEFAULT_SEGMENTS","maxSegmentSize","DEBUG_SEGMENT_SIZE","DEFAULT_SEGMENT_SIZE","liveSocket","createSocketAddress","ipcSocket","fileStream","trackSegmentRotation","bytesWritten","rotateSegments","rmSync","force","to","renameSync","liveServer","closeLiveServer","closeIpcServer","restoreProcessOrigin","publishProcessOrigin","origin","formatVersion","EVENT_LOG_FORMAT_VERSION","command","argv","version","createSessionOrigin","writeJsonAtomic","tmp","writeFileSync","SESSION_FILES","cleanStaleSessionsSync","npmLifecycleEvent","npm_lifecycle_event","npmExecPath","npm_execpath","npmPackageName","npm_package_name","execPath","ppid","Object","values","some","rootEvent","installChildEventLogger","getProcessWorkerId","ipcPath","getParentIpcPath","isParentDebugEnabled","connectToParent","createPrimarySink","destination","isUserVisibleOutput","getInitMetadata","installEventLogger","targetOrOptions","explicitTarget","parseLogTarget","redirectConsoleForFd","getExplicitTargetInfo","activateSink","session","getEventLoggerInfo","flushEventLogger","Promise","resolve","Number","isSafeInteger","parseInt","parsedPath","parse","format","dir","processOrigin"],"mappings":"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"}
|
package/dist/chunks/api-chunk.js
CHANGED
|
@@ -175,13 +175,17 @@ class EventCapture {
|
|
|
175
175
|
}
|
|
176
176
|
this.#n = t.length;
|
|
177
177
|
t.push("pipe");
|
|
178
|
+
const n = {
|
|
179
|
+
...e?.env ?? process.env,
|
|
180
|
+
[o.LOG_EVENTS_ENV]: `${this.#n}`
|
|
181
|
+
};
|
|
182
|
+
if (!0 === this.#e.debug) {
|
|
183
|
+
n[o.INTERNAL_DEBUG_ENV] = "1";
|
|
184
|
+
}
|
|
178
185
|
return {
|
|
179
186
|
...e,
|
|
180
187
|
stdio: t,
|
|
181
|
-
env:
|
|
182
|
-
...e?.env ?? process.env,
|
|
183
|
-
[o.LOG_EVENTS_ENV]: `${this.#n}`
|
|
184
|
-
}
|
|
188
|
+
env: n
|
|
185
189
|
};
|
|
186
190
|
}
|
|
187
191
|
attach(e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-chunk.js","sources":["../../src/tap.ts","../../src/capture.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport net from 'node:net';\nimport { createInterface } from 'node:readline';\n\nimport { DEFAULT_SEGMENTS, SESSION_FILES } from './constants';\nimport {\n cleanStaleSessionsSync,\n getSessionBaseDir,\n isPidAlive,\n newestSessionIds,\n readMetaSync,\n} from './clean';\nimport { type SessionMeta } from './session';\nimport type { ParsedEvent } from './types';\nimport {\n compileEventFilter,\n parseEventLine,\n parseSince,\n type EventFilterOptions,\n} from './utils/eventFilter';\nimport { resolveSocketPath } from './utils/sessionSockets';\n\nexport interface ListedSession {\n id: string;\n pid: number;\n formatVersion: number;\n alive: boolean;\n startedAt: number;\n command: string;\n cwd: string;\n version?: string;\n origin?: SessionMeta['origin'];\n sessionDir: string;\n}\n\nexport interface ListSessionsOptions {\n selector?: string;\n}\n\nexport interface TapOptions extends EventFilterOptions {\n follow?: boolean;\n signal?: AbortSignal;\n timeout?: number;\n idleTimeout?: number;\n}\n\nexport async function listSessions(\n options: ListSessionsOptions = {}\n): Promise<ListedSession[]> {\n cleanStaleSessionsSync();\n const baseDir = getSessionBaseDir();\n const entries = await fs\n .readdir(baseDir, { withFileTypes: true })\n .catch(() => []);\n const sessions: ListedSession[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const sessionDir = path.join(baseDir, entry.name);\n const meta = readMetaSync(sessionDir);\n if (!meta) continue;\n sessions.push({\n id: entry.name,\n pid: meta.pid,\n formatVersion: meta.formatVersion,\n alive: false,\n startedAt: meta.startedAt,\n command: meta.command,\n cwd: meta.cwd,\n version: meta.version,\n origin: meta.origin,\n sessionDir,\n });\n }\n\n const newest = newestSessionIds(sessions);\n for (const session of sessions) {\n session.alive = isPidAlive(session.pid) && newest.has(session.id);\n }\n\n return filterSessions(sessions, options.selector).sort(\n (a, b) => b.startedAt - a.startedAt\n );\n}\n\nexport async function resolveSession(selector?: string) {\n const sessions = await listSessions({ selector });\n const activeSessions = sessions.filter(session => session.alive);\n const session =\n sessions.length === 1\n ? sessions[0]\n : activeSessions.length === 1\n ? activeSessions[0]\n : null;\n if (!session)\n throw new Error(\n selector != null\n ? sessions.length\n ? `Ambiguous 2g session \"${selector}\"; specify one of: ${sessions\n .map(formatSessionSelector)\n .join(', ')}`\n : `No 2g session matching \"${selector}\"`\n : sessions.length\n ? `Ambiguous 2g session; specify one of: ${sessions\n .map(formatSessionSelector)\n .join(', ')}`\n : 'No 2g sessions found'\n );\n return session;\n}\n\nexport async function* tap(\n sessionDir: string,\n options: TapOptions = {}\n): AsyncIterable<ParsedEvent> {\n const follow = options.follow === true;\n const since = parseSince(options.since);\n const eventFilter = compileEventFilter(options.filter);\n const abort = createTapAbortController(options, follow);\n const signal = abort?.signal ?? options.signal;\n const meta = readMetaSync(sessionDir);\n const live = follow ? await connectLive(sessionDir, meta, signal) : undefined;\n const history = await openHistoryFiles(sessionDir, meta);\n let idleTimer: NodeJS.Timeout | undefined;\n\n try {\n for (const handle of history) {\n for await (const line of readLines(handle)) {\n const event = parseEventLine(line, options, eventFilter, since);\n if (event) yield event;\n }\n }\n } finally {\n await Promise.all(history.map(handle => handle.close().catch(() => {})));\n }\n\n if (!live) return;\n if (options.idleTimeout != null && abort) {\n idleTimer = setAbortTimer(abort, options.idleTimeout);\n }\n\n for (const line of live.buffer.splice(0)) {\n const event = parseEventLine(line, options, eventFilter, since);\n if (event) {\n if (idleTimer)\n idleTimer = resetAbortTimer(idleTimer, abort!, options.idleTimeout!);\n yield event;\n }\n }\n\n while (!signal?.aborted) {\n const line = await readLiveLine(live, signal);\n if (line == null) break;\n if (idleTimer)\n idleTimer = resetAbortTimer(idleTimer, abort!, options.idleTimeout!);\n const event = parseEventLine(line, options, eventFilter, since);\n if (event) yield event;\n }\n\n if (idleTimer) clearTimeout(idleTimer);\n}\n\n// Rotation discards the oldest segment once the ring fills, so a retained\n// window whose oldest event is not the session's start has lost earlier events.\nexport async function detectRotationLoss(sessionDir: string): Promise<boolean> {\n const meta = readMetaSync(sessionDir);\n const maxSegments = meta?.maxSegments ?? DEFAULT_SEGMENTS;\n // The oldest retained segment is the highest-numbered file still present\n for (let index = maxSegments - 1; index >= 0; index--) {\n const handle = await fs\n .open(path.join(sessionDir, `${index}.jsonl`), 'r')\n .catch(() => null);\n if (!handle) continue;\n try {\n const first = await readFirstLine(handle);\n // An empty window has lost nothing; otherwise loss iff it skips the start\n return first != null && !isSessionStartLine(first);\n } finally {\n await handle.close().catch(() => {});\n }\n }\n return false;\n}\n\nasync function readFirstLine(handle: fs.FileHandle) {\n for await (const line of readLines(handle)) return line;\n return null;\n}\n\nfunction isSessionStartLine(line: string) {\n // Every session opens with a root:init event (see installEventLogger)\n return line.startsWith('{\"_e\":\"root:init\"');\n}\n\nasync function openHistoryFiles(sessionDir: string, meta: SessionMeta | null) {\n const maxSegments = meta?.maxSegments ?? DEFAULT_SEGMENTS;\n const handles = await Promise.all(\n Array.from({ length: maxSegments }, (_, index) =>\n fs.open(path.join(sessionDir, `${index}.jsonl`), 'r').catch(() => null)\n )\n );\n return handles.filter(handle => handle != null).reverse();\n}\n\nasync function* readLines(handle: fs.FileHandle) {\n let pending = '';\n for await (const chunk of handle.createReadStream({ encoding: 'utf8' })) {\n pending += chunk;\n let index = -1;\n while ((index = pending.indexOf('\\n')) >= 0) {\n const line = pending.slice(0, index);\n pending = pending.slice(index + 1);\n if (line) yield line;\n }\n }\n if (pending) yield pending;\n}\n\nfunction filterSessions(\n sessions: ListedSession[],\n selector: string | undefined\n) {\n const input = selector?.trim();\n if (!input) return sessions;\n\n const exact = sessions.filter(session =>\n matchesSessionExactly(session, input)\n );\n if (exact.length) return exact;\n\n const normalized = input.toLowerCase();\n return sessions.filter(session =>\n sessionSearchValues(session).some(value =>\n value.toLowerCase().includes(normalized)\n )\n );\n}\n\nfunction formatSessionSelector(session: ListedSession) {\n return `${session.pid} (${session.command})`;\n}\n\nasync function connectLive(\n sessionDir: string,\n meta: SessionMeta | null,\n signal?: AbortSignal\n) {\n const socketPath = resolveSocketPath(\n sessionDir,\n meta?.socket ?? SESSION_FILES.liveSocket\n );\n const socket = await connectWithRetry(socketPath, signal);\n if (!socket) return undefined;\n const rl = createInterface({ input: socket });\n const buffer: string[] = [];\n const waiters: Array<(line: string | null) => void> = [];\n let closed = false;\n\n const push = (line: string | null) => {\n const waiter = waiters.shift();\n if (waiter) waiter(line);\n else if (line != null) buffer.push(line);\n };\n\n rl.on('line', line => push(line));\n rl.on('close', () => {\n closed = true;\n push(null);\n });\n socket.on('error', () => {\n closed = true;\n push(null);\n });\n signal?.addEventListener('abort', () => socket.destroy(), { once: true });\n\n return {\n buffer,\n next() {\n if (buffer.length) return Promise.resolve(buffer.shift()!);\n if (closed) return Promise.resolve(null);\n return new Promise<string | null>(resolve => waiters.push(resolve));\n },\n };\n}\n\nfunction readLiveLine(\n live: { next(): Promise<string | null> },\n signal?: AbortSignal\n) {\n if (!signal) return live.next();\n if (signal.aborted) return Promise.resolve(null);\n\n return new Promise<string | null>(resolve => {\n const onAbort = () => resolve(null);\n signal.addEventListener('abort', onAbort, { once: true });\n live.next().then(line => {\n signal.removeEventListener('abort', onAbort);\n resolve(signal.aborted ? null : line);\n });\n });\n}\n\nfunction createTapAbortController(options: TapOptions, follow: boolean) {\n if (!follow || (options.timeout == null && options.idleTimeout == null))\n return undefined;\n\n const abort = new AbortController();\n options.signal?.addEventListener('abort', () => abort.abort(), {\n once: true,\n });\n if (options.timeout != null) setAbortTimer(abort, options.timeout);\n return abort;\n}\n\nfunction resetAbortTimer(\n timer: NodeJS.Timeout,\n abort: AbortController,\n timeout: number\n) {\n clearTimeout(timer);\n return setAbortTimer(abort, timeout);\n}\n\nfunction setAbortTimer(abort: AbortController, timeout: number) {\n const timer = setTimeout(() => abort.abort(), timeout);\n timer.unref?.();\n return timer;\n}\n\nfunction matchesSessionExactly(session: ListedSession, selector: string) {\n return sessionSearchValues(session).some(value => value === selector);\n}\n\nfunction sessionSearchValues(session: ListedSession) {\n return [\n session.id,\n String(session.pid),\n session.sessionDir,\n session.cwd,\n session.command,\n session.origin?.cwd,\n session.origin?.argv.join(' '),\n session.origin?.execPath,\n session.origin?.env?.npmLifecycleEvent,\n session.origin?.env?.npmPackageName,\n ].filter((value): value is string => !!value);\n}\n\nasync function connectWithRetry(socketPath: string, signal?: AbortSignal) {\n for (let attempt = 0; attempt < 20 && !signal?.aborted; attempt++) {\n const socket = await tryConnect(socketPath, signal);\n if (socket) return socket;\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n return null;\n}\n\nfunction tryConnect(socketPath: string, signal?: AbortSignal) {\n return new Promise<net.Socket | null>(resolve => {\n const socket = net.connect(socketPath);\n const cleanup = () => {\n socket.off('connect', onConnect);\n socket.off('error', onError);\n signal?.removeEventListener('abort', onAbort);\n };\n const onConnect = () => {\n cleanup();\n resolve(socket);\n };\n const onError = () => {\n cleanup();\n socket.destroy();\n resolve(null);\n };\n const onAbort = () => {\n cleanup();\n socket.destroy();\n resolve(null);\n };\n socket.once('connect', onConnect);\n socket.once('error', onError);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","import type { ChildProcess, StdioOptions } from 'node:child_process';\nimport type { Readable } from 'node:stream';\n\nimport { LOG_EVENTS_ENV } from './constants';\nimport type { TapOptions } from './tap';\nimport type { ParsedEvent } from './types';\nimport { compileEventFilter, parseEventLine } from './utils/eventFilter';\n\nexport type CaptureOptions = Pick<TapOptions, 'debug' | 'filter'>;\n\nexport interface CaptureSpawnOptions {\n env?: NodeJS.ProcessEnv;\n stdio?: StdioOptions;\n}\n\nexport class EventCapture implements AsyncIterable<ParsedEvent> {\n #options: CaptureOptions;\n #eventFilter: RegExp | null;\n #index: number | undefined;\n #attached = false;\n #done = false;\n #events: ParsedEvent[] = [];\n #waiters: Array<(event: ParsedEvent | null) => void> = [];\n\n constructor(options: CaptureOptions = {}) {\n this.#options = options;\n this.#eventFilter = compileEventFilter(options.filter);\n }\n\n spawnOptions<T extends CaptureSpawnOptions>(\n options?: T\n ): T & Required<CaptureSpawnOptions> {\n const stdio: Extract<StdioOptions, readonly unknown[]> = Array.isArray(\n options?.stdio\n )\n ? [...options.stdio]\n : options?.stdio != null\n ? [options.stdio, options.stdio, options.stdio]\n : [];\n while (stdio.length < 3) stdio.push('inherit');\n this.#index = stdio.length;\n stdio.push('pipe');\n return {\n ...(options as T),\n stdio,\n env: {\n ...(options?.env ?? process.env),\n [LOG_EVENTS_ENV]: `${this.#index}`,\n },\n };\n }\n\n attach(child: ChildProcess): this {\n if (this.#index == null)\n throw new Error(\n 'captureEvents: spawnOptions() must create the pipe before attach()'\n );\n if (this.#attached)\n throw new Error('captureEvents: a child is already attached');\n const stream = child.stdio[this.#index] as Readable | null | undefined;\n if (!stream || typeof stream.setEncoding !== 'function')\n throw new Error(\n `captureEvents: child stdio[${this.#index}] is not a readable pipe`\n );\n this.#attached = true;\n\n let pending = '';\n stream.setEncoding('utf8');\n stream.on('data', (chunk: string) => {\n const data = pending ? pending + chunk : chunk;\n let start = 0;\n let end: number;\n while ((end = data.indexOf('\\n', start)) !== -1) {\n const line = data.slice(start, end);\n start = end + 1;\n if (line) this.#ingest(line);\n }\n pending = start ? data.slice(start) : data;\n });\n\n const finish = () => {\n if (this.#done) return;\n this.#done = true;\n if (pending) this.#ingest(pending);\n this.#notify(null);\n };\n stream.on('end', finish);\n stream.on('close', finish);\n stream.on('error', finish);\n return this;\n }\n\n async collect(): Promise<ParsedEvent[]> {\n const events: ParsedEvent[] = [];\n for await (const event of this) events.push(event);\n return events;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<ParsedEvent> {\n let event: ParsedEvent | null;\n while ((event = await this.#next())) yield event;\n }\n\n #ingest(line: string) {\n const event = parseEventLine(line, this.#options, this.#eventFilter);\n if (event) this.#notify(event);\n }\n\n #notify(event: ParsedEvent | null) {\n const waiter = this.#waiters.shift();\n if (waiter) waiter(event);\n else if (event) this.#events.push(event);\n }\n\n #next(): Promise<ParsedEvent | null> {\n if (this.#events.length) return Promise.resolve(this.#events.shift()!);\n if (this.#done) return Promise.resolve(null);\n if (!this.#attached)\n throw new Error('captureEvents: attach() a child before iterating');\n return new Promise(resolve => this.#waiters.push(resolve));\n }\n}\n\nexport function captureEvents(options?: CaptureOptions): EventCapture {\n return new EventCapture(options);\n}\n"],"names":["async","listSessions","options","cleanStaleSessionsSync","baseDir","getSessionBaseDir","entries","fs","readdir","withFileTypes","catch","sessions","entry","isDirectory","sessionDir","path","join","name","meta","readMetaSync","push","id","pid","formatVersion","alive","startedAt","command","cwd","version","origin","newest","newestSessionIds","session","isPidAlive","has","filterSessions","selector","input","trim","exact","filter","matchesSessionExactly","sessionSearchValues","some","value","length","normalized","toLowerCase","includes","sort","a","b","readFirstLine","handle","line","readLines","isSessionStartLine","startsWith","pending","chunk","createReadStream","encoding","index","indexOf","slice","formatSessionSelector","readLiveLine","live","signal","next","aborted","Promise","resolve","onAbort","addEventListener","once","then","removeEventListener","resetAbortTimer","timer","abort","timeout","clearTimeout","setAbortTimer","setTimeout","unref","String","argv","execPath","env","npmLifecycleEvent","npmPackageName","tryConnect","socketPath","socket","net","connect","cleanup","off","onConnect","onError","destroy","EventCapture","eventFilter","attached","done","events","waiters","constructor","this","compileEventFilter","spawnOptions","stdio","Array","isArray","process","LOG_EVENTS_ENV","attach","child","Error","stream","setEncoding","on","data","start","end","ingest","finish","notify","collect","event","Symbol","asyncIterator","parseEventLine","waiter","shift","captureEvents","detectRotationLoss","maxSegments","DEFAULT_SEGMENTS","open","first","close","resolveSession","activeSessions","map","tap","follow","since","parseSince","createTapAbortController","idleTimeout","AbortController","connectLive","resolveSocketPath","SESSION_FILES","liveSocket","connectWithRetry","attempt","rl","createInterface","buffer","closed","undefined","history","openHistoryFiles","handles","all","from","_","reverse","idleTimer","splice"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-chunk.js","sources":["../../src/tap.ts","../../src/capture.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport net from 'node:net';\nimport { createInterface } from 'node:readline';\n\nimport { DEFAULT_SEGMENTS, SESSION_FILES } from './constants';\nimport {\n cleanStaleSessionsSync,\n getSessionBaseDir,\n isPidAlive,\n newestSessionIds,\n readMetaSync,\n} from './clean';\nimport { type SessionMeta } from './session';\nimport type { ParsedEvent } from './types';\nimport {\n compileEventFilter,\n parseEventLine,\n parseSince,\n type EventFilterOptions,\n} from './utils/eventFilter';\nimport { resolveSocketPath } from './utils/sessionSockets';\n\nexport interface ListedSession {\n id: string;\n pid: number;\n formatVersion: number;\n alive: boolean;\n startedAt: number;\n command: string;\n cwd: string;\n version?: string;\n origin?: SessionMeta['origin'];\n sessionDir: string;\n}\n\nexport interface ListSessionsOptions {\n selector?: string;\n}\n\nexport interface TapOptions extends EventFilterOptions {\n follow?: boolean;\n signal?: AbortSignal;\n timeout?: number;\n idleTimeout?: number;\n}\n\nexport async function listSessions(\n options: ListSessionsOptions = {}\n): Promise<ListedSession[]> {\n cleanStaleSessionsSync();\n const baseDir = getSessionBaseDir();\n const entries = await fs\n .readdir(baseDir, { withFileTypes: true })\n .catch(() => []);\n const sessions: ListedSession[] = [];\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const sessionDir = path.join(baseDir, entry.name);\n const meta = readMetaSync(sessionDir);\n if (!meta) continue;\n sessions.push({\n id: entry.name,\n pid: meta.pid,\n formatVersion: meta.formatVersion,\n alive: false,\n startedAt: meta.startedAt,\n command: meta.command,\n cwd: meta.cwd,\n version: meta.version,\n origin: meta.origin,\n sessionDir,\n });\n }\n\n const newest = newestSessionIds(sessions);\n for (const session of sessions) {\n session.alive = isPidAlive(session.pid) && newest.has(session.id);\n }\n\n return filterSessions(sessions, options.selector).sort(\n (a, b) => b.startedAt - a.startedAt\n );\n}\n\nexport async function resolveSession(selector?: string) {\n const sessions = await listSessions({ selector });\n const activeSessions = sessions.filter(session => session.alive);\n const session =\n sessions.length === 1\n ? sessions[0]\n : activeSessions.length === 1\n ? activeSessions[0]\n : null;\n if (!session)\n throw new Error(\n selector != null\n ? sessions.length\n ? `Ambiguous 2g session \"${selector}\"; specify one of: ${sessions\n .map(formatSessionSelector)\n .join(', ')}`\n : `No 2g session matching \"${selector}\"`\n : sessions.length\n ? `Ambiguous 2g session; specify one of: ${sessions\n .map(formatSessionSelector)\n .join(', ')}`\n : 'No 2g sessions found'\n );\n return session;\n}\n\nexport async function* tap(\n sessionDir: string,\n options: TapOptions = {}\n): AsyncIterable<ParsedEvent> {\n const follow = options.follow === true;\n const since = parseSince(options.since);\n const eventFilter = compileEventFilter(options.filter);\n const abort = createTapAbortController(options, follow);\n const signal = abort?.signal ?? options.signal;\n const meta = readMetaSync(sessionDir);\n const live = follow ? await connectLive(sessionDir, meta, signal) : undefined;\n const history = await openHistoryFiles(sessionDir, meta);\n let idleTimer: NodeJS.Timeout | undefined;\n\n try {\n for (const handle of history) {\n for await (const line of readLines(handle)) {\n const event = parseEventLine(line, options, eventFilter, since);\n if (event) yield event;\n }\n }\n } finally {\n await Promise.all(history.map(handle => handle.close().catch(() => {})));\n }\n\n if (!live) return;\n if (options.idleTimeout != null && abort) {\n idleTimer = setAbortTimer(abort, options.idleTimeout);\n }\n\n for (const line of live.buffer.splice(0)) {\n const event = parseEventLine(line, options, eventFilter, since);\n if (event) {\n if (idleTimer)\n idleTimer = resetAbortTimer(idleTimer, abort!, options.idleTimeout!);\n yield event;\n }\n }\n\n while (!signal?.aborted) {\n const line = await readLiveLine(live, signal);\n if (line == null) break;\n if (idleTimer)\n idleTimer = resetAbortTimer(idleTimer, abort!, options.idleTimeout!);\n const event = parseEventLine(line, options, eventFilter, since);\n if (event) yield event;\n }\n\n if (idleTimer) clearTimeout(idleTimer);\n}\n\n// Rotation discards the oldest segment once the ring fills, so a retained\n// window whose oldest event is not the session's start has lost earlier events.\nexport async function detectRotationLoss(sessionDir: string): Promise<boolean> {\n const meta = readMetaSync(sessionDir);\n const maxSegments = meta?.maxSegments ?? DEFAULT_SEGMENTS;\n // The oldest retained segment is the highest-numbered file still present\n for (let index = maxSegments - 1; index >= 0; index--) {\n const handle = await fs\n .open(path.join(sessionDir, `${index}.jsonl`), 'r')\n .catch(() => null);\n if (!handle) continue;\n try {\n const first = await readFirstLine(handle);\n // An empty window has lost nothing; otherwise loss iff it skips the start\n return first != null && !isSessionStartLine(first);\n } finally {\n await handle.close().catch(() => {});\n }\n }\n return false;\n}\n\nasync function readFirstLine(handle: fs.FileHandle) {\n for await (const line of readLines(handle)) return line;\n return null;\n}\n\nfunction isSessionStartLine(line: string) {\n // Every session opens with a root:init event (see installEventLogger)\n return line.startsWith('{\"_e\":\"root:init\"');\n}\n\nasync function openHistoryFiles(sessionDir: string, meta: SessionMeta | null) {\n const maxSegments = meta?.maxSegments ?? DEFAULT_SEGMENTS;\n const handles = await Promise.all(\n Array.from({ length: maxSegments }, (_, index) =>\n fs.open(path.join(sessionDir, `${index}.jsonl`), 'r').catch(() => null)\n )\n );\n return handles.filter(handle => handle != null).reverse();\n}\n\nasync function* readLines(handle: fs.FileHandle) {\n let pending = '';\n for await (const chunk of handle.createReadStream({ encoding: 'utf8' })) {\n pending += chunk;\n let index = -1;\n while ((index = pending.indexOf('\\n')) >= 0) {\n const line = pending.slice(0, index);\n pending = pending.slice(index + 1);\n if (line) yield line;\n }\n }\n if (pending) yield pending;\n}\n\nfunction filterSessions(\n sessions: ListedSession[],\n selector: string | undefined\n) {\n const input = selector?.trim();\n if (!input) return sessions;\n\n const exact = sessions.filter(session =>\n matchesSessionExactly(session, input)\n );\n if (exact.length) return exact;\n\n const normalized = input.toLowerCase();\n return sessions.filter(session =>\n sessionSearchValues(session).some(value =>\n value.toLowerCase().includes(normalized)\n )\n );\n}\n\nfunction formatSessionSelector(session: ListedSession) {\n return `${session.pid} (${session.command})`;\n}\n\nasync function connectLive(\n sessionDir: string,\n meta: SessionMeta | null,\n signal?: AbortSignal\n) {\n const socketPath = resolveSocketPath(\n sessionDir,\n meta?.socket ?? SESSION_FILES.liveSocket\n );\n const socket = await connectWithRetry(socketPath, signal);\n if (!socket) return undefined;\n const rl = createInterface({ input: socket });\n const buffer: string[] = [];\n const waiters: Array<(line: string | null) => void> = [];\n let closed = false;\n\n const push = (line: string | null) => {\n const waiter = waiters.shift();\n if (waiter) waiter(line);\n else if (line != null) buffer.push(line);\n };\n\n rl.on('line', line => push(line));\n rl.on('close', () => {\n closed = true;\n push(null);\n });\n socket.on('error', () => {\n closed = true;\n push(null);\n });\n signal?.addEventListener('abort', () => socket.destroy(), { once: true });\n\n return {\n buffer,\n next() {\n if (buffer.length) return Promise.resolve(buffer.shift()!);\n if (closed) return Promise.resolve(null);\n return new Promise<string | null>(resolve => waiters.push(resolve));\n },\n };\n}\n\nfunction readLiveLine(\n live: { next(): Promise<string | null> },\n signal?: AbortSignal\n) {\n if (!signal) return live.next();\n if (signal.aborted) return Promise.resolve(null);\n\n return new Promise<string | null>(resolve => {\n const onAbort = () => resolve(null);\n signal.addEventListener('abort', onAbort, { once: true });\n live.next().then(line => {\n signal.removeEventListener('abort', onAbort);\n resolve(signal.aborted ? null : line);\n });\n });\n}\n\nfunction createTapAbortController(options: TapOptions, follow: boolean) {\n if (!follow || (options.timeout == null && options.idleTimeout == null))\n return undefined;\n\n const abort = new AbortController();\n options.signal?.addEventListener('abort', () => abort.abort(), {\n once: true,\n });\n if (options.timeout != null) setAbortTimer(abort, options.timeout);\n return abort;\n}\n\nfunction resetAbortTimer(\n timer: NodeJS.Timeout,\n abort: AbortController,\n timeout: number\n) {\n clearTimeout(timer);\n return setAbortTimer(abort, timeout);\n}\n\nfunction setAbortTimer(abort: AbortController, timeout: number) {\n const timer = setTimeout(() => abort.abort(), timeout);\n timer.unref?.();\n return timer;\n}\n\nfunction matchesSessionExactly(session: ListedSession, selector: string) {\n return sessionSearchValues(session).some(value => value === selector);\n}\n\nfunction sessionSearchValues(session: ListedSession) {\n return [\n session.id,\n String(session.pid),\n session.sessionDir,\n session.cwd,\n session.command,\n session.origin?.cwd,\n session.origin?.argv.join(' '),\n session.origin?.execPath,\n session.origin?.env?.npmLifecycleEvent,\n session.origin?.env?.npmPackageName,\n ].filter((value): value is string => !!value);\n}\n\nasync function connectWithRetry(socketPath: string, signal?: AbortSignal) {\n for (let attempt = 0; attempt < 20 && !signal?.aborted; attempt++) {\n const socket = await tryConnect(socketPath, signal);\n if (socket) return socket;\n await new Promise(resolve => setTimeout(resolve, 50));\n }\n return null;\n}\n\nfunction tryConnect(socketPath: string, signal?: AbortSignal) {\n return new Promise<net.Socket | null>(resolve => {\n const socket = net.connect(socketPath);\n const cleanup = () => {\n socket.off('connect', onConnect);\n socket.off('error', onError);\n signal?.removeEventListener('abort', onAbort);\n };\n const onConnect = () => {\n cleanup();\n resolve(socket);\n };\n const onError = () => {\n cleanup();\n socket.destroy();\n resolve(null);\n };\n const onAbort = () => {\n cleanup();\n socket.destroy();\n resolve(null);\n };\n socket.once('connect', onConnect);\n socket.once('error', onError);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","import type { ChildProcess, StdioOptions } from 'node:child_process';\nimport type { Readable } from 'node:stream';\n\nimport { INTERNAL_DEBUG_ENV, LOG_EVENTS_ENV } from './constants';\nimport type { TapOptions } from './tap';\nimport type { ParsedEvent } from './types';\nimport { compileEventFilter, parseEventLine } from './utils/eventFilter';\n\nexport type CaptureOptions = Pick<TapOptions, 'debug' | 'filter'>;\n\nexport interface CaptureSpawnOptions {\n env?: NodeJS.ProcessEnv;\n stdio?: StdioOptions;\n}\n\nexport class EventCapture implements AsyncIterable<ParsedEvent> {\n #options: CaptureOptions;\n #eventFilter: RegExp | null;\n #index: number | undefined;\n #attached = false;\n #done = false;\n #events: ParsedEvent[] = [];\n #waiters: Array<(event: ParsedEvent | null) => void> = [];\n\n constructor(options: CaptureOptions = {}) {\n this.#options = options;\n this.#eventFilter = compileEventFilter(options.filter);\n }\n\n spawnOptions<T extends CaptureSpawnOptions>(\n options?: T\n ): T & Required<CaptureSpawnOptions> {\n const stdio: Extract<StdioOptions, readonly unknown[]> = Array.isArray(\n options?.stdio\n )\n ? [...options.stdio]\n : options?.stdio != null\n ? [options.stdio, options.stdio, options.stdio]\n : [];\n while (stdio.length < 3) stdio.push('inherit');\n this.#index = stdio.length;\n stdio.push('pipe');\n const env = {\n ...(options?.env ?? process.env),\n [LOG_EVENTS_ENV]: `${this.#index}`,\n };\n if (this.#options.debug === true) {\n env[INTERNAL_DEBUG_ENV] = '1';\n }\n\n return {\n ...(options as T),\n stdio,\n env,\n };\n }\n\n attach(child: ChildProcess): this {\n if (this.#index == null)\n throw new Error(\n 'captureEvents: spawnOptions() must create the pipe before attach()'\n );\n if (this.#attached)\n throw new Error('captureEvents: a child is already attached');\n const stream = child.stdio[this.#index] as Readable | null | undefined;\n if (!stream || typeof stream.setEncoding !== 'function')\n throw new Error(\n `captureEvents: child stdio[${this.#index}] is not a readable pipe`\n );\n this.#attached = true;\n\n let pending = '';\n stream.setEncoding('utf8');\n stream.on('data', (chunk: string) => {\n const data = pending ? pending + chunk : chunk;\n let start = 0;\n let end: number;\n while ((end = data.indexOf('\\n', start)) !== -1) {\n const line = data.slice(start, end);\n start = end + 1;\n if (line) this.#ingest(line);\n }\n pending = start ? data.slice(start) : data;\n });\n\n const finish = () => {\n if (this.#done) return;\n this.#done = true;\n if (pending) this.#ingest(pending);\n this.#notify(null);\n };\n stream.on('end', finish);\n stream.on('close', finish);\n stream.on('error', finish);\n return this;\n }\n\n async collect(): Promise<ParsedEvent[]> {\n const events: ParsedEvent[] = [];\n for await (const event of this) events.push(event);\n return events;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<ParsedEvent> {\n let event: ParsedEvent | null;\n while ((event = await this.#next())) yield event;\n }\n\n #ingest(line: string) {\n const event = parseEventLine(line, this.#options, this.#eventFilter);\n if (event) this.#notify(event);\n }\n\n #notify(event: ParsedEvent | null) {\n const waiter = this.#waiters.shift();\n if (waiter) waiter(event);\n else if (event) this.#events.push(event);\n }\n\n #next(): Promise<ParsedEvent | null> {\n if (this.#events.length) return Promise.resolve(this.#events.shift()!);\n if (this.#done) return Promise.resolve(null);\n if (!this.#attached)\n throw new Error('captureEvents: attach() a child before iterating');\n return new Promise(resolve => this.#waiters.push(resolve));\n }\n}\n\nexport function captureEvents(options?: CaptureOptions): EventCapture {\n return new EventCapture(options);\n}\n"],"names":["async","listSessions","options","cleanStaleSessionsSync","baseDir","getSessionBaseDir","entries","fs","readdir","withFileTypes","catch","sessions","entry","isDirectory","sessionDir","path","join","name","meta","readMetaSync","push","id","pid","formatVersion","alive","startedAt","command","cwd","version","origin","newest","newestSessionIds","session","isPidAlive","has","filterSessions","selector","input","trim","exact","filter","matchesSessionExactly","sessionSearchValues","some","value","length","normalized","toLowerCase","includes","sort","a","b","readFirstLine","handle","line","readLines","isSessionStartLine","startsWith","pending","chunk","createReadStream","encoding","index","indexOf","slice","formatSessionSelector","readLiveLine","live","signal","next","aborted","Promise","resolve","onAbort","addEventListener","once","then","removeEventListener","resetAbortTimer","timer","abort","timeout","clearTimeout","setAbortTimer","setTimeout","unref","String","argv","execPath","env","npmLifecycleEvent","npmPackageName","tryConnect","socketPath","socket","net","connect","cleanup","off","onConnect","onError","destroy","EventCapture","eventFilter","attached","done","events","waiters","constructor","this","compileEventFilter","spawnOptions","stdio","Array","isArray","process","LOG_EVENTS_ENV","debug","INTERNAL_DEBUG_ENV","attach","child","Error","stream","setEncoding","on","data","start","end","ingest","finish","notify","collect","event","Symbol","asyncIterator","parseEventLine","waiter","shift","captureEvents","detectRotationLoss","maxSegments","DEFAULT_SEGMENTS","open","first","close","resolveSession","activeSessions","map","tap","follow","since","parseSince","createTapAbortController","idleTimeout","AbortController","connectLive","resolveSocketPath","SESSION_FILES","liveSocket","connectWithRetry","attempt","rl","createInterface","buffer","closed","undefined","history","openHistoryFiles","handles","all","from","_","reverse","idleTimer","splice"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import n from "node:net";
|
|
|
6
6
|
|
|
7
7
|
import { createInterface as o } from "node:readline";
|
|
8
8
|
|
|
9
|
-
import { p as i, b as s,
|
|
9
|
+
import { p as i, b as s, t as r, e as a, a as c, u as l, v as u, j as f, w as d, S as h, s as m, h as p, g as w } from "./sessionSockets-chunk.mjs";
|
|
10
10
|
|
|
11
11
|
async function listSessions(n = {}) {
|
|
12
12
|
c();
|
|
@@ -330,13 +330,17 @@ class EventCapture {
|
|
|
330
330
|
}
|
|
331
331
|
this.#n = e.length;
|
|
332
332
|
e.push("pipe");
|
|
333
|
+
const n = {
|
|
334
|
+
...t?.env ?? process.env,
|
|
335
|
+
[p]: `${this.#n}`
|
|
336
|
+
};
|
|
337
|
+
if (!0 === this.#t.debug) {
|
|
338
|
+
n[w] = "1";
|
|
339
|
+
}
|
|
333
340
|
return {
|
|
334
341
|
...t,
|
|
335
342
|
stdio: e,
|
|
336
|
-
env:
|
|
337
|
-
...t?.env ?? process.env,
|
|
338
|
-
[p]: `${this.#n}`
|
|
339
|
-
}
|
|
343
|
+
env: n
|
|
340
344
|
};
|
|
341
345
|
}
|
|
342
346
|
attach(t) {
|